大家来找茬,看看我如下的代码有没有什么问题,可要睁大眼睛,好好找找哟。
try {
Connection cnn= ConnectionManager.getConnection();
pmst=cnn.prepareStatement(sbSql.toString());
//使用循环批量插入
for(Iterator<FlowCardDetail>iter=list.iterator();iter.hasNext();){
FlowCardDetail flowCardDetail= iter.next();
pmst.setString(1, flowCardNo);
pmst.setInt(2, flowCardDetail.getAimClient().getId());
pmst.setString(3,flowCardDetail.getItem().getItemNo());
pmst.setBigDecimal(4,flowCardDetail.getOptQty());
pmst.setString(5, flowCardDetail.getAdjustFlag());
pmst.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
throw new DaoException();
}finally{
ConnectionManager.close(pmst);
}
不知道大家有没有找到我的问题所在,在很早之前听说过在操作底层数据库的时候不能频繁的开合数据库,因为会导致效率低下。而我利用for循环实现批量插入的时候,pmst.executeUpdate()这个语句是在for循环里头的,因此多次的开合了数据库。那么该如何解决这个问题呢?首先是将pmst.executeUpdate()这个语句放到循环语句之外,那么如何将每次循环新增的sql语句放入到预编译的pmst中呢?于是,在这里就用到了pmst的addbatch语句。效果如下:
//使用循环批量插入
for(Iterator<FlowCardDetail>iter=list.iterator();iter.hasNext();){
FlowCardDetail flowCardDetail= iter.next();
pmst.setString(1, flowCardNo);
pmst.setInt(2, flowCardDetail.getAimClient().getId());
pmst.setString(3,flowCardDetail.getItem().getItemNo());
pmst.setBigDecimal(4,flowCardDetail.getOptQty());
pmst.setString(5, flowCardDetail.getAdjustFlag());
pmst.addBatch();
}
pmst.executeUpdate();
小结:学习的事情都是一点点累计的,之前我很多的东西都是听了一个名词,至于为什么是那样,以及如何优化处理根本不知道。而近期,这些个模糊的理念好像逐渐的清楚起来了,开心。