MySQL - 持久连接与连接池

时间:2012-03-16 11:09:04

标签: mysql multithreading database-connection

为了避免每次查询需要针对MySQL触发时建立新连接的开销,有两种选择:

  1. 持久连接,请求新连接进行检查以查看“相同”连接是否已打开,如果是,则使用它。
  2. 连接池,客户端维护连接池,以便需要使用连接的每个线程将从池中检出一个并在完成后将其返回池中。
  3. 因此,如果我有一个多线程服务器应用程序,预计每秒处理数千个请求,并且每个线程需要针对数据库触发查询,那么什么是更好的选择?

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

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

2 个答案:

答案 0 :(得分:24)

拥有持久连接并不意味着所有线程都使用相同的连接。它只是“说”你保持连接打开(与每次需要时打开连接相矛盾)。打开连接是一项昂贵的操作,因此 - 通常情况下 - 您会尝试避免更频繁地打开连接。

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

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

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

答案 1 :(得分:17)

关于应用程序服务器是否应该等待连接的问题,答案是肯定的。

MySQL连接阻塞。当您通过连接从MySQL服务器发出请求时,连接将等待,空闲,直到从服务器收到响应。

无法在同一连接上发送两个请求,并查看首先返回的请求。您一次只能发送一个请求。

因此,通常,连接池中的单个线程包含一个客户端连接(在您的情况下,应用程序服务器是客户端)和一个服务器端连接(数据库)。

您的应用程序应该等待来自池的可用连接线程,允许池在需要时增长,并且当它不太忙时缩小回默认线程数。