天天看點

關于spring和mybatis內建後如何進行批處理總結

網上百度一下,發現各種各樣的版本,真的是各種試,現在就來分享一下我運作過程中是如何處理的吧

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();
     }
  }