2013-04-16 45 views
1

我使用的是Oracle 11g的WebLogic 10.3.3,並且一旦從Spring ResourcelessTransactionManager(主要用於測試)切換到生產DataSourceTransactionManager,就會面臨Spring批處理的奇怪問題。首先,我使用WebLogics默認驅動程序oracle.jdbc.xa.client.OracleXADataSource,但是由於Spring無法設置隔離級別,因此失敗 - 這也記錄在hereSpring的批處理DataSourceTransactionManager在Oracle上失敗

我很好,因爲我不需要全球交易,所以我切換到oracle.jdbc.driver.OracleDriver。現在,我收到錯誤消息

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

我不找了很多關於這個信息,有一個錯誤,但應該已經很久以前在Oracle 7。它看起來像一個事務開始之前(?)實際的作業被添加到JobRepository,並沒有正確關閉或類似的東西。

回答

1

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); 
    } 
} 
0
<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 
*/