优秀的编程知识分享平台

网站首页 > 技术文章 正文

Spring Boot 整合MyBatis+Druid 实现多数据源管理?

nanyue 2025-02-15 16:46:23 技术文章 9 ℃

在SpringBoot中要实现对于多数据源的管理,需要涉及到多数据源的配置、多数据源的查询关联等操作,下面我们就通过SpringBoot整合MyBatis和Druid来实现多数据源管理。

添加依赖

在POM文件中添加MyBatis和Druid的相关依赖,如下所示。


    
    
        org.springframework.boot
        spring-boot-starter
    

    
    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
    

    
    
        com.alibaba
        druid-spring-boot-starter
    
    
    
    
        mysql
        mysql-connector-java
    

配置数据源

添加依赖完成之后,接下来就是在Application的配置文件中添加多个数据源,例如下面我们添加了两个数据源一个是主数据源一个是从数据源如下所示。

spring:
  datasource:
    dynamic:
      primary: master # 设置主数据源
      datasource:
        master: # 主数据源
          url: jdbc:mysql://localhost:3306/master_db
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
        slave: # 从数据源
          url: jdbc:mysql://localhost:3306/slave_db
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource

配置主数据源和从数据源

接下来就是需要分别对主从数据源进行配置以及配置对应的MyBatis配置。如下所示,先对住数据源进行配置。

@Configuration
@MapperScan(basePackages = "com.example.mapper", sqlSessionTemplateRef  = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {

    @Primary
    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "masterSqlSessionTemplate")
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

接下来对从数据源,与主数据源类似的配置,如下所示。

@Configuration
@MapperScan(basePackages = "com.example.mapper.slave", sqlSessionTemplateRef  = "slaveSqlSessionTemplate")
public class SlaveDataSourceConfig {

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.slave")
    public DataSource slaveDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

使用不同数据源的MyBatis Mapper

通过上面的配置,我们就可以根据不同的数据源来使用不同数据源的Mapper了,例如主数据源的Mapper可以放在com.example.mapper包下,而从数据源的Mapper可以放在com.example.mapper.slave包下。

接下来我们就可以根据不同的业务来选择不同的Mapper在服务层进行调用了。

配置Druid监控

最后,可以在application.yml中增加Druid的监控配置以便于监控数据源的性能,但是需要注意,这个配置的需要在内网环境中配置,避免出现Druid泄漏导致的安全问题。

spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        login-username: admin
        login-password: admin
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"

访问
http://localhost:8080/druid即可查看Druid的监控信息。

总结

通过上面的步骤,我们就可以实现根据不同的业务选择不同的数据源到来实现多数据源的切换管理,当然我们还可以根据注解的方式来通过切换线程上下文的方式来进行切换。有兴趣的读者可以了解一下。

Tags:

最近发表
标签列表