3

Springで2つのデータソースを使用するアプリケーションを開発する必要があります。2つのデータソースはトランザクションによって管理する必要があります。これにより、一方のデータソースで例外が発生した場合に、もう一方のデータソースもロールバックする必要があります。今の私の推測は、jtaによる私の現在の移植は機能しないということです。コードをテストしたときに、一方のデータソースにエラーがある場合、もう一方のデータソースはロールバックしませんでした。コミットしたばかりです。これが私の設定ファイルです:

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

customerDAOのトランザクションコードは次のとおりです。

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;
            }
        });
    }
}

誰かが問題がどこにあるか教えてもらえますか?

4

2 に答える 2

2

XA データ ソースを使用する必要があります。JDBC トランザクションは、単一のデータソースにのみ適用されます。トランザクション スコープを複数のデータソースに拡張するには、XA データソースを使用する必要があります。

于 2012-10-10T08:33:52.523 に答える
1

複数のデータソースを処理するために AbstractRoutingDataSource を実装でき、データソース接続は内部設定に基づきます。

于 2017-05-22T12:26:08.493 に答える