长时间运行的 READ 查询陷入“事务中空闲”状态

Ant*_*ony 5 postgresql performance postgresql-performance

我在 Web API 中有一个 JDBC 连接池,它经常向 RDS 实例发出请求。每个请求都是针对长时间运行的 SQL 查询,其中 PG 决定不使用索引,因为要返回的数据量非常大。

我注意到其中一些长时间运行的查询只是停留在 state idle in transaction。当在表中查找pid这些进程时pg_locks,它们有 152 行。带模式AccessShareLock

该表的目的是永远不会更新——它充当时间表中的一个点。所以我认为不需要idle transactionor accesssharelock。我是否可以关闭这些功能,以便我的查询运行得更快并且不会因为AccessShareLock?

小智 9

idle in transaction意味着连接没有执行任何操作 - 它处于“空闲”状态。

查询已完成,如果查询仍在运行,连接将显示为active

发起查询的代码忘记通过调用提交或回滚来结束事务。如果连接长时间处于“事务中空闲”状态,这通常是应用程序中的错误。

确保您的应用程序正确结束每个事务 - 即使是仅运行 SELECT 语句的“只读”事务。或者将您的连接切换为在代码中自动提交。