spring boot动态切换数据源
1、添加maven依赖
-
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
<parent>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-parent</artifactId>
-
<version>2.5.1</version>
-
<relativePath/> <!-- lookup parent from repository -->
-
</parent>
-
<groupId>com.data.source</groupId>
-
<artifactId>mybatis-datasource</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
<name>mybatis-datasource</name>
-
<description>Demo project for Spring Boot</description>
-
-
<properties>
-
<java.version>1.8</java.version>
-
</properties>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.mybatis.spring.boot</groupId>
-
<artifactId>mybatis-spring-boot-starter</artifactId>
-
<version>2.2.0</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>8.0.13</version>
-
</dependency>
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<optional>true</optional>
-
</dependency>
-
-
<!--springBoot的aop-->
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-aop</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>com.alibaba</groupId>
-
<artifactId>druid-spring-boot-starter</artifactId>
-
<version>1.1.10</version>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-test</artifactId>
-
<scope>test</scope>
-
</dependency>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.12</version>
-
<scope>test</scope>
-
</dependency>
-
-
</dependencies>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-maven-plugin</artifactId>
-
<configuration>
-
<excludes>
-
<exclude>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
</exclude>
-
</excludes>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
-
-
</project>
2、配置文件
application.yml
-
server:
-
port: 8082
-
spring:
-
datasource:
-
druid:
-
master:
-
driver-class-name: com.mysql.jdbc.Driver
-
username: root
-
password: 123456
-
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
-
slave:
-
driver-class-name: com.mysql.jdbc.Driver
-
username: root
-
password: 123456
-
url: jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
-
mybatis:
-
mapper-locations: classpath*:mapper/*.xml
-
type-aliases-package: com.data.source.mybatisdatasource.entity
application.properties
-
#项目端口
-
server.port=8082
-
#项目启动路径
-
#server.servlet.context-path=/mybatisdatasource
-
-
#Mybatis配置
-
mybatis.type-aliases-package=com.data.source.mybatisdatasource.entity
-
mybatis.mapper-locations=classpath*:mapper/*.xml
-
-
#多数据
-
spring.datasource.druid.master.driver-class-name=com.mysql.jdbc.Driver
-
spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
-
spring.datasource.druid.master.username=root
-
spring.datasource.druid.master.password=123456
-
-
spring.datasource.druid.slave.driver-class-name=com.mysql.jdbc.Driver
-
spring.datasource.druid.slave.url=jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
-
spring.datasource.druid.slave.username=root
-
spring.datasource.druid.slave.password=123456
-
3、数据源属性实体类
注意事项:prefix = "spring.datasource.druid" 跟application.properties配置的对应
-
import lombok.Data;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.stereotype.Component;
-
-
import java.util.Map;
-
-
/**
-
* 数据源属性
-
*
-
* @author mir liu
-
*/
-
-
-
-
public class DataSourceProperties {
-
private Map<String, String> master;
-
private Map<String, String> slave;
-
}
4、动态数据源切换
-
-
import lombok.extern.slf4j.Slf4j;
-
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-
import javax.sql.DataSource;
-
import java.util.Map;
-
-
-
/**
-
* 动态数据源切换
-
* AbstractRoutingDataSource(每执行一次数据库,动态获取DataSource)
-
*/
-
-
public class DynamicDataSource extends AbstractRoutingDataSource {
-
-
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
-
-
public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
-
super.setDefaultTargetDataSource(defaultTargetDataSource);
-
super.setTargetDataSources(targetDataSources);
-
super.afterPropertiesSet();
-
}
-
-
-
-
protected Object determineCurrentLookupKey() {
-
Object dataSoruce = getDataSource();
-
return dataSoruce;
-
}
-
-
public static void setDataSource(String dataSource) {
-
contextHolder.set(dataSource);
-
}
-
-
public static String getDataSource() {
-
return contextHolder.get();
-
}
-
-
public static void clearDataSource() {
-
contextHolder.remove();
-
}
-
}
5、多数据源配置类
-
-
import com.alibaba.druid.pool.DruidDataSource;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.context.annotation.Primary;
-
-
import javax.sql.DataSource;
-
import java.util.HashMap;
-
import java.util.Map;
-
-
-
public class DynamicDataSourceConfig {
-
-
-
private DataSourceProperties dataSourceProperties;
-
-
-
public DataSource master() {
-
DruidDataSource druidDataSource = new DruidDataSource();
-
Map<String, String> master = dataSourceProperties.getMaster();
-
druidDataSource.setUsername(master.get("username"));
-
druidDataSource.setPassword(master.get("password"));
-
druidDataSource.setUrl(master.get("url"));
-
//其他参数配置 省略
-
return druidDataSource;
-
}
-
-
-
public DataSource slave() {
-
DruidDataSource druidDataSource = new DruidDataSource();
-
Map<String, String> slave = dataSourceProperties.getSlave();
-
druidDataSource.setUsername(slave.get("username"));
-
druidDataSource.setPassword(slave.get("password"));
-
druidDataSource.setUrl(slave.get("url"));
-
//其他参数配置 省略
-
return druidDataSource;
-
}
-
-
-
-
public DynamicDataSource dataSource(DataSource master, DataSource slave) {
-
Map<Object, Object> map = new HashMap<>(4);
-
map.put("master", master);
-
map.put("slave", slave);
-
return new DynamicDataSource(master, map);
-
}
-
}
6、自定义@DataSource注解
-
import java.lang.annotation.*;
-
-
/**
-
* 动态数据源注解,作用于类、接口或者方法上
-
*
-
* @author Mr.Liu
-
*/
-
-
-
-
public DataSource {
-
-
-
/**
-
* 默认master数据源
-
*/
-
String name() default "master";
-
-
}
7、Aop切面类配置
-
-
import com.data.source.mybatisdatasource.annotation.DataSource;
-
import com.data.source.mybatisdatasource.config.DynamicDataSource;
-
import lombok.extern.slf4j.Slf4j;
-
import org.aspectj.lang.ProceedingJoinPoint;
-
import org.aspectj.lang.annotation.Around;
-
import org.aspectj.lang.annotation.Aspect;
-
import org.aspectj.lang.annotation.Pointcut;
-
import org.aspectj.lang.reflect.MethodSignature;
-
import org.springframework.core.annotation.Order;
-
import org.springframework.stereotype.Component;
-
-
import java.lang.reflect.Method;
-
-
/**
-
* @Author mir liu
-
* 动态数据源通知
-
* @Order(-1) 保证在@Transactional之前执行
-
*/
-
-
-
-
-
public class DynamicDattaSourceAspect {
-
-
-
-
public void dataSourcePointCut() {
-
}
-
-
-
public Object around(ProceedingJoinPoint point) throws Throwable {
-
MethodSignature signature = (MethodSignature) point.getSignature();
-
Method method = signature.getMethod();
-
-
DataSource dataSource = method.getAnnotation(DataSource.class);
-
log.info("数据库 dataSource:{}", dataSource.toString());
-
if (dataSource == null) {
-
DynamicDataSource.setDataSource("master");
-
} else {
-
DynamicDataSource.setDataSource(dataSource.name());
-
}
-
try {
-
return point.proceed();
-
} finally {
-
DynamicDataSource.clearDataSource();
-
}
-
}
-
}
8、启动配置注解信息,重要(不然运行会报错)
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
9、测试
(1)、service层
-
import com.data.source.mybatisdatasource.annotation.DataSource;
-
import com.data.source.mybatisdatasource.entity.UserInfo;
-
import com.data.source.mybatisdatasource.mapper.UserInfoMapper;
-
import com.data.source.mybatisdatasource.service.DynamicServcice;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.stereotype.Service;
-
-
import java.util.List;
-
-
-
-
public class DynamicServciceImpl implements DynamicServcice {
-
-
-
-
private UserInfoMapper userInfoMapper;
-
-
-
-
-
public List<UserInfo> selectAll() {
-
return userInfoMapper.selectAll();
-
}
-
-
-
-
-
public int insert(UserInfo record) {
-
return userInfoMapper.insert(record);
-
}
-
}
(2)、单元测试
-
-
import com.data.source.mybatisdatasource.entity.UserInfo;
-
import com.data.source.mybatisdatasource.service.DynamicServcice;
-
import org.junit.jupiter.api.Test;
-
import org.junit.runner.RunWith;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.boot.test.context.SpringBootTest;
-
import org.springframework.test.context.junit4.SpringRunner;
-
-
import java.util.Date;
-
import java.util.List;
-
-
-
-
class MybatisDatasourceApplicationTests {
-
-
-
private DynamicServcice dynamicServcice;
-
-
-
-
void master() {
-
UserInfo userInfo = new UserInfo();
-
userInfo.setUserId("acoi112");
-
userInfo.setUserName("小龙女");
-
userInfo.setCreatTime(new Date());
-
userInfo.setModifyDate(new Date());
-
Integer num = dynamicServcice.insertSelective(userInfo);
-
}
-
-
-
void slave() {
-
List<UserInfo> userInfoList = dynamicServcice.selectAll();
-
System.out.println();
-
}
-
-
-
void masterAndSlave() {
-
List<UserInfo> userInfoList = dynamicServcice.selectAll();
-
System.out.println();
-
}
-
}
测试结果
-
2022-01-06 15:23:22.424 [main] INFO c.d.s.m.aop.DynamicDattaSourceAspect - 数据库 dataSource:@com.data.source.mybatisdatasource.annotation.DataSource(name=master)
-
2022-01-06 15:23:22.450 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
-
-
2022-01-06 15:29:48.581 [main] INFO c.d.s.m.aop.DynamicDattaSourceAspect - 数据库 dataSource:@com.data.source.mybatisdatasource.annotation.DataSource(name=slave)
-
2022-01-06 15:29:48.610 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiaiiea
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22