2012-10-10 5 views
2

Je dois développer une application qui utilise deux sources de données au printemps. Les deux sources de données doivent être gérées par une transaction de sorte que s'il y a des exceptions dans une source de données, l'autre source de données devrait également revenir en arrière. Mon auteur est maintenant que mon implantation actuelle avec jta ne fonctionne pas. Lorsque j'ai testé mon code, si la source de données a une erreur, l'autre source de données n'a pas été annulée. C'est juste engagé. Voici mon fichier de configuration:Transaction JTA avec plusieurs sources de données au printemps

<bean id="parentDataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     abstract="true"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="username" value="root"/> 
</bean> 

<bean id="firstDataSource" parent="parentDataSource"> 
    <property name="url" value="jdbc:mysql://localhost:3306/test"/> 
</bean> 

<bean id="secondDataSource" parent="parentDataSource"> 
    <property name="url" value="jdbc:mysql://localhost:3306/test2"/> 
</bean> 

<bean id="jtaTransactionManager" 
     class="org.springframework.transaction.jta.JtaTransactionManager"> 
</bean> 

<bean id="customerDAO" class="springapp.datasource.CustomerDAO"> 
    <property name="dataSource"> 
     <ref local="firstDataSource"/> 
    </property> 
    <property name="dataSource2"> 
     <ref local="secondDataSource"/> 
    </property> 
    <property name="jtaTransactionManager"> 
     <ref local="jtaTransactionManager"/> 
    </property> 
</bean> 

Le code de transaction dans le customerDAO est:

public class CustomerDAO { 
    private DataSource dataSource; 
    private DataSource dataSource2; 
    private JtaTransactionManager jtaTransactionManager; 

    public DataSource getDataSource2() { 
     return dataSource2; 
    } 

    public void setDataSource2(DataSource dataSource2) { 
     this.dataSource2 = dataSource2; 
    } 

    public JtaTransactionManager getJtaTransactionManager() { 
     return jtaTransactionManager; 
    } 

    public void setJtaTransactionManager(JtaTransactionManager jtaTransactionManager) { 
     this.jtaTransactionManager = jtaTransactionManager; 
    } 

    public DataSource getDataSource() { 
     return dataSource; 
    } 

    public void setDataSource(DataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    public void insertItem(Item item){ 


     TransactionTemplate tt = new TransactionTemplate(jtaTransactionManager); 
     tt.execute(new TransactionCallback<Object>(){ 
      @Override 
      public Object doInTransaction(TransactionStatus arg0) { 
       JdbcTemplate jt = new JdbcTemplate(dataSource); 
       String sql = "insert into item(name,price) values ('aaaa',11);"; 
       jt.setDataSource(dataSource); 
       jt.update(sql); 
       sql = "insert into item(name,price) values ('aaaa',12);"; 
       jt.setDataSource(dataSource2); 
       jt.update(sql); 
       return null; 
      } 
     }); 
    } 
} 

Quelqu'un peut-il me dire où est le problème?

Répondre

2

Vous devez utiliser des sources de données XA. Les transactions JDBC ne couvrent qu'une seule source de données. Pour étendre la portée de la transaction à plusieurs sources de données, les sources de données XA doivent être utilisées.

1

Vous pouvez implémenter AbstractRoutingDataSource pour gérer plusieurs sources de données et la connexion à la source de données sera basée sur vos paramètres internes.

Questions connexes