当批处理大小很高时,JDBC应用程序会挂起批量插入

时间:2014-12-08 19:23:52

标签: java linux unix jdbc bulkinsert

我正在尝试使用简单的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)中的某些配置引起的,因为同一个应用程序在大批量大小的其他机器上运行良好。任何与机器配置相关的见解对我都非常有用。

1 个答案:

答案 0 :(得分:0)

是哪个数据库?我看到一些提到postgresql驱动程序的问题,我不知道其他提供商是否会发生类似的问题。

请参阅GitHubPostGreSql