3

我的问题是,我每秒跟踪用户的位置,它在一分钟内在一个数组中生成 60 个值。我在我的服务器中编写了一个简单的 php 来将数据保存到 mysql 表中。由于连接的性质(据我所知),我可以在 android 端使用简单的 httppost 对象为每个请求保存一条记录。(请求类似于:xxx.com/writelocation.php?lat=33.76&lon=45.0 &alt=12000) 我试图通过使用 asynctask 来解决这个问题,但它没有用。连接速度慢,数据量大。连接完成需要一秒钟多的时间,每秒钟都有一条新记录出现。我正在寻找一种方法,每分钟左右一次发送多个值。到目前为止,除了使用直接访问远程数据库之外,我找不到其他解决方案。但是我的主机不提供对我的 mysql 数据库的远程访问。

我需要一个聪明而廉价的解决方案来解决我的问题:) 你有什么建议?仅使用远程数据库(通过数据库托管)解决方案吗?

提前致谢。

4

4 回答 4

3

PHP

使用 PHP 可以构造一个多维 POST/GET 数组,如下所示:

(假设这是查询字符串的一部分)
id[]=1&id[]=2&id[]=3

产生:

array(1) {
   "ID" => array(3) {
       [1] => string(1) "1"
       [2] => string(1) "2"
       [3] => string(1) "3"
   }
}

同样,如果将文本放在方括号之间,则可以利用 PHP 的关联数组功能:

form[fName]=John&form[lName]=Doe&form[age]=20

生产

array(1) {
   "form" => array(3) {
       ["fName"] => string(4) "John"
       ["lName"] => string(3) "Doe"
       ["age"]   => string(2) "20"
   }
}

不用说,这适用于 POST 和 GET。您可以在您的应用程序中使用它,如下所示:

loc1[lon]=经度&loc1[lat]=纬度&loc2[lon]=经度&loc2[lat]=纬度

所以你得到:

array(2) {
   "loc1" => array(2) {
       "longitude" => string(9) "longitude"
       "latitude"  => string(8) "latitude"
   }
   "loc2" => array(2) {
       "longitude" => string(9) "longitude"
       "latitude"  => string(3) "latitude"
   }
}



MySQL

只是一个旁注:您可以一次插入所有数据并获得一些速度优势,而不是运行多个插入查询。例如。

INSERT INTO `users` ( `fName`, `lName`, `age` ) VALUES ( "John", "Doe", "20" ),( "John", "Citizen", "42" )

在上面,我们插入了两行数据......

( "John", "Doe", "20" )
( "John", "Citizen", "20" )

此外,请确保您的数据已正确转义。这可能因您使用的数据库 API 而异。

于 2012-11-29T14:23:59.773 回答
2

Json 编码速度非常快,带宽消耗非常小。我建议您使用 json 发送这些数据,然后在服务器端解析 json 并将数据插入数据库中。

要了解更多关于 android 中的 json,请参阅http://www.vogella.com/articles/AndroidJSON/article.html

你有什么想法 ?

于 2012-11-29T13:49:31.410 回答
2

使用 INSERT DELAYED 而不是 INSERT。对于这种情况,MySQL 也不是一个真正可扩展的解决方案,也许最好使用 MongoSQL 来处理这么多的请求。您还可以将服务器上的请求保存为文本文件,并每隔几秒或几分钟批量运行查询

于 2012-11-29T13:51:13.157 回答
2

试图每秒发送每个新位置是一个基本的设计缺陷,我建议避免这种策略,因为您无法保证移动设备的网络可用性和延迟。

这样做的方法是在本地缓冲数据,并以块的形式将其提交给服务器。例如,收集十分钟的数据并一次性发送。请记住,除了您已经发现的网络延迟限制之外,建立然后断开连接还会产生网络开销和电池寿命影响。因此,出于许多原因,最好在本地缓冲数据并在合理的间隔后发送缓冲区。

每次将数据发送到服务器时,请在 POST 请求中执行此操作。这种请求应该用于提交任何显着大小的数据,这也意味着如果您以后需要,可以使用 TLS 对数据进行加密。

于 2012-11-29T14:02:39.200 回答