我有一个非常数据库密集的应用程序运行了很多小时,并使用多个线程,所有这些都通过JDBC与
Postgresql通信.我看到的症状是偶尔(每次“运行”中有一到三次),我遇到了一个或多个卡住的JDBC连接,似乎在等待数据库的响应,但似乎永远在等待.线程转储如下:
"Thread-4367355" daemon prio=6 tid=0x04920c00 nid=0x1e88 runnable [0x04bef000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:135) at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104) at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73) at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:255) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1165) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:191) - locked <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:337) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:329)
我会想到一些锁定问题,除了很多次只有一个线程被卡住.我在这个状态中看到的至少一个查询是一个REINDEX,所以查询可能要花费一些时间.希望找到解决方案,我将JDBC驱动程序从8.4升级到9.1,但问题仍然存在. Postgresql日志中也没什么不寻常的.任何进一步诊断的想法(使用pg_locks除外)?
有一件很明显的事情您可以尝试:将Postgresql本身更新到9.1版本.
你也可以记录所有 long running statements,这可能会给你一个线索.
你也可以记录所有 long running statements,这可能会给你一个线索.
Set log_min_duration_statement = 2000
或者任何阈值适合你.
我不知道如何解释线程转储,但这行看起来很奇特:
- locked <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl)
什么是锁定?而且你注意到它是如何拼写在一个org.postgresql.cor …“.这是一个复制粘贴的人工制品还是原始的信息?如果是这样,可能有助于找到原产地.