我正在使用Hibernate 4,PostgreSQL和C3P0。
在我的Web应用程序中,经过一段时间后,我在数据库中收到多个SHOW TRANSACTION ISOLATION LEVEL
查询,因为我的服务器挂起了。在我的代码中,我的所有连接都已正确关闭。
是否由于连接泄漏?
答案 0 :(得分:7)
您还应该检查每个查询的state
,如果它idle
它最有可能没有问题。
pg_stat_activity
将显示每个打开的连接执行的最后一个查询。并且c3p0使用SHOW TRANSACTION ISOLATION LEVEL
来保持连接打开(正常和预期的行为)。
这就是发生的事情:
SHOW TRANSACTION ISOLATION LEVEL
以保持连接打开。pg_stat_activity
中,因为在某些情况下,这些是通过给定连接执行的最后一次查询。此外,它们将显示为idle
,因为此连接未处于正在使用状态答案 1 :(得分:5)
听起来你可能在连接池中的连接速度太快了。
这可能是因为您设置了过于激进的maxIdleTime
或maxConnectionAge
,或者因为Connections连接测试失败并被逐出,或者因为您的应用程序错误地重建了池,因为它要求连接而不是而不是持有和使用稳定的游泳池。 (这是一个非常糟糕但令人惊讶的常见错误。)
c3p0检查每个连接获取的连接隔离级别一次。由于获取的Connections应该在池中具有较长的生命周期,因此其摊销开销可以忽略不计。
但是,如果由于某些配置问题或错误,您的应用程序让c3p0不断获取Connections,每个客户端一个或者如果您为每个客户端重建池更糟糕,那么事务隔离检查可能会成为一个可见的症状。更糟糕的潜在问题。
答案 2 :(得分:0)
数据库中存在多个SHOW TRANSACTION ISOLATION LEVEL查询,导致我的服务器挂起。
由于多次查询,您的服务器挂起真的很难(我会说不可能)。如果您的服务器挂起,您应该检查您的配置,并且您正在使用适用于您的最新版本。
每次应用程序调用Connection.getTransactionIsolation()时都会执行 SHOW TRANSACTION ISOLATION LEVEL
,每次创建连接时,C3P0都会调用getTransactionIsolation()。
如果连接池正在创建并销毁大量连接,则最终会向数据库发送SHOW TRANSACTION ISOLATION LEVEL
的许多查询,因为PgJDBC驱动程序每次调用getTransactionIsolation()都会执行查询。
答案 3 :(得分:0)
在c3p0
中将checkin和checkout上的Test连接更改为false答案 4 :(得分:0)
我看到了同样的问题。当使用更高的postgress版本时,似乎会发生这种情况。我通过升级postgress驱动程序42.2.6修复了该问题。