JavaConfig:データ・ソースの動的切り替えとトランザクションのオープン
1.データソースを動的に切り替える
1.1複数のデータ・ソースの宣言
1.2動的データソースのアセンブリ
1.3 JDBCテンプレートの組み立て
1.4データソースを切り替えるクラスの定義
1.5必要に応じてデータソースを切り替える
2.取引を開く
2.1取引マネージャのアセンブリ
2.2 JDBC操作方法に@Transactionalを追加する
その後、テストは効果がありません.以下の点に注意してください.
2.3データソースの自動コミットのクローズ
2.4構成クラスでトランザクション注記を開く
@EnableTransactionManagementはxmlの
再度テストすると、トランザクションは機能しますが、mysqlでプライマリ・キーが自己増加している場合は、トランザクションがロールバックしても、プライマリ・キーの値が増加します.例えば、1回目のidの新規作成に成功し、2回目のidの新規作成に失敗した場合、3回目のIDの新規作成に失敗した場合、データベースに挿入されるプライマリ・キーは2ではなく4です.これはmysqlのデザインです.
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のデザインです.