網上百度一下,發現各種各樣的版本,真的是各種試,現在就來分享一下我運作過程中是如何處理的吧
1、首先一種基本的批處理是采用union all 拼接sql,導緻問題sql過長,耗時,性能不好,且達到一定量會超出sql長度限制,簡單的批處理可以應付。
<insert id="insertMethodOne" parameterType="List">
insert into gdgk_test_user(id,name,password) (
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.id,jdbcType=VARCHAR},#{item.name,jdbcType=VARCHAR},#{item.password,jdbcType=VARCHAR} from dual
</foreach>
)
</insert>
一般20字段以内的表新增,資料2000條以内可用,經過測試,但是,這個是非常重要,對于資料表字段中存在大資料如:CLOB類型,就不能使用這種批量新增方法。
2、采用dao層循環,得到sqlsession 統一commit,這種方式幾乎可以應付你所有的情況
@Autowired
private SqlSessionTemplate sqlSession;
public void saveBatch(List<TBsImpNews> modelList) {
SqlSession session =sqlSession.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
try{
//批量生成新聞主鍵
for(TBsImpNews tBsImpNews : modelList){
//批量生成新聞主鍵
String impnewsId =String.valueOf(Long.valueOf(getSequenceNextId(SEQ_T_BS_IMP_NEWS)));
tBsImpNews.setImpnewsId(impnewsId);
sqlSession.insert("com.rocktrue.fastdev.wvsp.impnews.TBsImpNewsMapper.insertTBsImpNews", tBsImpNews);
for(String url:tBsImpNews.getImgList()){
//批量生成新聞圖檔主鍵
String imniId =String.valueOf(Long.valueOf(getSequenceNextId(SEQ_T_BS_IMP_NEWS_IMG)));
TBsImpNewsImg tBsImpNewsImg=new TBsImpNewsImg();
tBsImpNewsImg.setImniId(imniId);
tBsImpNewsImg.setImpnewsId(impnewsId);
tBsImpNewsImg.setImniSrc(url);
sqlSession.insert("com.rocktrue.fastdev.wvsp.impnews.TBsImpNewsImgMapper.insertTBsImpNewsImg", tBsImpNewsImg);
}
}
session.commit();
//清理緩存,防止溢出
session.clearCache();
}catch(Exception e){
e.printStackTrace();
session.rollback();
}finally {
session.close();
}
}