gpt4 book ai didi

java - 当批量大时,JDBC 应用程序挂起进行批量插入

转载 作者:太空狗 更新时间:2023-10-29 11:22:03 27 4
gpt4 key购买 nike

我正在尝试使用简单的 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 中挂起,并且仅在批处理大小时挂起。

然后查看server X中hung process的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

关于java - 当批量大时,JDBC 应用程序挂起进行批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com