[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
需要向数据库发送多条sql语句时, 为了提升执行效率, 可以考虑采用JDBC的批处理机制. JDBC的批处理机制主要涉及Statement或PreparedStatement对象的以下方法:
|--addBatch(String sql) :Statement类的方法, 多次调用该方法可以将多条sql语句添加到Statement对象的命令列表中. 执行批处理时将一次性的把这些sql语句发送给数据库进行处理.
|--addBatch(): PreparedStatement类的方法, 多次调用该方法可以将多条预编译的sql语句添加到PreparedStatement对象的命令列表中. 执行批处理时将一次性的把这些sql语句发送给数据库进行处理.
|--executeBatch():把Statement对象或PreparedStatement对象命令列表中的所有sql语句发送给数据库进行处理.
|--clearBatch(): 清空当前sql命令列表.
/* * create table batch_test(id int primary key auto_increment, name varchar(40), age int); */ public class BatchTest { @Test public void statementBatch() { Connection conn = null; Statement st = null; String sql_1 = "insert into batch_test(name, age) values('coolxing', 24)"; String sql_2 = "insert into batch_test(name, age) values('coolmin', 22)"; String sql_3 = "insert into batch_test(name, age) values('yong', 21)"; String sql_4 = "update batch_test set name='java' where id=1"; try { conn = JdbcUtils.getConnection(); st = conn.createStatement(); st.addBatch(sql_1); st.addBatch(sql_2); st.addBatch(sql_3); st.addBatch(sql_4); st.executeBatch(); st.clearBatch(); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.release(null, st, conn); } } @Test public void preparedStatementBatch() { Connection conn = null; PreparedStatement st = null; String sql = "insert into batch_test(name, age) values(?, ?)"; try { conn = JdbcUtils.getConnection(); st = conn.prepareStatement(sql); for (int i = 0; i < 10002; i++) { st.setString(1, "coolxing_" + i); st.setInt(2, i); st.addBatch(); // 需要防止Preparedstatement对象中的命令列表包含过多的待处理sql语句, 而造成outOfMemory错误 if (i % 500 == 0) { st.executeBatch(); st.clearBatch(); } } // 将剩下的未处理命令发送给数据库 st.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.release(null, st, conn); } } }
总结: 采用Statement.addBatch(sql)方式实现批处理可以向数据库发送不同类型的sql语句, 但是这些sql语句没有进行预编译, 执行效率不高. 且需要列出每一个sql语句. 而PreparedStatement.addBatch()只能应用在类型相同参数不同的sql语句中, 此种形式的批处理经常用于在同一个表中批量插入数据, 或批量更新表的数据.
注意不要一次性向命令列表中添加数量过多的sql语句, 防止出现outOfMemory错误.