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

Zar*_*jio 5 java mysql database mobile multithreading

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

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

  2. 服务器可能同时拥有数百个(或甚至数千个)这些查询.

  3. 由于每个查询都在自己的Thread中运行,因此每个查询至少需要自己的Statement(并且可以拥有自己的Connection).

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

a)从单个连接创建一个每个线程的语句是否可以安全线程?据我所知,只是寻找确认.

b)多线程是否有任何线程安全的方式来使用单个PreparedStatement?这些查询都将完全相同,并且由于每个线程只执行一个查询然后返回,这将是理想的.

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

d)最好是为所有这些使用存储的SQL过程吗?

我们非常感谢您对这些事项的任何提示/意见/建议.

编辑:

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

Per*_*ion 5

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

您需要在将访问数据库的每个线程中创建新的语句/准备语句,它们不是线程安全的.我强烈建议您使用Prepared Statements,因为您将获得效率并防止SQL注入攻击.

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

您是否考虑过缓存数据库数据?如果可以,请查看spymemcached,它是减少数据存储调用次数的绝佳产品.