Spring boot 连接多数据源过程详解
作者:龙爱海 发布时间:2023-11-28 12:09:51
标签:spring,boot,连接,多,数据源
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


猜你喜欢
- 配置文件概述:应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改
- 格式要求:SU MO TU WE TH FR SA &nb
- Android 四种获取屏幕宽度的方法方法一: WindowManager wm = (WindowManager) this
- 本文实例讲述了Android基于广播事件机制实现简单定时提醒功能代码。分享给大家供大家参考,具体如下:1.Android广播事件机制Andr
- 1:查看是否有存储卡插入String status=Environment.getExternalStorageState();if(sta
- 本文实例讲述了Java使用Preference类保存上一次记录的方法。分享给大家供大家参考。具体分析如下:在使用java中JFileChoo
- 前言我们来分析一下堆内布局以及Java对象在内存中的布局吧。对象的指向先来看一段代码:package com.zwx.jvm;public
- 本文实例为大家分享了Android CameraManager类的具体代码,供大家参考,具体内容如下先看代码: private
- Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z-xing 码),该文章主要用于笔者自己学习中的总结,暂贴出代码部分
- 使用resilience4j的库和Spring Boot设计高弹性的微服务。微服务本质上是分布式的。当您使用分布式系统时,请始终记住这一第一
- import java.io.*;import java.text.SimpleDateFormat;import java.util.*;
- 前文说到 优雅的使用枚举参数 和 实现原理,本文继续说一下如何在 RequestBody 中优雅使用枚举。本文先上实战,说一下如何实现。在
- Struts2中提供了数据校验验证数据例如验证邮件、数字等。验证方式有3种:一是通过validate()方法,二是通过Xml,三是使用注解方
- Spring或SpringBoot开启事务以后无法返回自增主键场景:保存订单和订单详情,订单详情需要订单id,数据库中的订单表是自增主键,开
- 一个是新浪微博,腾讯微博的分享按钮,一个是他们的绑定情况(其实就是是否授权)。点击微博分享中新浪或腾讯按钮,就进行相应的授权(若没授权),显
- InterProcessMutex内部实现了zookeeper分布式锁的机制,所以接下来我们尝试使用这个工具来为我们的业务加上分布式锁处理的
- 启动类的存放位置今天,写了一个项目,但是启动类为什么一直报错我是放在这个位置的,但是就一直报放在默认包错误 想记录下微服务启动类的
- C++ 线程(串行 并行 同步 异步)详解看了很多关于这类的文章,一直没有总结。不总结的话就会一直糊里糊涂,以下描述都是自己理解
- 一、注解注解(Annotation): 从jdk5.0开始引进,可以对程序进行解释或被其他程序读取。注解格式:"@注释名"
- 目录数据类型布尔类型字符串类型String拼接字符'+'转义字符运算符加减乘除模运算增量赋值运算符自增运算符和自建运算符赋值