2013-05-29 43 views
6

我有2點不同的數據源,一個讀取,另一個寫出結果如下圖所示:使用2點不同的數據源:春季批次

  • ItemReader應該從dataSource_1獲取數據。
  • ItemWriter應該將數據寫入dataSource_2。

知道讀寫器在同一個tasklet中。

按文檔,我們可以配置在微進程

在這種情況下一個事務管理器,我用的事務管理器怎麼會在這裏?

我不能依賴容器,我沒有使用ORM層(JPA ..),我使用直接JDBC驅動程序讀取數據庫1並寫入數據庫2。

當前的conf:

<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${batch.or.jdbc.driver}" /> 
    <property name="url" value="${batch.or.jdbc.url}" /> 
    <property name="username" value="${batch.or.jdbc.user}" /> 
    <property name="password" value="${batch.or.jdbc.password}" /> 
</bean> 

<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${batch.caux.jdbc.driver}" /> 
    <property name="url" value="${batch.caux.jdbc.url}" /> 
    <property name="username" value="${batch.caux.jdbc.user}" /> 
    <property name="password" value="${batch.caux.jdbc.password}" /> 
</bean> 

<bean id="baseReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
     <property name="dataSource" ref="dataSource1" /> 
</bean> 

<bean id="baseWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
     <property name="dataSource2" ref="dataSource2" /> 
     <property name="sql" value="${batch.param.insert}" /> 
</bean> 

我如何可以配置JTA/XA事務(Atomikos公司)與Spring Batch的?

回答

0

忘掉Spring Batch。

假設您需要編寫一個應用程序服務,該應用程序服務從一個datasource1讀取並寫入到datasource2,您需要做什麼?

分佈式事務是你的答案。這當然涉及額外的配置。如果你在J2EE容器(Websphere,Weblogic,JBoss等)中,那麼他們提供的事務管理器應該能夠處理分佈式事務。您應該能夠在Spring中爲每個平臺找到相應的TransactionManager實現。你需要的只是配置數據源(它應該也在容器下)以使用支持XA的驅動程序,並且在你的應用程序中使用相應的事務管理器,並且通過JNDI查找XA感知數據源。然而,如果通過JNDI查找XA感知數據源你不能依賴容器(例如,你正在編寫一個獨立的應用程序,等等),你將需要找到一個有能力的事務管理器。 Atomikos是最着名的免費JTA/XA庫之一。當然,如果你百分之百確定所有的事務感知操作都在datasource2中,你可以考慮只對datasource2使用datasource事務管理器,但老實說這不是我會建議的首選方法。

2

您需要爲JTA事務管理器爲您的2個數據源使用與XA兼容的驅動程序。

看到這個articleone如果你不熟悉分佈式事務

問候

1

如果讀者可交易外,你可以使用作家的TRX經理而已。如果你需要讀者和作者在同一個交易中,可能你需要一個兼容XA的交易管理器。