Jer*_*emy 13 oracle performance jdbc
我有一个带有Oracle数据库后端的Java应用程序,我需要插入多行.我已经看过有关在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();
}
Run Code Online (Sandbox Code Playgroud)
选项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();
Run Code Online (Sandbox Code Playgroud)
选项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();
Run Code Online (Sandbox Code Playgroud)
我想另一种可能性是创建一个CSV文件并使用SQL Loader,但是如果你增加创建CSV文件的开销,我不确定这会更快.
那么哪个选项执行速度最快?
使用低于1,000,000行的任何addBatch()功能.PreparedStatement
您添加到代码中的每个附加组件都会增加依赖性和失败点.
如果你走这条路(外部表,sql loader等)确保它真的值得.
将数据序列化到csv文件,将其移动到数据库可读的位置将很快需要一秒钟左右.
在那段时间里,如果我把它吸了起来并开始使用JDBC插入,我本可以插入20,000行.
| 归档时间: |
|
| 查看次数: |
19467 次 |
| 最近记录: |