【发布时间】:2011-10-27 15:18:00
【问题描述】:
我有一个数据库密集型应用程序,它运行数小时并使用多个线程,所有线程都通过 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)?
【问题讨论】:
-
您解决问题了吗?我们在 9.1 也面临同样的“挂起”
-
我遇到了同样的问题,Postgresql 8.4,JDBC 驱动程序 9.1。该查询是一个复杂的删除。服务器上的进程开始使用 100% 的 CPU,然后突然下降到 0% 并永远保持在 0%。客户端线程和上面一样卡住了。
-
请注意,如果它挂起并说“BLOCKED waiting for object XXX”,这可能意味着您的 postgres 连接正试图被多个线程使用[当然在这种情况下不是这种情况,就像一个注释]
标签: postgresql jdbc freeze