gpt4 book ai didi

Oracle 和 JDBC 性能 : INSERT ALL vs preparedStatement. addBatch

转载 作者:行者123 更新时间:2023-12-03 23:48:33 32 4
gpt4 key购买 nike

我有一个带有 Oracle 数据库后端的 Java 应用程序,我需要在其中插入多行。我看过关于inserting multiple rows into Oracle的讨论,但我也对混合使用 JDBC 时如何影响性能感兴趣。

我看到了几种可能性:

选项1:
使用单行插入 PreparedStatement 并多次执行:

String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
stmt.setString(1, obj.getBar());
stmt.setString(2, obj.getBaz());
stmt.execute();
}

选项 2:
构建一个 Oracle INSERT ALL 语句:
String insert = "INSERT ALL " +
"INTO foo(bar, baz), (?, ?) " +
"INTO foo(bar, baz), (?, ?) " +
"SELECT * FROM DUAL";
PreparedStatement stmt = conn.prepareStatement(insert);
int i=1;
for(MyObject obj : someList) {
stmt.setString(i++, obj.getBar());
stmt.setString(i++, obj.getBaz());
}
stmt.execute();

选项 3:
使用 PreparedStatement 的 addBatch 功能:
String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
stmt.setString(1, obj.getBar());
stmt.setString(2, obj.getBaz());
stmt.addBatch();
}
stmt.execute();

我想另一种可能性是创建一个 CSV 文件并使用 SQL Loader,但我不确定如果添加创建 CSV 文件的开销,那真的会更快......

那么哪个选项的执行速度最快?

最佳答案

使用 addBatch() PreparedStatement 的功能对于任何低于 1,000,000 行。

您添加到代码中的每个附加组件都会增加依赖项和故障点。

如果您沿着那条路线(外部表、sql 加载程序等)走下去,请确保它真的值得。

将数据序列化为 csv 文件,将其移动到数据库可读的位置将很容易花费一秒钟左右的时间。

在那段时间里,如果我把它吸进去并开始用 JDBC 插入,我可以插入 20,000 行。

关于Oracle 和 JDBC 性能 : INSERT ALL vs preparedStatement. addBatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901997/

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