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)?
有一件显而易见的事情您可以尝试:将 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...”。这是复制粘贴的产物还是原始消息?如果是这样,可能有助于找到起源。
| 归档时间: |
|
| 查看次数: |
1815 次 |
| 最近记录: |