postgres中有很多SHOW TRANSACTION ISOLATION LEVEL查询

时间:2016-02-02 06:42:05

标签: java postgresql hibernate c3p0

我正在使用Hibernate 4,PostgreSQL和C3P0。

在我的Web应用程序中,经过一段时间后,我在数据库中收到多个SHOW TRANSACTION ISOLATION LEVEL查询,因为我的服务器挂起了。在我的代码中,我的所有连接都已正确关闭。

是否由于连接泄漏?

5 个答案:

答案 0 :(得分:7)

您还应该检查每个查询的state,如果它idle它最有可能没有问题。

pg_stat_activity将显示每个打开的连接执行的最后一个查询。并且c3p0使用SHOW TRANSACTION ISOLATION LEVEL来保持连接打开(正常和预期的行为)。

这就是发生的事情:

  1. 连接已打开
  2. 执行
  3. SHOW TRANSACTION ISOLATION LEVEL以保持连接打开。
  4. 连接池将定期发送此查询(例如每10分钟)以保持连接打开。
  5. 这些查询显示在pg_stat_activity中,因为在某些情况下,这些是通过给定连接执行的最后一次查询。此外,它们将显示为idle,因为此连接未处于正在使用状态

答案 1 :(得分:5)

听起来你可能在连接池中的连接速度太快了。

这可能是因为您设置了过于激进的maxIdleTimemaxConnectionAge,或者因为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修复了该问题。