所以,这是交易。 我正在开发一个Android应用程序(虽然它可以像任何其他移动平台一样容易)偶尔会向服务器发送查询(编写的是Java)。然后,该服务器将在MySQL数据库中搜索查询,并将结果发送回Android。虽然这听起来相当通用,但这里有一些细节:
每次查询时,Android都会与服务器建立新的TCP连接。服务器在地理位置上很接近,Android可能会移动很多,而且,由于Android应用程序可能只运行几个小时而只发送一些查询,这似乎是资源的最佳利用。
服务器可能会同时拥有数百个(甚至可能是数千个)这些查询。
由于每个查询都在自己的Thread中运行,因此每个查询至少需要自己的Statement(并且可以有自己的Connection)。
现在,服务器设置为与数据库建立一个连接,然后为每个查询创建一个新的Statement。对于那些具有一定数据库经验的人(特别是MySQL,因为它是一个MySQL数据库),我的问题是:
a)从单个连接创建一个每个线程的语句是否安全?据我所知,只是寻找确认。
b)多线程是否有任何线程安全的方式来使用单个PreparedStatement?这些查询将完全相同,并且由于每个线程只执行一个查询然后返回,这将是理想的。
c)我应该为每个线程创建一个新的连接,还是从单个连接中生成新的语句更好?我认为单个Connection在性能方面会更好,但我不知道建立数据库连接的开销是多少。
d)最好是为所有这些使用存储的SQL程序吗?
非常感谢您对这些事项的任何提示/意见/建议。
编辑:
为了澄清,android通过网络向服务器发送查询,然后服务器查询数据库。 android不直接与数据库通信。我主要想知道服务器 - 数据库连接的最佳实践。
答案 0 :(得分:5)
仅仅因为Connection对象是线程安全的并不意味着它的线程有效。您应该使用连接池作为最佳做法,以避免潜在的阻塞问题。但是在回答你的问题时,是的,你可以在多个线程之间共享一个Connection对象。
您需要在将要访问数据库的每个线程中创建新的语句/准备语句,它们不是线程安全的。我强烈建议您使用Prepared Statements,因为您将获得效率并防止SQL注入攻击。
存储过程将加速您的数据库查询,因为已经编译并保存了执行计划 - 强烈建议您尽可能使用。
您是否考虑过缓存数据库数据?如果可以,请查看spymemcached,它是减少数据存储调用次数的绝佳产品。
答案 1 :(得分:2)
根据我的经验,您应该花一点时间将数据库包装在Web服务中。这完成了两件事:
更多的开发时间,但通过开放网络(Internet)直接连接到数据库比指定通过方法可以访问的内容更有问题。
答案 2 :(得分:1)
使用Commons DBCP等连接池。它将处理所有你担心的东西,开箱即用。