Mysql 数据库连接池已过期,然后呢?

Mysql 数据库连接池已过期,然后呢?,mysql,jdbc,playframework,connection-pooling,c3p0,Mysql,Jdbc,Playframework,Connection Pooling,C3p0,连接池过期后,当我尝试并行打开的连接数超过池中允许的最大连接数时,当我尝试从池中获取连接时,就会出现超时异常 然而,这是意料之中的,池似乎处于那种状态,自那一刻起我所做的一切都会得到相同的超时异常。好像池中的每个连接都处于繁忙状态,无法重用。我希望随着时间的推移,连接被释放,然后其他连接被允许,但这并没有发生 我正在使用Play1.2.5和一个到mysql的jdbc驱动程序,从日志中我估计池是C3P0 我没有明确地关闭连接,因为我认为在使用池时这样做是正确的,但我不是100%确定 我不知道这是否

连接池过期后,当我尝试并行打开的连接数超过池中允许的最大连接数时,当我尝试从池中获取连接时,就会出现超时异常

然而,这是意料之中的,池似乎处于那种状态,自那一刻起我所做的一切都会得到相同的超时异常。好像池中的每个连接都处于繁忙状态,无法重用。我希望随着时间的推移,连接被释放,然后其他连接被允许,但这并没有发生

我正在使用Play1.2.5和一个到mysql的jdbc驱动程序,从日志中我估计池是C3P0

我没有明确地关闭连接,因为我认为在使用池时这样做是正确的,但我不是100%确定

我不知道这是否可能是我正在使用的某个框架/库中的连接泄漏,或者是我做错了什么或者没有做我应该做的事情


当我捕获其中一个超时异常时,正确的做法是什么?

使用连接池时,您必须显式地关闭连接。连接池具有到数据库的物理连接的集合。当您从池中请求连接时,它会将该物理连接标记为正在使用,并将该连接的逻辑句柄交给您。这个逻辑句柄本质上是一个包装器或代理,它将大多数方法调用(直接或经过一些修改)转发到物理连接

当您在此逻辑句柄上调用
close()
时,连接池会收到一个信号,表明物理连接再次可用(即:可以返回到池),从那时起,逻辑句柄将表现为关闭的连接,但实际的物理连接仍然打开。如果不调用
close()
,连接池将永远不会收到此信号,因此物理连接将保持使用状态,无法重复使用

一些高级池配置允许池检测这种情况(例如使用超时,或者使用终结器等)并回收连接,但是您应该而不是


TL;DR:在完成连接后,始终对连接调用
close()
,无论它来自连接池、非池
数据源
还是
DriverManager

当我的最大连接数为10时,我使用了超过10个连接(尽管不是并行连接),应用程序运行时没有问题,因此,没有显式关闭它们,它们被重用了。也许你提到的那个暂停?我一开始是关闭连接的,但这给我带来了问题,例外情况是我试图使用已关闭的连接。@palako如果您同时实际需要的连接数超过了最大连接数,那么在连接可用之前,出现错误或被阻止是合乎逻辑的(取决于池配置)。尽快关闭连接应该会缓解这一问题,因为物理连接比池必须检测到的时间更早可用。如果现在关闭时出现错误,则池不符合JDBC规范,因为池连接的外观和行为应该与正常连接类似(包括
close()
的行为)我想我把一些概念搞乱了。我现在正在整理我的代码,关闭resultSets和PreparedStatements,但不关闭连接,目前正在工作,但尚未完成,我想尝试关闭连接,从中学习一些东西。