Java—C3P0持有的连接数与MySQL中的休眠连接数不匹配

Java—C3P0持有的连接数与MySQL中的休眠连接数不匹配,java,mysql,jdbc,connection-pooling,c3p0,Java,Mysql,Jdbc,Connection Pooling,C3p0,好吧,下面是一个场景: 我使用Java,我有一个集中的类来连接和断开与数据库的连接。我已将ComboPooledDataSource的最大池大小设置为30(cpds.setMaxPoolSize(30)),没有特殊原因。MySQL的time\u wait配置设置为100秒 我的问题是: 当运行我的程序并将其日志与MySQL中生成的日志进行比较时,我可以清楚地看到MySQL正在做它应该做的事情:在100秒后关闭休眠连接(正是我的程序创建的)。但是在MySQL中关闭的相同连接在我的C3P0连接池中似

好吧,下面是一个场景:

我使用Java,我有一个集中的类来连接和断开与数据库的连接。我已将ComboPooledDataSource的最大池大小设置为30(
cpds.setMaxPoolSize(30)
),没有特殊原因。MySQL的
time\u wait
配置设置为100秒

我的问题是:

当运行我的程序并将其日志与MySQL中生成的日志进行比较时,我可以清楚地看到MySQL正在做它应该做的事情:在100秒后关闭休眠连接(正是我的程序创建的)。但是在MySQL中关闭的相同连接在我的C3P0连接池中似乎仍然存在,因为连接的数量只会增加(每次使用
cpds.getNumConnections()
需要新连接时,我都会测试它)


有没有办法清理c3p0中未使用的连接(MySQL中关闭的连接)?因为我的最大连接数即将达到(200秒-300秒)。MySQL关闭的连接在c3p0中不会自动关闭?

c3p0提供了许多超时参数。有关详细信息,请查看他们的文档:


特别是关于“管理池大小和连接时间”的部分,您会感兴趣。下面是一些可以调整的设置:maxConnectionAge、maxIdleTime、maxIdleTimeExcessConnections

MySQL没有
time\u wait
参数
time\u wait
是TCP连接的一种状态

如果您将
wait\u timeout
设置为100(覆盖其默认值28800),则是自找麻烦。像c3p0这样的连接池的全部要点是保持连接打开,以便可以重用它们

当DBMS通过连接测试从其下方关闭连接时,c3p0可以检测和观察。看

如果您真的希望MySQL在100秒后终止连接,并且希望c3p0注意到这一点,那么可以将c3p0的
idleConnectionTestPeriod
设置为30,c3p0将快速检测并处理死连接。但是,当连接数低于
minPoolSize
时,它将重新创建死掉的连接,而您的应用程序将无效地搅动。更好的方法是保持MySQL的
wait\u timeout
较大,并使用
maxPoolSize
控制打开的连接数

(但您仍然需要配置某种形式的连接测试,几乎总是这样。)