PostgreSQL 9.3 事务空闲
PostgreSQL 9.3 idle in transaction
在我们的产品中,有时会出现数据库被 idle in transaction
连接锁定的情况。
我正在使用 postgresql-9.3(9.4),java 通过 jdbc 驱动程序连接。
所有连接都设置为自动提交。
问题只能通过SELECT pg_terminate_backend(PID)
解决。我不喜欢这样的决定,但重启服务是唯一可行的方法。
所以有一个疑问,在我不手动操作交易的情况下,如何解决这样的问题。所有与 Postgres 的连接都是本地的,所以我认为这不是网络问题。
更新
好的,毫无疑问 - 存在应用程序错误。
想象一下,我们有一个查询:
try(PreparedStatement statement=connection.prepareStatement("update table1 set some_field=1 where id=2")){
statement.executeUpdate();
}
如此简单的本地连接查询。连接处于活动状态。自动提交是真的。这种连接应该发生什么问题 idle in transaction
?
更新
感谢大家的关注。通过将 jdbc-驱动程序更改为最新版本解决了该问题。
长时间保持 idle in transaction
状态的交易是应用程序错误,但您可能已经意识到这一点。
该问题的一个权宜之计“解决方案”是将 idle_in_transaction_session_timeout
设置为非零值。这个参数从9.6开始可用,这给了你一个尽快升级到最新版本的绝佳理由。
感谢大家的关注。通过将 jdbc-驱动程序更改为最新版本解决了该问题。
在我们的产品中,有时会出现数据库被 idle in transaction
连接锁定的情况。
我正在使用 postgresql-9.3(9.4),java 通过 jdbc 驱动程序连接。
所有连接都设置为自动提交。
问题只能通过SELECT pg_terminate_backend(PID)
解决。我不喜欢这样的决定,但重启服务是唯一可行的方法。
所以有一个疑问,在我不手动操作交易的情况下,如何解决这样的问题。所有与 Postgres 的连接都是本地的,所以我认为这不是网络问题。
更新 好的,毫无疑问 - 存在应用程序错误。
想象一下,我们有一个查询:
try(PreparedStatement statement=connection.prepareStatement("update table1 set some_field=1 where id=2")){
statement.executeUpdate();
}
如此简单的本地连接查询。连接处于活动状态。自动提交是真的。这种连接应该发生什么问题 idle in transaction
?
更新 感谢大家的关注。通过将 jdbc-驱动程序更改为最新版本解决了该问题。
长时间保持 idle in transaction
状态的交易是应用程序错误,但您可能已经意识到这一点。
该问题的一个权宜之计“解决方案”是将 idle_in_transaction_session_timeout
设置为非零值。这个参数从9.6开始可用,这给了你一个尽快升级到最新版本的绝佳理由。
感谢大家的关注。通过将 jdbc-驱动程序更改为最新版本解决了该问题。