JDBC 插入多行关闭自动提交

2022-09-01 03:41:49

我现在正在使用批处理:

String query = "INSERT INTO table (id, name, value) VALUES (?, ?, ?)";
PreparedStatement ps = connection.prepareStatement(query);            
for (Record record : records) {
    ps.setInt(1, record.id);
    ps.setString(2, record.name);
    ps.setInt(3, record.value);
    ps.addBatch();
}
ps.executeBatch();

我只是想知道上面的代码是否等同于下面的代码。如果没有,哪个更快?

String query = "INSERT INTO table (id, name, value) VALUES ";
for (Record record : records) {
    query += "(" + record.id + ",'" + record.name + "'," + record.value + "),";
}
query = query.substring(1, query.length() - 1);
PreparedStatement ps = connection.prepareStatement(query);
ps.executeUpdate();

答案 1

关闭自动提交

executeBatch只要自动提交设置为 false,性能就会有所提高:executeUpdate

connection.setAutoCommit(false);  
PreparedStatement ps = connection.prepareStatement(query);            
for (Record record : records) {
    // etc.
    ps.addBatch();
}
ps.executeBatch();
connection.commit(); 

答案 2

首先,使用查询字符串串联,您不仅会丢失 ReadyStatement 方法固有的类型转换,而且还容易受到数据库中执行的恶意代码的攻击。

其次,PreparedStatements以前缓存在数据库本身中,这已经比普通语句提供了非常好的性能改进。


推荐