0

在我的连接池过期后,当我尝试并行打开比池中允许的最大连接数更多的连接时,我在尝试从池中获取连接时开始出现超时异常。

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

我正在使用带有 jdbc 驱动程序的 Play 1.2.5 到 mysql,从日志中我认为池是 C3P0。

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

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

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

4

1 回答 1

2

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

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

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

TL;DR:当您完成连接时,请始终调用close()您的连接,无论它来自连接池、非池化DataSource还是DriverManager.

于 2013-01-17T16:51:59.677 回答