我使用spring boot和mybatis MyBatisBatchItemWriter。
使用demo将数据写入数据库(mysql)时没问题。
但在我的项目中使用
org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction
at org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:91) ~[mybatis-spring-1.2.2.jar:1.2.2]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:353) ~[mybatis-spring-1.2.2.jar:1.2.2]
at com.sun.proxy.$Proxy45.update(Unknown Source) ~[na:na]
这是我的演示:
@Bean
public MyBatisBatchItemWriter<Hfbank> writer() {
MyBatisBatchItemWriter<Hfbank> writer = new MyBatisBatchItemWriter<Hfbank>();
writer.setSqlSessionFactory(sqlSessionFactory);
String statementId = "com.springboot.dao.HfbankDao.insertSelective";
writer.setStatementId(statementId);
CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
List delegates = new ArrayList();
delegates.add(writer);
compositeItemWriter.setDelegates(delegates);
writer.setAssertUpdates(false);
return writer;
}
这是我的MyBatisBatchItemWriter:
@Bean
@StepScope
public MyBatisBatchItemWriter<ChannelDataInfo> writer(@Value("#{jobParameters[channelid]}") Long channelid) {
MyBatisBatchItemWriter<ChannelDataInfo> writer = new MyBatisBatchItemWriter<ChannelDataInfo>();
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
writer.setSqlSessionFactory(sqlSessionFactory);
String statementId = "com.kaigejava.fundcheck.repository.ChannelDataInfoRepository.insertSelective";
writer.setStatementId(statementId);
CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
List delegates = new ArrayList();
delegates.add(writer);
compositeItemWriter.setDelegates(delegates);
writer.setAssertUpdates(false);
return writer;
}
为什么演示正常,但我的项目有错误?
答案 0 :(得分:1)
因为它是这样的:你不能改变交易中的执行者类型。
您似乎已经尝试批量编写某些内容作为包含其他SQL操作的更广泛的事务的一部分,但该事务是使用SIMPLE(默认)或REUSE执行器类型启动的。
很明显,批量写入需要BATCH执行器类型,但是一旦事务开始,它的执行器类型就无法更改。因此,如果您的RDBMS允许,请在单独的事务中执行批处理操作,或运行嵌套事务。