Heim >Java >javaLernprogramm >So implementieren Sie das dynamische Umschalten mehrerer Mybatis-Datenquellen in Springboot
Die Einführung von Mybatis und MySQL in Springboot wird hier nicht besprochen. Wenn Sie es nicht verstehen, können Sie sich auf die Einführung von MySQL und Mybatis in Springboot beziehen.
Die Datenquellenkonfiguration lautet wie folgt:
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
Die Konfiguration von Mybatis wird wie folgt eingeführt:
mybatis: config-location: classpath:mybatis-config.xml mapper-locations: classpath:com/lazycece/sbac/mysql/data/dao/*/mapper/*.xml
Die automatische Konfigurationsfunktion von Springboot wird zum Konfigurieren von Mybatis-Informationen verwendet, die Datenquelle wird jedoch manuell angegeben. Wie unten gezeigt, werden zwei Datenquellen, Master und Protokoll, angegeben und Master als Standarddatenquelle festgelegt:
@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; } }
Nach der Einführung der Konfigurationsinformationen ist es an der Zeit, darüber zu sprechen, wie um die Umschaltung mehrerer Datenquellen zu implementieren. Wir implementieren die Methode „determineCurrentLookupKey“ der Klasse „AbstractRoutingDataSource“, um dynamisches Routing der Datenquelle zu implementieren, und legen die Thread-Schutzvariable „ThreadLocal“ fest, um den Datenquellenschlüssel zu speichern, um sicherzustellen, dass Threads nicht betroffen sind.
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; } }
Dann wird AOP verwendet, um den dynamischen Wechsel von Datenquellen zu implementieren. Die Anmerkungen und Aspekte sind wie folgt definiert:
@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(); } }
Für den dynamischen Datenquellenwechsel muss nur @DataSource verwendet werden Geschäft Verwenden Sie einfach Kommentare, um die Datenquelle anzugeben, die Sie verwenden müssen, wie unten gezeigt (hier wird nur der Schlüsselcode veröffentlicht):
@Service public class DynamicDataSourceServiceImpl implements DynamicDataSourceService { @Resource private UserDao userDao; @Resource private SystemLogDao systemLogDao; @Override @DataSource(value = MultiDataSource.MASTER_DATA_SOURCE) public void addUserInfo(User user) { userDao.insert(user); } @Override @DataSource(value = MultiDataSource.MASTER_DATA_SOURCE) public User getUserInfo(String username) { return userDao.findByUsername(username); } @Override @DataSource(value = MultiDataSource.LOG_DATA_SOURCE) public void addSystemLog(SystemLog systemLog) { systemLogDao.insert(systemLog); } @Override @DataSource(value = MultiDataSource.LOG_DATA_SOURCE) public List<SystemLog> getSystemLogInfo(Date beginTime, Date endTime) { return systemLogDao.findByCreateTime(beginTime, endTime); } }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie das dynamische Umschalten mehrerer Mybatis-Datenquellen in Springboot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!