2016-05-12 54 views
1

我嘗試在200列的表中加載50000行。每1000行我做executeBatch()。我得到這張桌子的鎖。相同的代碼適用於MS SQL和Oracle,但postgresql我遇到此問題。當我將executeBatch數字從1000減少到75時,所有工作都正常。JDBC executeBatch()在PostgreSQL中無錯地掛起

配置文件中是否有任何參數響應批緩衝區大小?

同樣的問題http://www.postgresql.org/message-id/[email protected]

+1

你有沒有檢查你的應用程序的內存使用情況,也許驅動程序會消耗更多的內存,因此經常需要GC。也許只是增加堆大小就足夠了 –

+0

我從應用程序中單獨運行。只需從數據庫中的文件加載數據。 – Andrew

+0

請檢查它 –

回答

1

當我執行批處理插入語句表時發生大量列懸掛,當調用statement.executeBatch()。 它特定於postgresql jdbc驅動程序。 爲了避免這個問題,我們應該增加socket的緩衝區大小參數(SO_SNDBUF,SO_RCVBUF)。

對於Windows,我們在寄存器來創建這樣的PARAMS:

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Afd \Parameters] 

DefaultReceiveWindow(類型= DWORD)= 1640960(十進制) DefaultSendWindow(類型= DWORD)= 1640960(十進制)

這號碼(1640960)我從互聯網上獲得一般推薦! 它適用於我。

0

一般來說,你需要尋找以下的事情。

  1. 您是否能夠真正獲得表的鎖定?
  2. 您還有其他正在等待的java代碼鎖嗎?

通常首先檢查是pg_stat_activity system視圖,其會顯示該查詢被執行,以及它是否處於活動狀態,空閒,等待,等等。然後,如果它正在等待(即waitingt是),則你會想檢查pg_locks視圖,看看還有什麼可能鎖定關係中的任何東西。

如果等待不成立,那麼您最好檢查您的java代碼以獲取客戶端鎖定,但由於這適用於MySQL和Oracle,因此我認爲這不是一個問題。

還有一件事要注意。我不確定MySQL和Oracle是否在這裏,但PostgreSQL每次連接限制您一次查詢一個查詢。你可能有一些鎖定在那裏?

+1

我有同樣的問題就像在這種情況下http://www.postgresql.org/message-id/[email protected] – Andrew

+0

在pg_stat_activity中爲我的插入查詢狀態=活動等待= f。沒有鎖 – Andrew

+0

對於連接池,我肯定會懷疑池對象邏輯中的Java對象鎖。 –