一 使用目的
业务场景:当需要向数据库发送一批sql语句执行时,,应避免向数据库一条条的发送执行,而应该采用jdbc的批处理,可以提升执行效率
二 使用批处理分析
1.向数据库中插入多条记录
public void testBatch() {
Connection con = null;
Statement st = null;
ResultSet rs = null;
try {
// 获取连接
con = DBManager.getConnection();
// 定义sql语句
String sql1 = "insert into testbatch values(1,'aaa')";
String sql2 = "insert into testbatch values(2,'bbb')";
String sql3 = "delete from testbatch where id=1";
// 在st对象中有一个集合对象list
st = con.createStatement();
// 向批中添加sql语句,
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
// 向sql提交批处理,
// 得到的是一个int[]整形数组,返回结果是整形数组每一个元素对表格中多少条记录产生影响
st.clearBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBManager.release(con, st, rs);
}
}
注:这样通过addBatch()方法可以想数据库中加入多条数据,可以删除数据,同时可以执行多条记录,记住在想sql提交语句的时候要用st.executeBatch();,并且必须在提交之后要清除缓存,但是这个方法只是对数据同时记性几条的插入,如果要是同时插入100条,1000条,10000条,甚至100000条呢??要用到下面的方法
public void testBatch2() {
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
// 获取连接
con = DBManager.getConnection();
// 定义sql语句
String sql = "insert into testbatch values(?,?)";
// 创建预处理对象
st = con.prepareStatement(sql);
//为占位符赋值,100000000会超出内存,抛灾难性的错误,可以把一亿条语句转换为每一千条提交一次
//如果多出4条没有被1000整出等于0,在最后再提交一次
for(int i =1;i<100000004;i++){
st.setInt(1, i);
st.setString(2, "aaa"+i);
st.addBatch();
if(i%1000==0){
//提交批
st.executeBatch();
st.clearBatch();
}
}
st.executeBatch();
st.clearBatch();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBManager.release(con, st, rs);
}
}
注:
通过对下面的两次插入总结出用for循环的方法
st.setInt(1, 3);
st.setString(2, "aaa");// 已经形成的一条完整的sql语句 (3,"aaa")
st.addBatch();
st.setInt(1, 4);
st.setString(2, "bbb");// 又形成了第二条完整的sql语句(4,"bbb");
for(int i =1;i<100000000;i++){
st.setInt(1, i);
st.setString(2, "aaa"+i);
st.addBatch();
}
}
st.executeBatch();
st.clearBatch();
需要注意的是如果一次性的出入100000000个数据,会抛内存溢出的错误,所以可以在每插入1000条提交一次,可以避免内存溢出的错误,代码为:
for(int i =1;i<100000004;i++){
st.setInt(1, i);
st.setString(2, "aaa"+i);
st.addBatch();
if(i%1000==0){
//提交批
st.executeBatch();
st.clearBatch();
}
}
st.executeBatch();
st.clearBatch();