Spring Batch DataSourceTransactionManager fails on Oracle

六眼飞鱼酱① 提交于 2019-12-06 05:40:28

JobI was able to solve this by setting the Isolation level for all transactions to READ_COMMITTED. By default, Spring sets that to SERIALIZABLE which is very strict (but perfectly fine). This didn't work on my machine although Oracle should support it:

http://www.oracle.com/technetwork/issue-archive/2005/05-nov/o65asktom-082389.html

Here's my code - first for the configuration:

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
    <property name="dataSource" ref="dataSource" />
    <property name="isolationLevelForCreate" value="ISOLATION_READ_COMMITTED" />
</bean>

...and this is for the job itself (simplified):

public class MyFancyBatchJob {
  @Transactional(isolation=Isolation.READ_COMMITTED)
  public void addJob() {
    JobParameters params = new JobParametersBuilder().toJobParameters();
    Job job = jobRegistry.getJob("myFancyJob");
    JobExecution execution = jobLauncher.run(job, params);
  }
}
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
  <property name="url" value="jdbc:oracle:thin:<username>/<password>@<host>:1521:<sid>" /> 
</bean> 

  <jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="org/springframework/batch/core/schema-drop-oracle10g.sql" /> 
    <jdbc:script location="org/springframework/batch/core/schema-oracle10g.sql" />
  </jdbc:initialize-database> 

  <bean id="jobRepository"
    class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="databaseType" value="oracle" />
     <property name="tablePrefix" value="BATCH_"/>
        <property name="isolationLevelForCreate" value="ISOLATION_DEFAULT"/>
  </bean>

  <bean id="jobLauncher"
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
  </bean>

/*for spring batch with oracle 10g and 11g 
*/
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!