背景:
之前做的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超时设置
总结
今天的话
总结是不可能总结的,这辈子都不可能总结的
hhhhh
完结撒花