2

我将 WebLogic 10.3.3 与 Oracle 11g 一起使用,一旦我从 Spring ResourcelessTransactionManager(主要用于测试)切换到生产性DataSourceTransactionManager ,就会遇到 Spring Batch 的一个奇怪问题。首先,我使用了 WebLogics 默认驱动程序oracle.jdbc.xa.client.OracleXADataSource,但由于 Spring 无法设置隔离级别,此驱动程序失败 - 这也记录在此处

我对此很好,因为无论如何我都不需要全局事务,所以我切换到oracle.jdbc.driver.OracleDriver. 现在我收到错误消息

ORA-01453: SET TRANSACTION must be first statement of transaction

我没有找到很多这方面的信息,有一个错误,但很久以前应该在 Oracle 7 中修复。看起来事务是在(?)实际作业被添加到 JobRepository 之前开始的,并且没有正确关闭或类似的东西。

4

2 回答 2

2

JobI 能够通过将所有事务的隔离级别设置为READ_COMMITTED. 默认情况下,Spring 将SERIALIZABLE其设置为非常严格(但非常好)。尽管 Oracle 应该支持它,但这在我的机器上不起作用:

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

这是我的代码 - 首先是配置:

<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>

...这是为了工作本身(简化):

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);
  }
}
于 2013-04-16T12:02:59.397 回答
1
<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 
*/
于 2016-01-14T10:51:15.980 回答