ホームページ >Java >&#&チュートリアル >スプリングブートでmybatisの複数のデータソースの動的切り替えを実装する方法
springboot での mybatis と mysql の導入についてはここでは説明しません。理解できない場合は、springboot での mysql と mybatis の導入を参照してください。 。
データソースの構成は次のとおりです。
datasource: master: type: com.alibaba.druid.pool.DruidDataSource jdbc-url: jdbc:mysql://127.0.0.1:3306/sbac_master?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver log: type: com.alibaba.druid.pool.DruidDataSource jdbc-url: jdbc:mysql://127.0.0.1:3306/sbac_log?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver
mybatis の構成は次のとおりです。
mybatis: config-location: classpath:mybatis-config.xml mapper-locations: classpath:com/lazycece/sbac/mysql/data/dao/*/mapper/*.xml
自動構成機能ここでは springboot のものがすでに使用されており、mybatis 情報の構成はデータ ソースを手動で指定するだけです。以下に示すように、マスターとログの 2 つのデータ ソースが指定され、マスターがデフォルトのデータ ソースとして設定されます。
@Configuration public class MultiDataSource { public static final String MASTER_DATA_SOURCE = "masterDataSource"; public static final String LOG_DATA_SOURCE = "logDataSource"; @Bean(name = MultiDataSource.MASTER_DATA_SOURCE) @ConfigurationProperties(prefix = "datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = MultiDataSource.LOG_DATA_SOURCE) @ConfigurationProperties(prefix = "datasource.log") public DataSource logDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "dynamicDataSource") public DynamicDataSource dataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); Map<Object, Object> dataSourceMap = new HashMap<>(4); dataSourceMap.put(MASTER_DATA_SOURCE, masterDataSource()); dataSourceMap.put(LOG_DATA_SOURCE, logDataSource()); dynamicDataSource.setTargetDataSources(dataSourceMap); return dynamicDataSource; } }
After構成情報の紹介に続いて、マルチデータ ソースの切り替えを実装する方法について説明します。 AbstractRoutingDataSource クラスの detectCurrentLookupKey メソッドを実装してデータ ソースの動的ルーティングを実装し、スレッドが影響を受けないようにデータ ソース キーを格納する ThreadLocal スレッド保護変数を設定します。
package com.lazycece.sbac.mysql.multi.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * @author lazycece */ public class DynamicDataSource extends AbstractRoutingDataSource { private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDataSource.class); private static final ThreadLocal<String> DATA_SOURCE_KEY = new ThreadLocal<>(); static void changeDataSource(String dataSourceKey) { DATA_SOURCE_KEY.set(dataSourceKey); } static void clearDataSource() { DATA_SOURCE_KEY.remove(); } @Override protected Object determineCurrentLookupKey() { String key = DATA_SOURCE_KEY.get(); LOGGER.info("current data-source is {}", key); return key; } }
次に、AOP を使用してデータ ソースの動的切り替えを実装します。アノテーションとアスペクトは次のように定義されます:
@Documented @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface DataSource { String value(); } @Component @Aspect public class DataSourceConfig { @Before("@annotation(dataSource)") public void beforeSwitchDataSource(DataSource dataSource) { DynamicDataSource.changeDataSource(dataSource.value()); } @After("@annotation(DataSource)") public void afterSwitchDataSource() { DynamicDataSource.clearDataSource(); } }
動的データ ソースの切り替えでは、以下に示すように、ビジネスで @DataSource アノテーションを使用して、使用するデータ ソースを示すだけで済みます (キー コードのみがここに掲載されています):
以上がスプリングブートでmybatisの複数のデータソースの動的切り替えを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。