gpt4 book ai didi

java - ExecuteBatch 不是只执行一次,而是在每条记录之后执行。为什么?

转载 作者:行者123 更新时间:2023-11-30 09:05:20 28 4
gpt4 key购买 nike

这是我的代码:

    prodsQuery = dbc
.connect()
.prepareStatement(
"INSERT INTO 'duplicates' (C_ContactID, C_EmailAddress,
C_DataSourceID, C_DateCreated)"
+ "VALUES (?,?,?,?);");
// for (Record x : records) {

for (int i = startAtRecord; i <= records.size(); i++) {
prodsQuery.setInt(1, records.get(i).getContactID());
prodsQuery.setString(2, records.get(i).getEmail());
prodsQuery.setString(3, records.get(i).getDataSourceID());
prodsQuery.setString(4, records.get(i).getDateCreated());

// addBatch is better than executeUpdate or executeQuery in this
// case
prodsQuery.addBatch();
// save number of record in case of failure
BufferedWriter out = new BufferedWriter(new FileWriter(
"data\\resumerecord.txt"));
out.write(i + "\n");
out.close();
// execute batch every some records, in case of failure to start
// at some point
if (i % 5000 == 0) {
prodsQuery.executeBatch();
System.out.println("Batch was executed.");

}

}
prodsQuery.executeBatch();
prodsQuery.close();

我想提高效率,这就是为什么我想每 5000 条记录执行一次批处理。但是我在测试的时候不小心关掉了程序,然后查看数据库,发现它停在了记录 7589 处。这意味着它正在一条一条地添加记录。

为什么?

它不应该在里面插入整个 block 吗?

我认为这就是批处理更有效的原因。

有没有其他方法如何在完成插入的位置存储记录的 ID?也许在程序启动时从 db 读取它。

最佳答案

只要您处于自动提交模式,每个单独的 INSERT 语句都会有自己的自动事务。这也适用于 executeBatch 执行的语句;该功能不会为您创建单个交易。

提交事务是该程序中最耗时的部分,因此中止程序很可能发生在 executeBatch 循环中间的某个地方。

要减少事务开销,请禁用自动提交模式,并在连接上手动调用 commit

关于java - ExecuteBatch 不是只执行一次,而是在每条记录之后执行。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884032/

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