我的连接池到期后,当我尝试并行打开比池中允许的最大连接数更多的连接时,我尝试从池中获取连接时开始获取超时异常。
然而,预计这个池似乎处于该状态,从那时起我所做的其他事情都会获得相同的超时异常。好像池中的每个连接都处于繁忙状态,并且无法重用。我希望连接随着时间的推移而被释放,然后允许其他连接,但这不会发生。
我正在使用带有jdbc驱动程序的Play 1.2.5到mysql,从日志中我认为该池是C3P0。
我没有明确关闭连接,因为我认为在使用池时这是正确的做法,但我不是百分百肯定。
我不知道这可能是我正在使用的一个框架/库中的连接泄漏,或者我做错了什么或者没做我应该做的事情。
当我发现其中一个超时异常时,做什么是正确的?
答案 0 :(得分:2)
使用连接池时,必须显式关闭连接。连接池具有到数据库的物理连接的集合。当您从池请求连接时,它会将该物理连接标记为 in-use ,并为您提供该连接的逻辑句柄。这个逻辑句柄本质上是一个包装器或代理,它将大多数方法调用(直接或通过一些修改)转发到物理连接。
当您在此逻辑句柄上调用close()
时,连接池会再次收到物理连接可用的信号(即:可以返回到池中),逻辑从那时起句柄将表现为一个封闭的连接,但实际的物理连接仍然是打开的。如果您不调用close()
,则连接池永远不会收到此信号,因此物理连接将保持正在使用中,并且无法重复使用。
某些高级池配置允许池检测到这种情况(例如使用超时,或者使用终结器等)并回收连接,但是不依赖于此。
TL; DR:完成后,请始终在连接上调用close()
,无论是来自连接池,非池DataSource
还是{ {1}}。