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

5
所以,这是交易。 我正在开发一个Android应用程序(尽管它也可以是任何其他移动平台),该应用程序偶尔会向服务器发送查询(该服务器是用Java编写的)。然后,该服务器将在MySQL数据库中搜索查询,并将结果发送回Android。虽然听起来相当通用,但以下是一些具体内容:
1.每次查询时,Android都会与服务器建立新的TCP连接。服务器地理位置接近,Android可能会频繁移动,而且由于Android应用程序可能运行数小时,而只发送少量查询,因此这似乎是最好的资源利用方式。
2.服务器可能同时拥有数百个(甚至可能是数千个)这些查询。
3.由于每个查询都在其自己的线程中运行,因此每个查询至少需要自己的语句(并且可能具有自己的连接)。
现在,服务器已设置为对数据库进行一次连接,然后为每个查询创建一个新的语句。我的问题是针对那些具有一些数据库经验(特别是MySQL,因为它是MySQL数据库)的人:
a)从单个连接为每个线程创建一个语句是否线程安全?据我所知,这是线程安全的,只是寻找确认。
b)有没有线程安全的方法让多个线程使用单个PreparedStatement?这些查询几乎全部相同,由于每个线程仅执行一个查询,然后返回,因此这将是理想的。
c)我应该为每个线程创建一个新连接,还是最好从单个连接生成新语句?我认为单个连接在性能方面更好,但我不知道建立DB连接的开销是多少。
d)使用存储的SQL过程是否最佳?
非常感谢您在这些问题上的经验中提供的任何提示/评论/建议。
编辑:
请澄清一下,Android通过网络向服务器发送查询,然后服务器查询数据库。 Android不直接与数据库通信。 我主要想知道这里的服务器-数据库连接的最佳实践。
3个回答

5

即使Connection对象是线程安全的,也不意味着它是高效的。为了避免潜在的阻塞问题,最好使用连接池。但回答你的问题,是的,你可以在多个线程之间共享一个Connection对象。

对于将要访问数据库的每个线程,您确实需要创建新的Statement / Prepared Statement,它们不是线程安全的。强烈建议使用Prepared Statements,因为您将获得更高的效率和保护免受SQL注入攻击。

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

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


2

根据我的经验,你应该花一点时间将数据库封装在Web服务中。这样可以实现两个目标:

  1. 强制你对数据进行更广泛的审查
  2. 使新用户更容易使用数据

虽然需要更多的开发时间,但通过开放网络(互联网)直接连接数据库比指定通过Web服务方法访问数据更加有问题。


有一个运行Java的服务器正在访问数据库。我的问题主要涉及该服务器如何访问数据库。 - Zarjio

1

使用连接池,例如Commons DBCP。它会处理你所担心的所有问题,开箱即用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接