在 pg_stat_activity 中具有 'idle' 状态的持久 'COMMIT' 查询
Long lasting 'COMMIT' queries with 'idle' state in pg_stat_activity
如果我查询:
select * from pg_stat_activity where application_name ~ 'example-application';
我得到许多状态为 idle
且查询为 COMMIT
的行。它们持久耐用,不会消失。一段时间后,我的应用程序达到 hibernate.c3p0.max_size
(池中 JDBC 连接的最大数量)限制并停止使用数据库。
其他 SO 线程中描述了一些应用程序实现细节:
为什么会这样?如何解决这个问题呢?
如果会话是 "idle",则查询列显示连接已执行的 last 语句。它是 not "current" 查询,因此连接是 not 等待提交完成。
如果 status
显示 active
.
,query
列仅显示 current 语句
一个 "idle" 连接 不是问题 并且本质上是使用连接池的原因,以便可以重新使用它。但是,在 "idle in transaction" 中保持很长时间的会话是 的问题。但是您说您的连接处于 "idle" 状态。
如果您的连接池达到限制,这很可能意味着您的应用程序没有正确地将连接返回到池中。这是您需要在应用程序中修复的问题。
如果我查询:
select * from pg_stat_activity where application_name ~ 'example-application';
我得到许多状态为 idle
且查询为 COMMIT
的行。它们持久耐用,不会消失。一段时间后,我的应用程序达到 hibernate.c3p0.max_size
(池中 JDBC 连接的最大数量)限制并停止使用数据库。
其他 SO 线程中描述了一些应用程序实现细节:
为什么会这样?如何解决这个问题呢?
如果会话是 "idle",则查询列显示连接已执行的 last 语句。它是 not "current" 查询,因此连接是 not 等待提交完成。
如果 status
显示 active
.
query
列仅显示 current 语句
一个 "idle" 连接 不是问题 并且本质上是使用连接池的原因,以便可以重新使用它。但是,在 "idle in transaction" 中保持很长时间的会话是 的问题。但是您说您的连接处于 "idle" 状态。
如果您的连接池达到限制,这很可能意味着您的应用程序没有正确地将连接返回到池中。这是您需要在应用程序中修复的问题。