Spring boot 连接多数据源过程详解
作者:龙爱海 时间:2023-11-28 12:09:51
1.application.yml中添加两个datasource
server:
port: 8080
spring:
application:
name: king
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://localhost:3306/king?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
idle-timeout: 10000
minimum-idle: 1
maximum-pool-size: 10
pool-name: master
auto-commit: false
connection-test-query: SELECT 1
slave:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://localhost:3306/king?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
idle-timeout: 10000
minimum-idle: 1
maximum-pool-size: 10
pool-name: slave
auto-commit: false
connection-test-query: SELECT 1
2.手动初始化数据源masterDataSource
package cn.bj.king.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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 org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
/**
* @author ARongking
* @date 2019-03-28
*/
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"cn.bj.king.mapper.master"},
sqlSessionFactoryRef = "masterSqlSessionFactory")
public class WriteDataSourceConfig {
@Bean(name = "masterDataSource")
@Primary
@Qualifier("masterDataSource")
public DataSource masterDataSource(@Qualifier("masterHikariConfig")HikariConfig hikariConfig) {
System.out.println("实例化主库");
HikariDataSource hikariDataSource=new HikariDataSource(hikariConfig);
return hikariDataSource;
}
/**
* 配置连接池信息
* @return
*/
@ConfigurationProperties(prefix = "spring.datasource.master")
@Bean("masterHikariConfig")
public HikariConfig masterHikariConfig(){
HikariConfig hikariConfig=new HikariConfig();
return hikariConfig;
}
/**
* SqlSessionFactory配置
*
* @return
* @throws Exception
*/
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 配置mapper文件位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/master/*.xml"));
sqlSessionFactoryBean.setTypeAliasesPackage("cn.bj.king.entity");
return sqlSessionFactoryBean.getObject();
}
/**
* 配置事物管理器
*
* @return
*/
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
3.手动初始化数据源ReadDataSource
package cn.bj.king.config;
import com.github.pagehelper.PageInterceptor;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"cn.bj.king.mapper.slave"},
sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class ReadDataSourceConfig {
@Autowired
Environment environment;
@Bean(name = "slaveDataSource")
@Qualifier("slaveDataSource")
public DataSource slaveDataSource(@Qualifier("slaveHikariConfig")HikariConfig hikariConfig) {
System.out.println("实例化从库");
HikariDataSource hikariDataSource=new HikariDataSource(hikariConfig);
return hikariDataSource;
}
/**
* 配置连接池信息
* @return
*/
@ConfigurationProperties(prefix = "spring.datasource.slave")
@Bean("slaveHikariConfig")
public HikariConfig slaveHikariConfig(){
HikariConfig hikariConfig=new HikariConfig();
return hikariConfig;
}
/**
* SqlSessionFactory配置
*
* @return
* @throws Exception
*/
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 配置mapper文件位置
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/slave/*.xml"));
sqlSessionFactoryBean.setTypeAliasesPackage("cn.bj.king.entity");
return sqlSessionFactoryBean.getObject();
}
/**
* 配置事物管理器
*
* @return
*/
@Bean(name = "slaveTransactionManager")
public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
4.测试启动是否正常初始化master和slave 两个数据源
5.这里需要注意几个地方:
配置数据库连接池的时候,如果不是手动设置HikariConfig ,即通过Environment 去一个个获取数据库连接池在yml中的配置的话,数据库连接池的(idle-timeout,minimum-idle, maximum-pool-size,pool-name,auto-commit,connection-test-query)等,一定要与slave节点平级,不然 HikariConfig 是读取不到这些信息的。
如果手动赋值HikariConfig 的话,那就没有什么限制了,写到哪里都行,只需要用Environment 去读取配置文件的值,手动设置到HikariConfig 就行了。
来源:https://blog.51cto.com/longithome/2400459
标签:spring,boot,连接,多,数据源
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android App开发中HTTP扩展包OkHttp的入门使用指南
2023-10-01 11:11:28
sprng和struts有什么区别?
2022-03-02 02:13:35
Spring Boot启动过程(四)之Spring Boot内嵌Tomcat启动
2023-09-21 00:16:18
![](https://img.aspxhome.com/file/2023/7/58577_0s.png)
C#8.0中的模式匹配
2023-07-19 13:27:39
Android图片处理工具类BitmapUtils
2022-12-28 05:23:39
Android编程实现禁止系统锁屏与解锁亮屏的方法
2022-05-21 02:35:39
Springboot整合企业微信机器人助手推送消息的实现
2023-08-18 08:37:37
![](https://img.aspxhome.com/file/2023/0/110850_0s.png)
java解析Excel的方法(xls、xlsx两种格式)
2021-10-12 16:29:39
![](https://img.aspxhome.com/file/2023/0/68520_0s.png)
android实现打地鼠游戏
2023-09-25 08:45:59
![](https://img.aspxhome.com/file/2023/1/138381_0s.jpg)
SpringBoot项目如何打war包问题详解
2023-06-07 08:33:47
![](https://img.aspxhome.com/file/2023/3/71593_0s.png)
Android编程实现给Button添加图片和文字的方法
2021-11-27 21:30:20
Java流程控制语句之If选择结构
2023-11-11 04:02:29
![](https://img.aspxhome.com/file/2023/3/58853_0s.png)
Java PreparedStatement用法详解
2023-08-08 20:20:51
![](https://img.aspxhome.com/file/2023/1/58061_0s.png)
c# 如何实现自动更新程序
2021-11-20 21:02:41
![](https://img.aspxhome.com/file/2023/2/85662_0s.png)
浅谈java8中map的新方法--replace
2022-03-11 20:10:30
java编程中字节流转换成字符流的实现方法
2021-06-09 15:59:04
Android仿美团淘宝实现多级下拉列表菜单功能
2022-07-24 18:42:18
![](https://img.aspxhome.com/file/2023/4/137114_0s.png)
SpringBoot登录拦截配置详解(实测可用)
2023-04-22 20:52:21
![](https://img.aspxhome.com/file/2023/5/106135_0s.png)
C#难点逐个击破(8):可空类型System.Nullable
2023-07-04 14:49:40
![](https://img.aspxhome.com/file/2023/2/71742_0s.png)
浅谈Java中IO和NIO的本质和区别
2023-11-01 01:44:08
![](https://img.aspxhome.com/file/2023/4/86734_0s.jpg)