C3P0.properties上有许多连接设置

时间:2018-09-14 07:31:32

标签: mysql spring c3p0

我正在尝试使用 C3P0 库来处理连接池。 这些是我的C3P0设置:

minPoolSize=3
maxPoolSize=20
acquireIncrement=1
maxIdleTime=240
maxStatements=20

在日志中,我可以看到C3P0似乎通过读取正确初始化了

INFO com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool...

但是当我尝试查看时,我的MySQL数据库上有多少个连接

SHOW STATUS WHERE `variable_name` = 'Threads_connected'

我看到结果是48、46、49 ecc。

我无法理解尝试查看数据库上有多少连接的方式是否不正确,或者我不了解C3P0的工作方式

1 个答案:

答案 0 :(得分:1)

我在MySQL中也面临线程和连接的混乱。我将解释我在学习的过程中所学到的知识和掌握的知识,如果我当时误解了或仍感到困惑,请纠正我的观点。

MySQL的一些基本知识:

- MySQL server is a single process application.
- It is multithreaded.
- It accepts connections like TCP/IP server.
- Each connection gets a thread.
- These threads are sometimes named processes, and sometimes they're referred to as connections.

最后一点和倒数第二点非常令人困惑,在我们看来,我们认为连接和活动线程之间存在1-1映射。确实如此,但是有一个线程池这意味着可能存在不与任何连接关联的线程

每个新连接都有其自己的线程。每个新的连接都会产生新的线程,而断开连接会破坏线程。因此,连接和活动线程之间存在1-1映射。销毁线程后,它可能会进入线程池。因此,线程数大于或等于连接数。

此外,如果您在查询下面运行

SELECT t.PROCESSLIST_ID,IF (NAME = 'thread/sql/event_scheduler','event_scheduler',t.PROCESSLIST_USER) PROCESSLIST_USER,t.PROCESSLIST_HOST,t.PROCESSLIST_DB,t.PROCESSLIST_COMMAND,t.PROCESSLIST_TIME,t.PROCESSLIST_STATE,t.THREAD_ID,t.TYPE,t.NAME,t.PARENT_THREAD_ID,t.INSTRUMENTED,t.PROCESSLIST_INFO,a.ATTR_VALUE FROM performance_schema.threads t  LEFT OUTER JOIN performance_schema.session_connect_attrs a ON t.processlist_id = a.processlist_id AND (a.attr_name IS NULL OR a.attr_name = 'program_name') WHERE 1=1

然后您将看到列TYPE中的值是FOREGROUNDBACKGROUND,因此这表明可以有一些与DB连接的线程可以完成某些(后台)工作(例如事件线程,监视线程等。

c3p0通常关注连接而不是线程,因此您应检查SHOW FULL PROCESSLIST与数据库服务器的连接。

我希望我消除了您对MySQL线程和连接的困惑。