springboot+mybatis使用多数据源的配置

背景:

之前做的xx系统中,新增了某些需求,需求的实现基于多个数据库的操作,即需要连接多数据源,然后开始了百度大法!以下就是整理总结的springboot使用多数据源的配置。当然配置好,也可以正常使用后,又出现了某些小bug,这些将在后面进行介绍。
下面以配置两个数据库test1、test2为例,进行配置讲解。

配置步骤:

  • 1 修改application.properties配置文件中的数据库连接
#数据库设置
#pa数据库(做为主数据库)
spring.datasource.pa.url=jdbc:mysql://localhost:3306/pa_db?useUnicode=true&characterEncoding=utf-8
spring.datasource.pa.username=root
spring.datasource.pa.password=root
spring.datasource.pa.driver-class-name=com.mysql.jdbc.Driver

#cas数据库
spring.datasource.cas.url=jdbc:mysql://localhost:3306/cas_user_db?useUnicode=true&characterEncoding=utf-8
spring.datasource.cas.username=root
spring.datasource.cas.password=root
spring.datasource.cas.driver-class-name=com.mysql.jdbc.Driver

  • 2 配置两个数据库对应的数据源
    以下为具体的配置代码,其中注释部分的内容很重要,没有进行手动配置的话可能会报错!
/*pa数据库*/
@Configuration
@MapperScan(basePackages = "com.hobbes.pa.mapper", sqlSessionTemplateRef  = "paSqlSessionTemplate")
public class DataSource1Config {

    @Bean(name = "paDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.pa")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "paSqlSessionFactory")
    @Primary /*此处必须在主数据库的数据源配置上加上@Primary*/
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("paDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        /*加载mybatis全局配置文件*/
        bean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis/mybatis-config.xml"));
        /*加载所有的mapper.xml映射文件*/
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/*.xml"));
        return bean.getObject();
    }
  
    @Bean(name = "paTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("paDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "paSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("paSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
/*cas数据库*/
@Configuration
@MapperScan(basePackages = "com.hobbes.pa.mapper2", sqlSessionTemplateRef  = "casSqlSessionTemplate")
public class DataSource2Config {

    @Bean(name = "casDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.cas")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "casSqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("casDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        /*加载mybatis全局配置文件*/
        bean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis/mybatis-config.xml"));
        /*加载所有的mapper.xml映射文件*/
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "casTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("casDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "casSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("casSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
  • 3 删除项目入口类上的@MapperScan动态扫描
将
@MapperScan
替换为
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})

到此步骤其实就已经完成了多数据源的配置,并且可以正常使用


服务启动之后第二天访问就报错了 ≖‿≖✧
具体错误信息早晨刚给删掉了( ´◔ ‸◔`)
所以看了浏览记录的话大概是这几个错误之中的一个或多个ԅ(¯﹃¯ԅ)
后面会给出解决方法


Cannot connect to Database server (mysql workbench).
Communications link failure.The last packet successfully received from the server was xxxx milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException.
  • 4 错误/异常解决
    上面出现的异常/错误的原因是因为mysql数据库默认的wait_time是8个小时,也就是说mysql数据库会在没有任何操作后的8个小时就会自动断开连接,然后就连不上数据了(`д′)
    mysql5.0以下版本的解决办法:
/*在数据库url后面加上autoReconnect=true*/
/*因为身边没有安装mysql5.0以下版本的电脑,所有没有测试该解决方法,大家可以试一试*/
spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true  

mysql5.0以上版本的解决办法:

/*在application.properties配置文件中加入相应的连接池配置,主要是最后五个属性*/
#pa数据库连接池配置
spring.datasource.pa.max-wait=10000
spring.datasource.pa.max-idle=8
spring.datasource.pa.min-idle=8
spring.datasource.pa.initial-size=10
spring.datasource.pa.max-active=20
spring.datasource.pa.test-on-borrow=true
spring.datasource.pa.test-while-idle=true
spring.datasource.pa.validation-query=SELECT 1 FROM DUAL
spring.datasource.pa.time-between-eviction-runs-millis=300000
spring.datasource.pa.min-evictable-idle-time-millis=1800000

#cas数据库连接池配置
spring.datasource.cas.max-wait=10000
spring.datasource.cas.max-idle=8
spring.datasource.cas.min-idle=8
spring.datasource.cas.initial-size=10
spring.datasource.cas.max-active=20
spring.datasource.cas.test-on-borrow=true
spring.datasource.cas.test-while-idle=true
spring.datasource.cas.validation-query=SELECT 1 FROM DUAL
spring.datasource.cas.time-between-eviction-runs-millis=300000
spring.datasource.cas.min-evictable-idle-time-millis=1800000

参考资料:springboot 连接池wait_timeout超时设置



作者:骑驴跑得快
链接:https://www.jianshu.com/p/dbba7573d2c0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/u012129558/article/details/80507421