数百个移动客户端访问MySQL数据库的最佳方式是什么



所以,这是交易。我正在开发一个Android应用程序(尽管它可以像任何其他移动平台一样轻松),偶尔会向服务器发送查询(它是用Java编写的)。然后,该服务器将在MySQL数据库中搜索查询,并将结果发送回Android。虽然这听起来很普通,但这里有一些细节:

  1. Android每次查询时都会与服务器建立新的TCP连接。服务器的地理位置很近,安卓系统可能会移动很多,而且,由于安卓应用程序可能会运行数小时,而只发送几个查询,这似乎是对资源的最佳利用。

  2. 服务器可能同时有数百(甚至数千)个这样的查询。

  3. 由于每个查询都在自己的线程中运行,所以每个查询至少需要自己的语句(并且可以有自己的连接)。

现在,服务器设置为与数据库建立一个连接,然后为每个查询创建一个新的语句。对于那些有数据库经验的人(特别是MySQL,因为它是MySQL数据库),我的问题是:

a) 从单个连接为每个线程创建一个语句是否线程安全?据我所知,只是在寻求确认。

b) 对于多个线程使用单个PreparedStatement,有什么线程安全的方法吗?这些查询将几乎完全相同,并且由于每个线程只执行一个查询然后返回,因此这将是理想的。

c) 我应该为每个线程创建一个新的连接,还是从单个连接生成新的语句更好?我认为单个连接在性能方面会更好,但我不知道建立DB连接的开销是多少

d) 是否最好使用存储SQL过程来实现这一切?

非常感谢您在这些事情上的任何提示/意见/建议。

编辑:

为了澄清,android通过网络向服务器发送查询,然后服务器查询数据库。android不直接与数据库通信。我主要想知道服务器数据库连接的最佳实践。

Connection对象是线程安全的并不意味着它具有线程效率。您应该使用连接池作为最佳实践,以避免潜在的阻塞问题。但在回答您的问题时,是的,您可以在多个线程之间共享一个Connection对象。

您确实需要在访问数据库的每个线程中创建一个新的Statements/Reprepared Statements,它们不是线程安全的。我强烈建议您使用Prepared Statements,因为这样可以提高效率并防止SQL注入攻击。

存储过程将加快数据库查询的速度,因为执行计划已经编译并保存——如果可以的话,强烈建议您使用。

您是否考虑过缓存数据库数据?如果可以的话,看看spymemcached,它是减少对数据存储调用次数的好产品。

根据我的经验,您应该花一点时间将数据库封装在web服务中。这完成了两件事:

  1. 你被迫检查数据以了解更广泛的消费
  2. 您使新消费者更容易使用数据

开发时间稍长,但通过开放网络(Internet)直接连接到数据库比指定可以通过方法访问的内容更成问题。

使用连接池,如Commons DBCP。它可以开箱即用地处理所有你担心的事情。

最新更新