2013-05-29 18 views
6

Ho 2 diverse origini dati, uno da leggere e un altro per scrivere i risultati come qui di seguito:Usando 2 differenti origini dati: Primavera in batch

  • ItemReader dovrebbe ottenere i dati da dataSource_1.
  • ItemWriter deve scrivere dati su dataSource_2.

sapere che lettore e scrittore si trovano nello stesso tasklet.

Come per la documentazione, siamo in grado di configurare un unico gestore delle transazioni a tasklet

In questo scenario, come faccio io uso il gestore delle transazioni qui?

Non posso fare affidamento sul contenitore e non sto usando il livello ORM (JPA ..), uso il driver diretto JDBC per leggere nel database 1 e scrivere nel database2.

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

come ho potuto configurare la transazione JTA/XA (Atomikos) con Batch primavera?

risposta

0

Dimentica Spring Batch.

Si supponga di aver bisogno di scrivere un servizio applicativo, che legge da una fonte dati1 e scrive in datasource2, che cosa dovresti fare?

La transazione distribuita è la risposta per voi. Ciò comporta ovviamente configurazioni extra. Se ci si trova in un contenitore J2EE (Websphere, Weblogic, JBoss, ecc.), Il gestore delle transazioni fornito deve essere in grado di gestire la transazione distribuita. Dovresti essere in grado di trovare l'implementazione TransactionManager corrispondente in primavera per ognuna di queste piattaforme. Quello che ti serve è solo configurare l'origine dati (che dovrebbe essere anche sotto il contenitore) per usare i driver XA-aware, e nella tua app usare il gestore delle transazioni corrispondente e cercare le origini dati XA-aware di JNDI

Tuttavia se non puoi fare affidamento sul contenitore (ad esempio stai scrivendo un'app standalone e così via), dovrai trovare un gestore delle transazioni che sia in grado di farlo. Atomikos è una delle più famose librerie JTA/XA gratuite.

Naturalmente, se si è al cento per cento sicuri che tutte le azioni di transazione-aware sarà in datasource2, si può considerare l'utilizzo di gestore delle transazioni origine dati solo per datasource2, ma onestamente non è un approccio preferito io suggerisco.

2

È necessario utilizzare un driver compatibile XA per le 2 origini dati con un gestore transazioni JTA.

vedono questo article e questo one se non si ha familiarità con le transazioni distribuite

riguarda

1

Se il lettore può essere al di fuori della transazione, è possibile utilizzare solo responsabile TRX dello scrittore. Se hai bisogno del lettore e dello scrittore nella stessa transazione, probabilmente hai bisogno di un gestore delle transazioni compatibile con XA.

Problemi correlati