SpringBoot配置多个数据源(不同的)

首先添加依赖包:

com.microsoft.sqlserver
sqljdbc4
4.0

不然启动会提示错误:找不到驱动

配置文件(配置文件的要求很严格不然会参数注入失败甚至不会连接
spring:
datasource:
type:
master:
url,这些层次要分明):

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    master:
      url: jdbc:mysql://地址:端口号/usthe?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
      platform: mysql
      initialSize: 1
      minIdle: 1
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: select 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: false
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,stat用于监控界面,'wall'用于防火墙防御sql注入, slf4j用于druid记录sql日志
      #      filters: stat,slf4j,wall
      filters: stat,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 合并多个DruidDataSource的监控数据
      useGlobalDataSourceStat: false
    #      type: com.alibaba.druid.pool.DruidDataSource
    //这里特别说清楚格式一定要严格,否则回去不到数据,这个是SqlService数据库的配置
      third:
        url: jdbc:sqlserver://ip地址:端口;/表名?DatabaseName=true
        username: 用户名
        password: 密码
        //驱动
        driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

连接代码:使用了连接池,此后在连接其他数据源只要修改路径、账号和密码即可

package com.bsj.sim.config.database;

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import com.bsj.sim.util.mybatis.DataSourceEnv;
import com.bsj.sim.util.mybatis.MybatisFactory;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


@Configuration
@MapperScan(basePackages = DataSourceConfiguration.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class DataSourceConfiguration {

    // 当前这个包精确到 master 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.bsj.sim.mapper";
    //必须在com.bsj.sim.mapper包下的xml格式
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    private static final Logger logger = LoggerFactory.getLogger(DataSourceConfiguration.class);

    static DataSourceEnv env = DataSourceEnv.base;

    static DataSourceEnv report = DataSourceEnv.reportBase;

    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String userName;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.master.driver-class-name}")
    private String driver;
    @Value("${spring.datasource.master.maxActive}")
    private int maxActive;
    @Value("${spring.datasource.master.filters}")
    private String filters;
    @Value("${spring.datasource.master.initialSize}")
    private int initialSize;
    @Value("${spring.datasource.master.minIdle}")
    private int minIdle;
    @Value("${spring.datasource.master.maxWait}")
    private int maxWait;
    @Value("${spring.datasource.master.timeBetweenEvictionRunsMillis}")
    private int timeBetweenEvictionRunsMillis;
    @Value("${spring.datasource.master.minEvictableIdleTimeMillis}")
    private int minEvictableIdleTimeMillis;
    @Value("${spring.datasource.master.validationQuery}")
    private String validationQuery;
    @Value("${spring.datasource.master.testWhileIdle}")
    private boolean testWhileIdle;
    @Value("${spring.datasource.master.testOnBorrow}")
    private boolean testOnBorrow;
    @Value("${spring.datasource.master.testOnReturn}")
    private boolean testOnReturn;
    @Value("${spring.datasource.master.poolPreparedStatements}")
    private boolean poolPreparedStatements;
    @Value("${spring.datasource.master.maxPoolPreparedStatementPerConnectionSize}")
    private int maxPoolPreparedStatementPerConnectionSize;
    @Value("${spring.datasource.master.connectionProperties}")
    private String connectionProperties;
    @Value("${spring.datasource.master.useGlobalDataSourceStat}")
    private boolean useGlobalDataSourceStat;

    @Bean     //声明其为Bean实例
    @Primary  //在同样的DataSource中,首先使用被标注的DataSource
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        /*数据源主要配置*/
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        dataSource.setDriverClassName(driver);

        /*数据源补充配置*/
        dataSource.setMaxActive(maxActive);
        dataSource.setInitialSize(initialSize);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxWait(maxWait);
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        dataSource.setValidationQuery(validationQuery);
        dataSource.setTestOnBorrow(testOnBorrow);
        dataSource.setTestOnReturn(testOnReturn);
        dataSource.setTestWhileIdle(testWhileIdle);
        dataSource.setPoolPreparedStatements(poolPreparedStatements);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
        dataSource.setConnectionProperties(connectionProperties);
        dataSource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
        try {
            dataSource.setFilters(filters);
        } catch (SQLException e) {
            System.err.println("druid configuration initialization filter: " + e);
        }
        dataSource.setConnectionProperties(connectionProperties);
        //多语句
        WallConfig wallConfig = new WallConfig();
        wallConfig.setMultiStatementAllow(true);
        WallFilter wallFilter = new WallFilter();
        wallFilter.setConfig(wallConfig);
        List<Filter> filters1 = new ArrayList<>();
        filters1.add(wallFilter);
        dataSource.setProxyFilters(filters1);
        return dataSource;
    }

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

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(DataSourceConfiguration.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

}

这是配置SqlService的配置类

package com.bsj.pmc.config.database;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = PmcDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "clusterSqlSessionFactory")
public class PmcDataSourceConfig {

    // 精确到 cluster 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.bsj.pmc.pmcMapper";
    static final String MAPPER_LOCATION = "classpath:pmcMapper/*.xml";

    @Value("${spring.datasource.third.url}")
    private String url;

    @Value("${spring.datasource.third.username}")
    private String user;

    @Value("${spring.datasource.third.password}")
    private String password;

    @Value("${spring.datasource.third.driver-class-name}")
    private String driverClass;

    @Bean(name = "clusterDataSource")
    public DataSource clusterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "clusterTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Bean(name = "clusterSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(PmcDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

}
发布了33 篇原创文章 · 获赞 0 · 访问量 1455

猜你喜欢

转载自blog.csdn.net/m0_46086429/article/details/104293370
今日推荐