使用PreparedStatement进行批量插入操作
- 获取数据库连接:使用合适的数据库驱动,通过
DriverManager.getConnection(url, username, password)
获取Connection
对象。
- 创建PreparedStatement:使用
Connection
对象的prepareStatement(String sql)
方法创建PreparedStatement
对象,其中sql
为插入语句,例如INSERT INTO table_name (column1, column2) VALUES (?,?)
。
- 设置参数并添加批处理:通过
PreparedStatement
的setXxx
方法设置占位符参数值,然后调用addBatch()
方法将该条插入语句添加到批处理中。示例代码如下:
Connection conn = DriverManager.getConnection(url, username, password);
String sql = "INSERT INTO table_name (column1, column2) VALUES (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
for (int i = 0; i < dataList.size(); i++) {
pstmt.setString(1, dataList.get(i).getField1());
pstmt.setString(2, dataList.get(i).getField2());
pstmt.addBatch();
}
- 执行批处理:调用
PreparedStatement
的executeBatch()
方法执行批处理操作。
pstmt.executeBatch();
- 关闭资源:操作完成后,关闭
PreparedStatement
和Connection
。
pstmt.close();
conn.close();
大数据量插入时的性能优化措施
- 增大批处理大小:合理调整每次执行
executeBatch()
时的批处理数量,减少数据库交互次数。但过大的批处理可能会导致内存溢出,需根据实际情况测试调整。
- 事务处理:将多个插入操作放在一个事务中,减少事务提交次数,提高整体性能。示例代码如下:
conn.setAutoCommit(false);
try {
// 执行批处理插入操作
pstmt.executeBatch();
conn.commit();
} catch (SQLException e) {
conn.rollback();
e.printStackTrace();
}
- 禁用自动提交:默认情况下,JDBC是自动提交模式,每次插入操作都会触发事务提交。通过
conn.setAutoCommit(false)
禁用自动提交,在所有插入操作完成后手动提交,可减少事务开销。
- 使用批量插入SQL语法:一些数据库支持一次插入多条记录的语法,例如MySQL的
INSERT INTO table_name (column1, column2) VALUES (value1_1, value1_2), (value2_1, value2_2)
。使用这种方式可进一步减少数据库交互。
- 优化数据库配置:调整数据库的缓冲区大小、连接池大小等参数,以适应大数据量插入的需求。例如,在MySQL中,可以适当增大
innodb_buffer_pool_size
参数的值,提高数据读取和写入性能。
- 合理设置索引:在插入数据前,若表中已存在索引,可考虑暂时删除不必要的索引,插入完成后再重新创建。因为插入操作会导致索引的更新,删除索引可减少插入时的性能开销。但需谨慎操作,避免影响数据的查询性能。