由于建立数据库连接是一个很消耗资源和时间的操作,一般建立连接的要求尽可能晚建立,尽可能早释放。但是对于执行多条sql语句时,要是频繁第建立连接释放连接,效率会很低。因此可能通过JDBC的批处理来优化此操作。即建立一次连接,执行多条sql语句。
主要用到的方法:
PreparedStatement.addBatch(); //增加一条sql语句,sql语句必须一致,发送的sql语句经过了预编译,执行效率高,只能应用在sql语句相同,参数不同的场景
Statement.addBatch(String sql); //增加一条sql语句,有点:可以向批处理中增加多条不同的sql的语句;缺点:sql语句没有预编译,因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据
PreparedStatement.executeBatch();//将所有sql语句一起执行
clearBatch();清除批处理命令
//Demo1,使用Statement.addBatch()来进行批处理
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
String sql1 = "insert into user(name,password,email,birthday)
values('kkk','123','abc@sina.com','1978-08-08')";
String sql2 = "update user set password='123456' where id=3";
st = conn.createStatement();
st.addBatch(sql1); //把SQL语句加入到批命令中
st.addBatch(sql2); //把SQL语句加入到批命令中
st.executeBatch();
} finally{
JdbcUtil.free(conn, st, rs);
}
//Demo2, 使用 PreparedStatement.addBatch()
conn = JdbcUtil.getConnection();
String sql = "insert into user(name,password,email,birthday) values(?,?,?,?)";
st = conn.prepareStatement(sql);
for(int i=0;i<50000;i++){
st.setString(1, "aaa" + i);
st.setString(2, "123" + i);
st.setString(3, "aaa" + i + "@sina.com");
st.setDate(4,new Date(1980, 10, 10));
st.addBatch();
if(i%1000==0){
st.executeBatch();
st.clearBatch();
}
}
st.executeBatch();