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

时间:2011-10-26 23:45:28

标签: 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)

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

1 个答案:

答案 0 :(得分:1)

你可以尝试一些明显的事情:将PostgreSQL本身更新到版本9.1 你也可以记录所有long running statements,这可能会给你一个线索。

Set log_min_duration_statement = 2000

或任何适合你的门槛 我不知道如何解释线程转储,但这条线看起来很奇怪:

  
      
  • 已锁定&lt; 0x2c023e10&gt; (a org.postgresql.core.v3.QueryExecutorImpl)
  •   

锁定了什么?并且你注意到它在“org.postgresql.cor ......”中拼错了。这是复制粘贴的人工制品还是原始信息?如果是这样,可能有助于找到原点。