diggbag

          BlogJava 聯系 聚合 管理
            0 Posts :: 13 Stories :: 6 Comments :: 0 Trackbacks
          近日在公司項目中,使用到spring+mybatis的架構,特對mybatis的batch模式做了相關研究,得出以下結論:

               1.Mybatis內置的ExecutorType有3種,默認的是simple,該模式下它為每個語句的執行創建一個新的預處理語句,單條提交sql;而batch模式重復使用已經預處理的語句,
          并且批量執行所有更新語句,顯然batch性能將更優;
           
          2.但batch模式也有自己的問題,比如在Insert操作時,在事務沒有提交之前,是沒有辦法獲取到自增的id,這在某型情形下是不符合業務要求的;
           
          3. 在測試中使用simple模式提交10000條數據,時間為18248 毫秒,batch模式為5023 ,性能提高70%;
           
          4.通過走碼和研讀spring相關文件發現,在同一事務中batch模式和simple模式之間無法轉換,由于本項目一開始選擇了simple模式,所以碰到需要批量更新時,只能在單獨的事務中進行;
           
          5.在代碼中使用batch模式可以使用以下方式:
           
          //從spring注入原有的sqlSessionTemplate
          @Autowired
          private SqlSessionTemplate sqlSessionTemplate;
           
          public void testInsertBatchByTrue() {
           
          //新獲取一個模式為BATCH,自動提交為false的session
          //如果自動提交設置為true,將無法控制提交的條數,改為最后統一提交,可能導致內存溢出
          SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(
          ExecutorType.BATCH, false);
          //通過新的session獲取mapper
              fooMapper = session.getMapper(FooMapper.class);
              int size = 10000;
              try {
                  for (int i = 0; i < size; i++) {
                          Foo foo = new Foo();
                          foo.setName(String.valueOf(System.currentTimeMillis()));
                          fooMapper.insert(foo);
                              if (i % 1000 == 0 || i == size - 1) {
                              //手動每1000個一提交,提交后無法回滾
          session.commit();
                              //清理緩存,防止溢出
                                      session.clearCache();
                  }
                  }
              } catch (Exception e) {
          //沒有提交的數據可以回滾
                                  session.rollback();
                      } finally {
          session.close();
                  }
              }
           
          6.上述代碼沒有使用spring的事務,改動手動控制,如果和原spring事務一起使用,將無法回滾,必須注意,最好單獨使用;

          posted on 2012-02-16 17:40 哲同 閱讀(21987) 評論(1)  編輯  收藏 所屬分類: java相關

          Feedback

          # re: 關于mybatis的batch模式性能測試及結論[未登錄] 2015-08-09 23:16 aa
          分段提交事務,那某一段處錯誤了,不能回滾怎么辦?  回復  更多評論
            

          主站蜘蛛池模板: 保定市| 峨边| 郧西县| 大石桥市| 芦溪县| 曲周县| 凤凰县| 刚察县| 阿鲁科尔沁旗| 温州市| 鹤庆县| 合川市| 镇雄县| 巨野县| 东源县| 紫金县| 马鞍山市| 枞阳县| 盐山县| 萨迦县| 元阳县| 夹江县| 平果县| 通榆县| 凤城市| 独山县| 临泉县| 雅安市| 奈曼旗| 黄陵县| 镇赉县| 新蔡县| 中西区| 泰来县| 泉州市| 宜章县| 资兴市| 青州市| 深圳市| 东源县| 乐陵市|