我有一個數據庫密集型應用程序,運行數小時並使用多個線程,所有線程都通過JDBC與Postgresql進行通信。我看到的症狀是偶爾(每「運行」一次到三次)我結束了一個或多個卡住的JDBC連接,這似乎正在等待來自數據庫的響應,但似乎一直在等待。線程轉儲如下:Postgresql 8.4偶爾掛起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%。客戶端線程就像上面一樣。 – BrunoJCM
注意,如果它掛起並說「BLOCKED等待對象XXX」,這可能意味着您的postgres連接正在嘗試被多個線程使用[在這個例子中不是這樣的情況下,就像一個筆記] – rogerdpack