2011-10-26 113 views
11

我有一個數據庫密集型應用程序,運行數小時並使用多個線程,所有線程都通過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)?

+0

您是否設法解決問題?我們在9.1 –

+0

上也遇到同樣的問題,我遇到了同樣的問題,Postgresql 8.4,JDBC驅動程序9.1。該查詢是一個複雜的刪除。服務器上的進程開始使用100%的CPU,然後突然下降到0%並永遠保持在0%。客戶端線程就像上面一樣。 – BrunoJCM

+0

注意,如果它掛起並說「BLOCKED等待對象XXX」,這可能意味着您的postgres連接正在嘗試被多個線程使用[在這個例子中不是這樣的情況下,就像一個筆記] – rogerdpack

回答

1

有一件很明顯的事情可以嘗試:將PostgreSQL本身更新到9.1版本。
你也可以登錄所有long running statements,這可能會給你一個線索。

Set log_min_duration_statement = 2000 

或任何閾值適合你。
我不知道如何解釋線程轉儲,但此行看上去奇特:

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

什麼被鎖定?你注意到它是如何拼錯的「在org.postgresql.cor ...」。這是複製粘貼人造物還是原始信息?如果是這樣,可能有助於找到原點。

+1

鎖定<0x2c023e10>意味着方法已經獲得了一個鎖,它是一個org.postgresql.core.v3.QueryExecutorImpl對象。十六進制是鎖的地址? – crybird