我在mybatis-spring中使用映射器有问题。(Spring Batch)我需要在BATCH模式下使用SqlSessionTemplate和ExecutorType来解决性能问题(我的程序必须在表中执行数千条插入语句)。然而,在我的程序中,我需要在数据库的另一个表中记录错误和更新状态,如果在当前步骤的执行中出现问题,一切都是回滚,包括日志,这是不可接受的行为。我想我可以简单地设置两个不同的SqlSessionTemplate与不同的ExecutorType,但如果在我的步骤中,我使用两个映射器与不同的模板,我得到一个异常,说我不能改变ExecutorType在交易期间,但我不知道如何解决这个问题。任何帮助都是感激的。下面是一些XML配置。
<!-- connect to database -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<ref local="mainDataSource" />
</property>
</bean>
<bean id="mainDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.pass}" />
</bean>
<bean id="infrastructureSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations"
value="classpath*:com/generali/danni/sipo/mdv/dao/mybatis/*Mapper*.xml" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<bean id="infrastructureSqlSessionTemplateBatch" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="infrastructureSqlSessionFactory" />
<constructor-arg index="1" value="BATCH" />
</bean>
<bean id="infrastructureSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="infrastructureSqlSessionFactory" />
</bean>
<bean id="infrastructureAbstractMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"
abstract="true">
<property name="sqlSessionTemplate" ref="infrastructureSqlSessionTemplate" />
</bean>
<bean id="infrastructureAbstractMapperBatch" class="org.mybatis.spring.mapper.MapperFactoryBean"
abstract="true">
<property name="sqlSessionTemplate" ref="infrastructureSqlSessionTemplateBatch" />
</bean>
<bean id="erroriMapper" parent="infrastructureAbstractMapper">
<property name="mapperInterface"
value="com.mdv.dao.ErroriMapper" />
</bean>
<bean id="stagingFileMapper" parent="infrastructureAbstractMapperBatch">
<property name="mapperInterface"
value="com.mdv.dao.StagingFileMapper" />
</bean>
这里我有两个映射器,一个我想在批处理模式下使用,另一个在简单模式下使用。我怎样才能完成这个任务?每一个建议我们都很感激。提前感谢,很抱歉我的英语不好。
经过多次尝试,我决定改变我的方法来解决这个问题。我以编程方式定义了一个新的SqlSessionFactory,用批处理执行器生成一个新的SqlSession,并使用了这个SqlSession。因为它是一个完全不同的SqlSessionFactory,它似乎不会给问题,如果我使用2个不同的ExecutorType。下面是一个示例工作代码:
Environment environment = new Environment("TEST", new JdbcTransactionFactory(), dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMappers("com.mdv.dao");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(configuration);
SqlSession sqlSession = ssf.openSession(ExecutorType.BATCH);
try {
StagingFileMapper sfm = sqlSession.getMapper(StagingFileMapper.class);
for(Record r : staging){
StagingFile sf = new StagingFile();
//set your sf fields
sfm.insert(sf);
}
sqlSession.commit();
} catch (Exception e) {
//manage exception
}
finally{
sqlSession.close();
}