C3P0.properties 上设置了多少个连接
There are many connections that how many set on C3P0.properties
我正在尝试使用 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 的工作方式
我在线程和连接的 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
中的值要么是 FOREGROUND
要么是 BACKGROUND
所以这告诉你可以有一些线程与数据库连接来做一些事情(背景)工作(例如事件线程、监视器线程等)。
通常,c3p0 关注连接而不是线程,因此您应该检查 SHOW FULL PROCESSLIST
与数据库服务器的连接。
我希望我已经消除了您对 MySQL 线程和连接的困惑。
我正在尝试使用 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 的工作方式
我在线程和连接的 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
中的值要么是 FOREGROUND
要么是 BACKGROUND
所以这告诉你可以有一些线程与数据库连接来做一些事情(背景)工作(例如事件线程、监视器线程等)。
通常,c3p0 关注连接而不是线程,因此您应该检查 SHOW FULL PROCESSLIST
与数据库服务器的连接。
我希望我已经消除了您对 MySQL 线程和连接的困惑。