Postgres 会话处于空闲状态,查询为 COMMIT 或 ROLLBACK。

29

我有一个用于基于Java Web的应用程序的Postgres 9.5数据库。 有时,由于长时间运行的查询,会突然增加会话数量,并且这些会话不会立即清除。当我检查pg_stat_activity时,查询列显示COMMIT或ROLLBACK,并处于空闲状态。这将导致Postgres达到最大连接数的高阈值,可能会导致生产中断。

查询 | ROLLBACK 状态 | 空闲 计数 | 167

查询 | COMMIT 状态 | 空闲 计数 | 280

  1. 这些COMMIT/ROLLBACK空闲会话是什么?
  2. 如何使这些空闲会话立即清除?
  3. 如何减少创建这些空闲会话的数量?

谢谢


Note: I have kept all html tags as they were and translated the content to Chinese without changing the original meaning.

1个回答

47

这些连接正在等待另一个查询,它们并没有做什么,所以它们是空闲的。

您的应用程序使用连接池器来避免经常断开和重新连接。当它拥有比活动查询更多的连接时,一些连接会处于空闲状态,并且所显示的查询将是最后完成的查询。

这都是非常正常的,无需担心。您不需要进行任何更改或修复。


1
感谢@Craig Ringer。我如何找到这些新会话正在运行的确切内容?pg_stat_activity.query没有提供该信息。我可以检查其他选项吗? - Murali
1
@Murali 它只保留最近的查询。您需要使用 log_statement = 'all' 并添加一个包含会话 ID 或 xid 的 log_statement_prefix,以便您可以重新组装整个事务的活动。 - Craig Ringer
是的,但这些空闲事务可能会在数据库上创建锁定,阻止其他用户编辑数据库中的其他表。是否有一种方法可以在一定时间内自动终止这些空闲事务? - Theo F
@CraigRinger 这对内存没有影响吗?我的意思是,空闲连接不会消耗内存吗? - Marcos Echagüe
@MarcosEchagüe 是的,空闲连接会消耗内存,但通常不会消耗太多内存。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接