在我的数据库负载问题中,我发现了一个新的、奇怪的问题。我知道,IDLE IN TRANSACTION当我在应用程序层中做错了什么时,某些查询可能处于状态。但是,刚才我发现这个查询现在有近 20 秒的状态:
SELECT 1;
Run Code Online (Sandbox Code Playgroud)
这是 JBoss AS 的内部机制,检查连接是否仍然有效。我无法理解它是如何在交易中闲置的。欢迎任何提示。
idle in transaction 几乎意味着它所暗示的:目前有一个开放的交易什么都不做。
您所看到的可以轻松重现。在一个会话中执行以下操作(如有必要,请在客户端中禁用自动提交 - 通常不是,显式BEGIN;会自动执行此操作):
test=>
BEGIN;
SELECT 1;
Run Code Online (Sandbox Code Playgroud)
在另一个会话中,让我们看看它的外观pg_stat_activity:
test=> SELECT pid,
datname,
usename,
xact_start,
query_start,
state,
state_change,
query,
now()
FROM pg_stat_activity;
pid ? 13639
datname ? test
usename ? dezso
xact_start ? 2015-10-23 10:14:36.853529+02
query_start ? 2015-10-23 10:15:15.838252+02
state ? idle in transaction
state_change ? 2015-10-23 10:15:15.838365+02
query ? SELECT 1
now ? 2015-10-23 10:16:24.340721+02
Run Code Online (Sandbox Code Playgroud)
在这里我们看到四种不同的时间戳:
xact_start),query_start),state_change我想这是查询的结尾)和在最后两个事务之间,事务处于空闲状态,但仍显示最后一个查询。
回答您的问题:默认情况下,许多客户端都禁用了自动提交。在这种情况下,当SELECT 1;发出第一个命令(例如)时,事务会以静默方式启动- 然后永远不会关闭。在这种情况下,您将看到您当前的体验和我在上面复制的内容。
AFAIK 有一种方法可以说服 JBoss AS 将其关闭。这可能会有所帮助:https : //developer.jboss.org/wiki/Non-transactionaldataaccessandtheauto-commitmode
| 归档时间: |
|
| 查看次数: |
16822 次 |
| 最近记录: |