SpringBoot中如何配置多数据源

2020-07-27  本文已影响0人  砒霜拌辣椒

当业务数据量达到了一定程度,DBA需要合理配置数据库资源。即配置主库的机器高配置,把核心高频的数据放在主库上;把次要的数据放在从库,低配置。开源节流嘛,就这个意思。把数据放在不同的数据库里,就需要通过不同的数据源进行操作数据。

1、Maven导包

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>

2、主库配置

@Configuration
@MapperScan(
        basePackages = "net.zhaoxiaobin.mybatis.dao.master", // Mapper映射接口,多数据源需要分开
        sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {

    /**
     * 数据源配置
     * 多数据源配置的时候必须要有一个主数据源,用@Primary标志该Bean
     *
     * @return
     */
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "master.datasource")
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }

    /**
     * 事务管理器
     * 使用代理对象获取数据源创建事务管理器
     *
     * @return
     */
    @Bean
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    /**
     * 创建mybatis会话工厂
     * 指定数据源和mybatis映射文件(多数据源需要分开)
     *
     * @return
     * @throws Exception
     */
    @Bean
    @Primary
    public SqlSessionFactory masterSqlSessionFactory() throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource());
        sessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml"));
        return sessionFactory.getObject();
    }
}
master:
  datasource:
    url: jdbc:mysql://148.70.153.63:3306/ttms?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
    username: root
    password: password
    driverClassName: com.mysql.cj.jdbc.Driver
    initialSize: 5
    maxActive: 50
    minIdle: 0
    maxWait: 60000
    useUnfairLock: true # 禁用公平锁

3、从库配置

@Configuration
@MapperScan(
        basePackages = "net.zhaoxiaobin.mybatis.dao.cluster",
        sqlSessionFactoryRef = "clusterSqlSessionFactory")
public class ClusterDataSourceConfig {

    /**
     * 数据源配置
     *
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "cluster.datasource")
    public DataSource clusterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }

    /**
     * 事务管理器
     * 使用代理对象获取数据源创建事务管理器
     *
     * @return
     */
    @Bean
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    /**
     * 创建mybatis会话工厂
     * 指定数据源和mybatis映射文件(多数据源需要分开)
     *
     * @return
     * @throws Exception
     */
    @Bean
    public SqlSessionFactory clusterSqlSessionFactory() throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource());
        sessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/cluster/*.xml"));
        return sessionFactory.getObject();
    }
}
cluster:
  datasource:
    url: jdbc:mysql://148.70.153.63:3306/ttms?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
    username: root
    password: password
    driverClassName: com.mysql.cj.jdbc.Driver
    initialSize: 1
    maxActive: 10
    minIdle: 0
    maxWait: 60000
    useUnfairLock: true # 禁用公平锁

4、工程结构

├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── zxb
        │           └── mybatis
        │               ├── MybatisMutilDataSourceApplication.java
        │               ├── config
        │               │   ├── ClusterDataSourceConfig.java
        │               │   └── MasterDataSourceConfig.java
        │               ├── dao
        │               │   ├── cluster
        │               │   │   └── AuthClientServiceDao.java
        │               │   └── master
        │               │       └── BaseUserDao.java
        │               ├── domain
        │               │   └── bo
        │               │       ├── AuthClientServiceBO.java
        │               │       └── BaseUserBO.java
        │               ├── service
        │               │   ├── MutilDatasourceService.java
        │               │   └── impl
        │               │       └── MutilDatasourceServiceImpl.java
        │               └── web
        │                   └── MutilDatasourceController.java
        └── resources
            ├── application.yml
            ├── logback-spring.xml
            ├── mapper
            │   ├── cluster
            │   │   └── authMapper.xml
            │   └── master
            │       └── userMapper.xml
            ├── mybatis-config.xml
            └── sql
                └── sql.sql

参考链接

代码地址

上一篇下一篇

猜你喜欢

热点阅读