Postgresql 8.4偶尔会挂起JDBC访问权限

use*_*593 11 postgresql jdbc hang

我有一个数据库密集型应用程序,它运行了很多个小时并使用多个线程,所有这些都通过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)
Run Code Online (Sandbox Code Playgroud)

我会想到某种锁定问题,除了多次只有一个线程被卡住.我在这种状态下看到的至少一个查询是REINDEX,因此查询可能需要花费相当多的时间.为了找到解决方案,我将JDBC驱动程序从8.4升级到9.1,但问题仍然存在.Postgresql日志中没有任何异常.任何进一步诊断的想法(除了使用pg_locks)?

Erw*_*ter 1

有一件显而易见的事情您可以尝试:将 PostgreSQL 本身也更新到版本 9.1。
您还可以记录所有长时间运行的语句,这可能会给您提供线索。

Set log_min_duration_statement = 2000
Run Code Online (Sandbox Code Playgroud)

或者任何适合您的阈值。
我不知道如何解释线程转储,但这一行看起来很奇怪:

  • 锁定 <0x2c023e10> (org.postgresql.core.v3.QueryExecutorImpl)

什么被锁定了?你会注意到它拼写错误“at a org.postgresql.cor...”。这是复制粘贴的产物还是原始消息?如果是这样,可能有助于找到起源。