簡體   English   中英

當批處理大小很高時,JDBC應用程序會掛起批量插入

[英]JDBC application hangs for bulk insert, when batch size is high

我試圖使用簡單的JDBC應用程序從Linux服務器(比如服務器X)進行批量插入。

當我嘗試批量大小為5的應用程序時,它工作正常。

但是當我嘗試批量大小為500時,它就懸掛了。 我沒有收到任何錯誤或異常。 當我查詢數據庫時,我可以看到插入了500行,但java應用程序只是掛起。 java應用程序沒有退出。

應用程序只掛起以下方法調用

try{
// register driver

// establish connection

// create statement
// add insert commands from inputFile to the batch
statemnt.executeBatch();  //---------------application hangs here
}
//catch block followed by finally block to close resources

我在不同的linux服務器上嘗試了相同的應用程序,我能夠成功執行批量大小為500的應用程序,應用程序運行正常並正常退出。

應用程序僅在服務器X中掛起,並且僅在批處理大小較高時才掛起。

然后我檢查了服務器X中掛起進程的strace。我發現它在以下系統調用中循環

$ strace -f -p [hung-java-process-id]

[pid 104273] futex(0x7ffe78013728, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 104273] clock_gettime(CLOCK_MONOTONIC, {9635863, 882169546}) = 0
[pid 104273] clock_gettime(CLOCK_MONOTONIC, {9635863, 882258933}) = 0
[pid 104273] clock_gettime(CLOCK_REALTIME, {1417787058, 859159155}) = 0
[pid 104273] futex(0x7ffe78013754, FUTEX_WAIT_PRIVATE, 1, {0, 49972845}) = -1 ETIMEDOUT (Connection timed out)
[pid 104273] futex(0x7ffe78013728, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 104273] clock_gettime(CLOCK_MONOTONIC, {9635863, 932601035}) = 0
[pid 104273] clock_gettime(CLOCK_MONOTONIC, {9635863, 932677888}) = 0
[pid 104273] clock_gettime(CLOCK_REALTIME, {1417787058, 909571241}) = 0
[pid 104273] futex(0x7ffe78013754, FUTEX_WAIT_PRIVATE, 1, {0, 49977759}) = -1 ETIMEDOUT (Connection timed out)
[pid 104273] futex(0x7ffe78013728, FUTEX_WAKE_PRIVATE, 1) = 0

我檢查了掛起的java進程打開的打開文件列表,得到了以下輸出,顯示數據庫連接仍然打開。

$ lsof -p [hung-java-process-id] | grep TCP

COMMAND   PID       USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
java    104273 userid   14u  IPv6 1674188639      0t0  TCP serverX:55744->dbServer:blackjack (ESTABLISHED)

我還嘗試將連接AutoCommit屬性設置為false,然后在executeBatch方法之后調用commit。 但我仍面臨同樣的問題。

我也試過用較小的批量分割批次。 應用程序工作正常,批量大小為29但是當我將批量大小增加到30時,它只是掛起而沒有任何錯誤或異常。

我找不到問題的原因。 如果strace顯示問題的原因,那么請告訴我,它究竟是什么意思以及如何解決它? 任何幫助都會非常有用。 提前致謝。

請注意我使用的是Java 7

我想這個問題可能是由linux機器(服務器X)中的某些配置引起的,因為同一個應用程序在其他機器上工作正常,批量大。 任何與機器配置相關的見解對我來說都非常有用。

它是哪個數據庫? 我看到一些提到postgresql驅動程序的問題,我不知道其他提供商是否會發生類似的問題。

請參閱GitHubPostGreSql

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM