mybatis session批量插入设置手动提交问题

恋上白开水 2016-12-16 02:09:31
最近在做一个批量入库的需求,用的是mybatis框架,通过获取mybatis的session进行批量手动提交,现在遇到个问题具体原理没有弄明白,还请各位大神解释下,具体问题如下:
1、拿到Mybatis的session,设置手动提交
2、批量插入数据
3、设置session.commit
4、异常的话就session.rollback
5、关闭session
现在的问题是我有一批数据,比如100条,前50条是正确的,从第51条开始有异常数据导致入库失败,正常情况应该是这100条数据都不应该入库,但是目前的结果是前50条正常的数据已经入库成功了,麻烦各位大神解释下为什么会出现这种情况,已经如何解决,谢谢!
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,
false);
ProdProfitDetailDOMapper profitDetailDOMapper = null;
logger.info("addProfitDetailBatch()-[活期收益处理service]-批量添加数据开始");
if(!CollectionUtils.isEmpty(list)){
String key = getProfitDOMapperKeyByDetailDO(list.get(0));
if(!StringUtils.isBlank(key)){
if(FileTypeCommonEnum.FUND_COMPANY_CODE_DAHUA.getCode().equals(key)||FileTypeCommonEnum.FUND_CODE_DAHUA_RIZENGLI.getCode().equals(key)||FileTypeCommonEnum.FUND_CODE_DAHUA_CHAIFUBAO.getCode().equals(key)){
profitDetailDOMapper= session
.getMapper(DaHuaProdProfitDetailDOMapper.class);
}else if (FileTypeCommonEnum.FUND_COMPANY_CODE_SOUTH_FUND.getCode().equals(key)||FileTypeCommonEnum.FUND_CODE_SOUTH_FUND.getCode().equals(key)){
profitDetailDOMapper= session
.getMapper(NaFangProdProfitDetailDOMapper.class);
}else if(FileTypeCommonEnum.FUND_COMPANY_CODE_PINGANYING.getCode().equals(key)||FileTypeCommonEnum.FUND_CODE_PAYING.getCode().equals(key)){
profitDetailDOMapper= session
.getMapper(HuiYingProdProfitDetailDOMapper.class);
}else if(FileTypeCommonEnum.FUND_COMPANY_CODE_FUYING5.getCode().equals(key)||FileTypeCommonEnum.FUND_CODE_FUYING.getCode().equals(key)){
profitDetailDOMapper= session
.getMapper(FuYingProfitDetailDOMapper.class);
}else{
throw new ServiceException(FTSResCodeConstants.FUND_CODE_AND_COM_CODE_IS_NON.getCode(), FTSResCodeConstants.FUND_CODE_AND_COM_CODE_IS_NON.getMessage());
}
}else{
logger.error("addProfitDetailBatch()-[活期收益处理service]-更新收益状态,基金公司代码和基金代码必须有一个不为空");
throw new ServiceException(FTSResCodeConstants.FUND_CODE_AND_COM_CODE_IS_NON.getCode(), FTSResCodeConstants.FUND_CODE_AND_COM_CODE_IS_NON.getMessage());
}
}
try{
session.getConnection().setAutoCommit(false);

for (ProdProfitDetailDO prodProfitDetailDO : list) {
try {
profitDetailDOMapper.insert(prodProfitDetailDO);
} catch (Exception e) {
logger.error("FtsProdProfitDetailServiceImpl.addShareMatchBatch(); accure exception", e);
throw new ServiceException(FTSResCodeConstants.DB_EXCEPTION.getCode(), FTSResCodeConstants.DB_EXCEPTION.getMessage());
}
}
long begTime = System.currentTimeMillis();
logger.info("addProfitDetailBatch()-[该单批次入库]-ssesion提交开始...,qname=q_fts_current_profit_file_generate");
session.commit();
// 清理缓存,防止溢出
session.clearCache();
session.flushStatements();

logger.info("addProfitDetailBatch()-[该单批次入库]-ssesion提交完成,关闭session,qname=q_fts_current_profit_file_generate,批量用时(ms)={}",(System.currentTimeMillis() - begTime));
}catch (Exception e) {
logger.error("FtsProdProfitDetailServiceImpl.addShareMatchBatch(); accure exception", e);
session.rollback();
throw new ServiceException(FTSResCodeConstants.DB_EXCEPTION.getCode(), FTSResCodeConstants.DB_EXCEPTION.getMessage());
}finally{
session.close();
}

...全文
674 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧