2012-11-29 37 views
3

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

我需要一个聪明和便宜的解决方案,我的问题:)你有什么建议?使用远程数据库(通过数据库托管)唯一的解决方案?

在此先感谢。

+0

您所做的请求是一个http GET请求。 POST可以向服务器发送更多数据(限制取决于服务器配置)。但是在android中创建POST与GET不同。 您可以尝试寻找http://www.androidsnippets.com/executing-a-http-post-request-with-httpclient –

+1

为什么不尝试将数据存储在数组()中的第一分钟?您将有时间在第二分钟内异步发送它们并继续存储您的新数据。 –

+0

我已经解决了这个问题:我在JSONObjects(lat,lon等)收集信息,然后在JSONArray中创建一个60秒数组的信息,在PHP端用HttpClient发送JSONArray,我用'代码'$ json = $ _REQUEST ['myjson'];然后用'code'解码$ locationInfo = json_decode($ json);然后遍历这些值并将它们写入到mysql中。用3G +连接完成需要大约3秒钟的时间。我会将代码上传到[github](https://github.com/tekinbeyaz/FollowMe),一旦我找出如何配置IntelliJ IDEA的github。非常感谢你。 –

回答

2

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

要了解更多的阿布JSON在Android中,看到http://www.vogella.com/articles/AndroidJSON/article.html

你怎么看待呢?

+1

是的,这是解决方案。非常感谢你。我试图在对我的问题发表评论时解释该方法。 –

+0

不客气。 –

2

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

+1

难道你不觉得PHP会话会比File I/O更好吗? – Shane

+0

+1对你有用的评论 –

+0

我对你对INSERT DELAYED的建议提出了一条评论,因为我从来没有听说过它,而且它看起来像是在正确的情况下很难使用的东西。非常好的建议。 – Shane

2

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

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

每次向服务器发送数据时,都会在POST请求中这样做。这是应该用于提交任何重要大小数据的请求,也意味着如果稍后需要这些数据,则可以使用TLS对数据进行加密。

+0

+1用于启动请求开销,本地缓冲区,POST请求和未来的TLS校对。非常好的建议在这里,我希望OP在开发他的应用时考虑到这些。 – Shane

+0

非常感谢您的警告。我在一分钟数组中缓冲信息。因为这一点,我一直在寻找一种能够一次发送多行数据的方法。如果我还没有找到一种方法来实现这一点,我想通过直接连接将它们逐个发送到远程数据库。希望我能在这个伟大的社区的帮助下解决它。 –

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" 
    } 
} 

S imilarly,如果你把方括号中的文字,你可以利用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 [伦敦] =经度& LOC1 [LAT =纬度& LOC2 [伦敦] =经度& 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") 

此外,请确保您的数据是正确的escaped。这可能会因您使用的数据库API而异。