MySQL - 持久连接与连接池

标签 mysql multithreading database-connection

为了避免每次需要向 MySQL 发起查询时建立新连接的开销,有两个可用选项:

  1. 持久连接,即请求新连接,检查是否已打开“相同”连接,如果已打开,请使用它。
  2. 连接池,即客户端维护一个连接池,以便每个需要使用连接的线程从池中 check out 一个连接,并在完成后将其返回到池中。

所以,如果我有一个多线程服务器应用程序预计每秒处理数千个请求,并且每个线程都需要对数据库进行查询,那么有什么更好的选择?

据我了解,使用持久连接,我的应用程序中的所有线程都将尝试使用与数据库的相同持久连接,因为它们都使用相同的连接。所以它是一个跨多个应用程序线程共享的连接——因此请求将很快在数据库端阻塞。

如果我使用连接池机制,我将让所有应用程序线程共享一个连接池。因此阻塞请求的可能性较小。但是,对于连接池,应用程序线程应该等待从池中获取连接,还是应该以循环方式向池中的连接发送请求,并让队列(如果有)发生在数据库上?

最佳答案

拥有持久连接并不意味着所有线程都使用相同的连接。它只是“说”您保持连接打开(与每次需要连接时都打开连接相反)。打开连接是一项昂贵的操作,因此 - 通常 - 您尽量避免打开连接的次数过多。

这就是多线程应用程序经常使用连接池的原因。池负责打开和关闭连接,每个需要连接的线程都从池中请求一个。重要的是要注意线程尽快将连接返回到池中,以便另一个线程可以使用它。

如果您的应用程序只有几个需要连接的长时间运行的线程,您也可以为每个线程打开一个连接并保持打开状态。

仅使用一个连接(如您所描述的)等于最大大小为 1 的连接池。这迟早会成为您的瓶颈,因为所有线程都必须等待连接。这可能是序列化数据库操作的一个选项(按特定顺序执行它们),尽管有更好的选项来确保序列化。

关于MySQL - 持久连接与连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736188/

相关文章:

C++ 析构函数和 PTHREAD_CANCEL_ASYNCHRONOUS

java - Android/Java 重复按钮点击

winforms - 在 Visual C++ 中检查 MySql 连接是否打开

php - 如果在 php 中查询成功,如何提醒用户?

java - 使用两个不同的线程打印偶数和奇数

PHP:在MYSQL数据库中使用 boolean 变量进行逻辑的语法

.net - ibomma 400.1 提供程序未在本地计算机中注册

c# - 在一种形式中使用两个数据表

php - 检查mysql中上个月是否已经过去

php - 如何确保脚本在执行前完全执行?