Spring Boot + MyBatis 实现多数据源连接

文章目录

  • 前言
  • 一、Maven引入Druid和数据库驱动
  • 二、application.properties中设置数据库访问参数
  • 三、编写数据源的配置文件
    • 1.数据源1配置文件示例
  • 四、关闭数据源自动设置
  • 建议
  • 其他


前言

项目中有访问多个数据源的需求


一、Maven引入Druid和数据库驱动

 
 <dependency>
     <groupId>com.alibabagroupId>
     <artifactId>druidartifactId>
     <version>1.0.18version>
 dependency>

驱动请自行选择合适的驱动

二、application.properties中设置数据库访问参数

可以自定义参数,因为这些参数不是用于Spring Boot自动注入数据源的,而是之后需要我们手动引用他们

#mysql1
mysql1.datasource.driverClassName=com.mysql.jdbc.Driver
mysql1.datasource.url=jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
mysql1.datasource.username=root
mysql1.datasource.password=123456

#mysql2
mysql2.datasource.driverClassName=com.mysql.jdbc.Driver
mysql2.datasource.url=jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
mysql2.datasource.username=root
mysql2.datasource.password=123456

三、编写数据源的配置文件

1.数据源1配置文件示例

@Configuration
@MapperScan(basePackages = DB1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "DB1SqlSessionFactory")
public class DB1DataSourceConfig {
	// 存放Mapper的包,项目中Mapper使用@Mapper注解
    static final String PACKAGE = "com.naristc.scsdeci.mapper.mysql1";
    @Value("${mysql1.datasource.url}")
    private String url;

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

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

    @Value("${mysql1.datasource.driverClassName}")
    private String driverClass;

	// 配置数据源连接参数
    @Bean(name = "DB1DataSource")
    public DruidDataSource DB1DataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }
	
    @Bean(name = "DB1TransactionManager")
    public DataSourceTransactionManager DB1TransactionManager() {
        return new DataSourceTransactionManager(DB1DataSource());
    }

    // SessionFactory
    @Bean(name = "DB1SqlSessionFactory")
    public SqlSessionFactory DB1SqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(DB1DataSource());
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate DB1SqlSessionTemplate() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(DB1SqlSessionFactory());
        return template;
    }
}

注:网上有其他的博客有提到,在多数据源的情况下,一般选定一个作为主数据源,在主数据源的工厂上要加上@Primary注解,但是实际上我在不写的情况下目前并没有出现异常,如果之后有出现问题,再更新。

一个数据源一个配置文件


四、关闭数据源自动设置

因为SpringBoot默认是单数据源的,所以我们需要关闭这种自动设置
@SpringBootApplication注解中,加入exclude参数

// 由于Spring Boot默认单数据源,所以在启动类中需要使用注解去除该默认项
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ScsdeciApp extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure (SpringApplicationBuilder builder){
        // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(ScsdeciApp.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(ScsdeciApp.class, args);
    }
}

建议

数据源的配置文件是设定一个或多个包然后扫描其中的Mapper,建议将不同数据源的模型、实例、Mapper等分开存放,不容易因名字相近或相同搞混。
Spring Boot + MyBatis 实现多数据源连接_第1张图片

其他

虽然并不影响程序运行,但是Druid确实会报出一个错误,如图所示:
Druid确实会报出一个错误
这句是什么意思呢?
testWhileIdle字面上翻译理解为:在空闲时,程序需要去做查询来检测连接状态;
而validationQuery这句的意思是这种检测连接状态的查询没有设置。
网上有博客解决这个问题的方法是在application.properties中加入一句
Spring Boot + MyBatis 实现多数据源连接_第2张图片
这个方法或许以前能行得通,但是现在不行了,因为SpringBoot在新的版本不会自动地注入Druid数据源了,当然在application.properties中设置也就,没有用了。

而且,我们这样配置多个数据源,本来就是手动配置而不是SpringBoot自动注入数据源Bean的。

所以,在每一个数据库的Config文件中,都设置一下数据源的这个validationQuery参数,就可以解决这个问题:

dataSource.setValidationQuery("SELECT 1");

当然,从另一个角度讲,也可以关闭检测连接状态,那样也就不需要设置这个查询语句了:

dataSource.setTestWhileIdle(false);

两者选一就可以了,当然我更倾向于第一种方法

你可能感兴趣的:(后端,Spring,Boot,java,spring,boot,数据库)