1

Tomcat にデプロイされた同じ Spring ベースの REST アプリケーションを使用する 2 つのクライアントがあります。クライアントに応じて、データ ソースとトランザクション マネージャーのどちらかを選択する必要があります。実行時に使用するトランザクション マネージャーを選択するにはどうすればよいですか?

    <bean id="First_dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="url" value="${First_jdbc.url}" />
            <property name="driverClassName" value="${First_jdbc.driverClassName}" />
            <property name="username" value="${First_jdbc.username}" />
            <property name="password" value="${First_jdbc.password}" />
            <property name="removeAbandoned" value="true" />
            <property name="initialSize" value="20" />
            <property name="maxActive" value="30" />
            <!-- <property name="defaultAutoCommit" value="false" /> -->
   </bean>

    <bean id="Second_dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="url" value="${Second_jdbc.url}" />
            <property name="driverClassName" value="${Second_jdbc.driverClassName}" />
            <property name="username" value="${Second_jdbc.username}" />
            <property name="password" value="${Second_jdbc.password}" />
            <property name="removeAbandoned" value="true" />
            <property name="initialSize" value="20" />
            <property name="maxActive" value="30" />
            <!-- <property name="defaultAutoCommit" value="false" /> -->
   </bean>

<bean id="First_TransactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        scope="singleton">
        <property name="dataSource" ref="First_dataSource" />
        <qualifier value="SC_TM"></qualifier>
</bean>

<bean id="Second_TransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
          scope="singleton">
          <property name="dataSource" ref="Second_dataSource" />
          <qualifier value="Second_TM"></qualifier>
</bean>   

コードでは、実行時に @Transactional("????") をどのように選択しますか。org.springframework.jdbc.datasource.DataSourceTransactionManager でそれができない場合、他の方法はありますか?

4

5 に答える 5

0

を使用する@Transactionalと、次のようにトランザクション マネージャーを指定できます。

@Transactional("First_TransactionManager")

また

@Transactional("Second_TransactionManager")

どちらを使用するかによって異なります。トランザクション メソッド内で正しいエンティティ マネージャー/セッション ファクトリを使用するようにしてください。で注入するものも指定する必要があります@PersistenceContext("nameOfPersistenceUnit")

于 2014-04-06T11:46:10.980 に答える
0
<tx:advice id="First_txAdvice" transaction-manager="First_TransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="First_daoimplOperation"
        expression="execution(* in.company.common.service.CommonServiceImpl.*(..))" />

    <aop:advisor advice-ref="First_txAdvice" pointcut-ref="First_daoimplOperation" />
</aop:config>

<tx:advice id="Second_txAdvice" transaction-manager="Second_TransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="Second_daoimplOperation"
        expression="execution(* in.company.common.service.CommonServiceImpl.*(..))" />

    <aop:advisor advice-ref="Second_txAdvice" pointcut-ref="Second_daoimplOperation" />
</aop:config>

すべてのデータベース関連サービスは、この場合のようにポイントカットに一致する必要があります: in.company.common.service.CommonServiceImpl.*(..))

于 2014-04-11T08:05:02.567 に答える
0

2 つのトランザクション マネージャー間で変更する理由がわかりません。トランザクション マネージャー チェーン ソリューションを確認する必要があるかもしれませんが、これが必要な場合は、Repo メソッドに @transactional を追加し、2 Repos を実行してサービスから管理できます。そうでなければ、AOPを使用して解決策を実行できると信じていますが、それについて考えるにはもっと時間が必要です。

于 2014-04-06T16:12:51.043 に答える
0

問題は AOP によって解決されます。

  1. 複数のデータ ソースと対応するトランザクション マネージャーを定義します (基本的な質問で示したように)。
  2. First_dataSource が First_TransactionManager にマップされ、Second_dataSource が Second_TransactionManager にマップされます
  3. ビジネス ルールに応じて、プログラムで使用するデータ ソースを選択します。私の場合、それは orgId でした

    public class DataSourceProvider { @Autowired DataSource First_dataSource; @Autowired DataSource Second_dataSource;

        public DataSource getDataSource(int orgId) {
    
            if (orgId == Constants.BUSINESS_PARTY_1)
                return Second_dataSource;
            else
                return First_dataSource;
        }
    
        public DataSource getFirst_dataSource() {
            return First_dataSource;
        }
    
        public void setFirst_dataSource(DataSource First_dataSource) {
            First_dataSource = First_dataSource;
        }
    
        public DataSource getSecond_dataSource() {
            return Second_dataSource;
        }
    
        public void setSecond_dataSource(DataSource Second_dataSource) {
            Second_dataSource = Second_dataSource;
        }
    }
    
  4. AOP 構成:

于 2014-04-11T07:44:59.897 に答える