SpringBoot多数据源切换怎么实现
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本篇内容主要讲解"SpringBoot多数据源切换怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot多数据源切换怎么实现"吧!配置
千家信息网最后更新 2025年01月20日SpringBoot多数据源切换怎么实现
本篇内容主要讲解"SpringBoot多数据源切换怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot多数据源切换怎么实现"吧!
配置文件(YML)
spring: datasource: default-db-key: voidme multi-db: - voidme: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: jdbc:mysql://192.168.42.153:3306/voidme?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false - xcdef: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root url: jdbc:mysql://192.168.42.153:3306/xcdef?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=falsemybatis: #1.classpath:只会到你的classes路径中查找找文件。 #2.classpath*:不仅会到classes路径,还包括jar文件中(classes路径)进行查找。 mapper-locations: classpath*:/mapper/**/*Mapper.xml # mapper映射文件位置 type-aliases-package: com.**.entity # 实体类所在的位置 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #用于控制台打印sql语句 map-underscore-to-camel-case: true #开启将带有下划线的表字段 映射为驼峰格式的实体类属性
核心代码
DynamicDataSource
这个类用于获取数据源的(核心)
package com.dynamicdatadource.dynamic;import org.springframework.beans.factory.annotation.Value;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource { @Value("${spring.datasource.default-db-key}") private String defaultDbKey; @Override protected Object determineCurrentLookupKey() { String currentDb = DynamicDataSourceService.currentDb(); if (currentDb == null) { return defaultDbKey; } return currentDb; }}
DynamicDataSourceService
这个类是数据源切换工具,我们做了线程隔离了所以不用担心多线程数据源会混乱的问题
package com.dynamicdatadource.dynamic;import com.application.ApplicationContextProvider;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.jdbc.DataSourceBuilder;import javax.sql.DataSource;import java.util.HashMap;import java.util.Map;public class DynamicDataSourceService { private static final Logger log = LoggerFactory.getLogger(DynamicDataSourceService.class); private static final Map
DynamicDataSourceConfig
将数据源配置到springboot中和初始化Mybaitis配置
package com.dynamicdatadource.dynamic;import lombok.Data;import org.apache.ibatis.logging.Log;import org.mybatis.spring.SqlSessionFactoryBean;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.PlatformTransactionManager;import java.io.IOException;import java.util.HashMap;import java.util.Map;@Configuration@ConfigurationProperties(prefix = "mybatis")@Datapublic class DynamicDataSourceConfig { private String mapperLocations; private String typeAliasesPackage; @Data public class MybatisConfiguration{ private String logImpl; private boolean mapUnderscoreToCamelCase; } private MybatisConfiguration configuration=new MybatisConfiguration(); /** * 动态数据源 */ @Bean public DynamicDataSource dynamicDataSource() { DynamicDataSource dataSource = new DynamicDataSource(); Map
加载YML数据库配置类
package com.dynamicdatadource.config;import com.dynamicdatadource.dynamic.DynamicDataSourceService;import lombok.Data;import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import javax.sql.DataSource;import java.util.List;import java.util.Map;import java.util.Set;@Component@Data@ConfigurationProperties(prefix = "spring.datasource")public class YmlDataSourceProvider { private List
aop切换
package com.dynamicdatadource.aop;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ElementType.METHOD,ElementType.TYPE})//作用:方法和类@Retention(RetentionPolicy.RUNTIME)public @interface DynamicDataSourceAnno { String key() default "";}
package com.dynamicdatadource.aop;import com.dynamicdatadource.dynamic.DynamicDataSourceService;import org.apache.commons.lang.StringUtils;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.stereotype.Component;// 用于单独的请求或者类进行切换数据库@Aspect@Componentpublic class DynamicDataSourceAspect { @Pointcut("@annotation(com.dynamicdatadource.aop.DynamicDataSourceAnno)") public void dynamicDataSourceAnno() { } @Around("dynamicDataSourceAnno()") public Object DynamicDataSourceAspectAroundAnno(ProceedingJoinPoint joinPoint) { Object object = null; try { MethodSignature signature = (MethodSignature)joinPoint.getSignature(); DynamicDataSourceAnno dynamicDataSourceAnno = signature.getMethod().getAnnotation(DynamicDataSourceAnno.class); String key = dynamicDataSourceAnno.key(); if (StringUtils.isNotBlank(key)) { //切换为指定数据库 DynamicDataSourceService.switchDb(key); } object = joinPoint.proceed(); } catch (Throwable e) { e.printStackTrace(); }finally { //还原为默认配置 DynamicDataSourceService.resetDb(); } return object; } // 还可以扩展包路径切换}
效果
运行程序之后,就会将数据源加入到数据源列表中了
扩展
MysqlDataSourceInitialize
从数据库中将配置信息查询出来,然后动态添加到数据源列表中
package com.dao.config;import com.dao.DatasourceDao;import com.dynamicdatadource.aop.DynamicDataSourceAnno;import com.dynamicdatadource.dynamic.DynamicDataSourceService;import com.entity.DataSourceEneity;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import javax.sql.DataSource;import java.util.List;//从数据库中查询出全部的数据源,添加到数据源容器中/** * 表结构如下: * * CREATE TABLE `t_datasource` ( * `id` int(11) NOT NULL, * `key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '绑定的key,用于数据源的切换', * `url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据库连接地址', * `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据库用户名', * `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据库密码', * `driverClassName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据库驱动', * `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '数据库类型: mysql ,oracle,..', * `state` int(2) NOT NULL COMMENT '是否可用: 1可用 ,2不可用', * PRIMARY KEY (`id`), * UNIQUE KEY `key` (`key`) * ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; * * 上表要放入到默认数据源中的数据库里才行 */@Componentpublic class MysqlDataSourceInitialize implements ApplicationRunner { @Autowired private DatasourceDao datasourceDao; //项目启动后执行初始化数据源 @Override public void run(ApplicationArguments args) throws Exception { try { ListdataSources = datasourceDao.getDataSources(); for (DataSourceEneity dataSource : dataSources) { DynamicDataSourceService.addDataSource(dataSource.getKey(),dataSource.getDataSource()); } } catch (Exception e) { e.printStackTrace(); } }}
DataSourceEneity实体类
@Datapublic class DataSourceEneity { private int id; private String key; private String url; private String username; private String password; private String driverClassName; private String type; private int state; public DataSource getDataSource() { DataSourceBuilder> builder = DataSourceBuilder.create(); builder.driverClassName(driverClassName); builder.username(username); builder.password(password); builder.url(url); return builder.build(); }}
到此,相信大家对"SpringBoot多数据源切换怎么实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
数据
数据源
数据库
切换
配置
文件
路径
动态
实体
查询
位置
内容
地址
密码
控制台
方法
核心
线程
驼峰
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
我的世界僵尸服务器怎么弄
余温服务器
秦川机床软件开发
计算机网络技术概论论文
大恒文档安全服务器端
软件开发宣传文案
哪个数据库不是中文数据库
网络技术书本真实图片
济南联想服务器总代
网络安全知识 小学
软件开发项目基本开发过程
局域网必须用服务器吗
电子网络技术学
荣昌区媒体网络技术服务特点
南开区媒体网络技术创造辉煌
我心中的网络安全绘画图片
pptp服务器 xp
vb如何添加数据库
集控软件开发服务与组态软件
软件开发企业估值报告案例
网络安全化示意图
方舟生存进化道具服务器
点睛互联网科技服务有限公司
网站数据库密码文件
g6财务管理系统配置服务器
金融行业交流软件开发
z440支持服务器内存吗
Mongodb数据库淘汰
天元网络安全插画
晋江市八闽摄影网络技术