数据库连接池已过期,那又怎样?

时间:2013-01-17 16:35:30

标签: mysql jdbc playframework connection-pooling c3p0

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

然而,预计这个池似乎处于该状态,从那时起我所做的其他事情都会获得相同的超时异常。好像池中的每个连接都处于繁忙状态,并且无法重用。我希望连接随着时间的推移而被释放,然后允许其他连接,但这不会发生。

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

我没有明确关闭连接,因为我认为在使用池时这是正确的做法,但我不是百分百肯定。

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

当我发现其中一个超时异常时,做什么是正确的?

1 个答案:

答案 0 :(得分:2)

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

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

某些高级池配置允许池检测到这种情况(例如使用超时,或者使用终结器等)并回收连接,但是依赖于此。

TL; DR:完成后,请始终在连接上调用close(),无论是来自连接池,非池DataSource还是{ {1}}。