JavaConfig:データ・ソースの動的切り替えとトランザクションのオープン


1.データソースを動的に切り替える
1.1複数のデータ・ソースの宣言
@Bean(name = "oracledb")
public DataSource handlerOracle(List attributes) {
    return handlerDatasource(attributes);
}

@Bean(name = "mysqldb")
public DataSource handlerMysql(List attributes) {
    return handlerDatasource(attributes);
}

1.2動的データソースのアセンブリ
@Bean
public DynamicDataSource dynamicDataSource(
        @Qualifier("mysqldb") DataSource mysqldb,
        @Qualifier("oracledb") DataSource oracledb) {
    DynamicDataSource source = new DynamicDataSource();
    Map<Object, Object> map = new HashMap<>();
    map.put("mysqldb", mysqldb);
    map.put("oracledb", oracledb);
    //        
    source.setTargetDataSources(map);
    return source;
}

1.3 JDBCテンプレートの組み立て
@Bean
public JdbcTemplate jdbcTemplate(DynamicDataSource dynamicDataSource) {
    return new JdbcTemplate(dynamicDataSource);
}

1.4データソースを切り替えるクラスの定義
package com.sitech.ddoe.server.core;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

    public static final String DATA_SOURCE_MYSQL = "mysqldb";
    public static final String DATA_SOURCE_ORACLE = "oracledb";
    private static final ThreadLocal contextHolder = new ThreadLocal();

    public static void setCustomerType(String customerType) {
        contextHolder.set(customerType);
    }

    public static String getCustomerType() {
        return contextHolder.get();
    }

    public static void clearCustomerType() {
        contextHolder.remove();
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return getCustomerType();
    }

}

1.5必要に応じてデータソースを切り替える
if(dbType == DBTypeConstant.DBTYPE_MYSQL)
    DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_MYSQL);
else if(dbType == DBTypeConstant.DBTYPE_ORACLE)
    DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_ORACLE);

2.取引を開く
2.1取引マネージャのアセンブリ
@Bean
public PlatformTransactionManager transactionManager(DynamicDataSource dynamicDataSource) {
    return new DataSourceTransactionManager(dynamicDataSource);
}

2.2 JDBC操作方法に@Transactionalを追加する
@Transactional
@Override
public int insert(InsertSqlData insertSqlData) {
     //  ...
}

その後、テストは効果がありません.以下の点に注意してください.
2.3データソースの自動コミットのクローズ
   true,       
dataSource.setDefaultAutoCommit(false);

2.4構成クラスでトランザクション注記を開く
@Configuration
@EnableTransactionManagement
public class ServerReader {

}

@EnableTransactionManagementはxmlの
再度テストすると、トランザクションは機能しますが、mysqlでプライマリ・キーが自己増加している場合は、トランザクションがロールバックしても、プライマリ・キーの値が増加します.例えば、1回目のidの新規作成に成功し、2回目のidの新規作成に失敗した場合、3回目のIDの新規作成に失敗した場合、データベースに挿入されるプライマリ・キーは2ではなく4です.これはmysqlのデザインです.