ibatis 批量 事物提交

用 iabtis 

<iterate conjunction="">

 批量提交,缺点是提交数量有限制,size<1000;

批量提交: http://fengxiaoshuang429201406254717.iteye.com/blog/2392798

大量数据的话用事物提交:

我这边设置的是,一条一条insert,满5000条,事物提交;

如果过来一万条数据,事物会分成两批提交;

service impl实现层:

/** 5000条提交一次 */
    public static final int        BATCH_SIZE           = 5000;

    /** 事务模板 */
    protected TransactionTemplate transactionTemplate;

    /** sql执行模板 */
    protected SqlMapClientTemplate sqlMapClientTemplate = new SqlMapClientTemplate();
    private SqlMapClient sqlMapClient;
	
	 public SqlMapClientTemplate getSqlMapClientTemplate() {
        return sqlMapClientTemplate;
    }

    public void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) {
        this.sqlMapClientTemplate = sqlMapClientTemplate;
    }

    public SqlMapClient getSqlMapClient() {
        return sqlMapClient;
    }

    public void setSqlMapClient(SqlMapClient sqlMapClient) {
        this.sqlMapClient = sqlMapClient;
        this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
    }

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }
	
	
	 @Override
    public void getBankHandlingCharge(final List<PostAccountVO> vo) {

        sqlMapClientTemplate.execute(new SqlMapClientCallback() {
            public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
                executor.startBatch();
                int indexInBatch = 0;
                List<PostAccountInfoDO> infoDOList = new LinkedList<PostAccountInfoDO>();
                for (PostAccountVO poa : vo){
                    PostAccountInfoDO infoDO = new PostAccountInfoDO();
                    infoDO.setAmount(poa.getAmount());
                    infoDO.setFundCategory(poa.getFundCategory());
                    infoDO.setPostStaus(poa.getPostStaus());
                    infoDO.setFundChannelCode(poa.getFundChannelCode());
                    infoDO.setHappenDate(poa.getHappenDate());
                    infoDO.setRemarks(poa.getRemarks());
                    infoDO.setCreater(poa.getCreater());
                    infoDO.setCreateTime(poa.getCreateTime());
                    infoDO.setAuditor(poa.getCreater());
                    infoDO.setAuditorTime(poa.getCreateTime());
                    infoDO.setDeleteFlag(poa.getDeleteFlag());
                    infoDO.setInstOrder(poa.getInstOrder());
                    infoDOList.add(infoDO);
                }

                for (PostAccountInfoDO postAccountInfoDO:infoDOList) {
                    if (indexInBatch > BATCH_SIZE) {//5000条作为一批处理。超过5000,则作为下一批。
                        executor.executeBatch();
                        executor.startBatch();
                        indexInBatch = 0;
                    }
                    executor.insert("MS-POST-ACCOUNT-INFO-INSERT", postAccountInfoDO);

                    indexInBatch++;

            }
                return executor.executeBatch();
            }
    });
    }

insert 方法不是dao层的实现方法,是executor里边的insert方法,也就是说这里直接访问了mapping.xml文件里边 id="MS-POST-ACCOUNT-INFO-INSERT" 的方法;

 mapping.xml层:

<insert id="MS-POST-ACCOUNT-INFO-INSERT">
   <selectKey resultClass="java.lang.String" keyProperty="accountSeqNo">
      <![CDATA[
       select seq_post_account_info.nextval from dual
   ]]>
   </selectKey>
   <![CDATA[
       insert into TB_POST_TABLE(ACCOUNT_SEQ_NO,AMOUNT,FUND_CATEGORY,POST_STAUS,FUND_CHANNEL_CODE,HAPPEN_DATE,REMARKS,CREATER,CREATE_TIME,AUDITOR,AUDITOR_TIME,DELETE_FLAG,INST_ORDER)
       values
       ( #accountSeqNo#, #amount#, #fundCategory#, #postStaus#, #fundChannelCode#, #happenDate#, #remarks#, #creater#, #createTime#, #auditor#, #auditorTime#, #deleteFlag#, #instOrder#)
   ]]>
</insert>

事务提交失败回滚:

 我在事物提交前抛出异常(如下图),数据并没有添加到数据库,应该是有回滚机制在里边吧



 

猜你喜欢

转载自fengxiaoshuang429201406254717.iteye.com/blog/2392857
今日推荐