Heim  >  Artikel  >  Java  >  So implementieren Sie das dynamische Umschalten mehrerer Mybatis-Datenquellen in Springboot

So implementieren Sie das dynamische Umschalten mehrerer Mybatis-Datenquellen in Springboot

WBOY
WBOYnach vorne
2023-05-12 19:43:041145Durchsuche

Einführung der Multi-Datenquellen-Konfiguration

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;
    }
}

Dynamische Datenquellen-Routing-Implementierung

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();
    }
}

Verwendung des dynamischen Datenquellenwechsels

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen