SpringBoot多数据源切换怎么实现
发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,本篇内容主要讲解"SpringBoot多数据源切换怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot多数据源切换怎么实现"吧!配置
千家信息网最后更新 2024年11月12日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安全错误
数据库的锁怎样保障安全
理文造纸网络安全
新基建驱动网络安全
联想服务器电磁兼容性
公主连结有服务器吗
数据库技术与应用第二版
仁怀网络安全系统多少钱
怎么操作管家婆数据库
甘肃网络安全信息安全
大数据时代数据库发展
万胜网络安全ppt
数据库需要什么
wow服务器连接
数据库技术与应用 视频
数据库系统中表达式字段类型
租用服务器怎样进行管理
传奇 服务器端 下载
心脑血管数据库
湖南智慧城管软件开发系统
安卓本地归属地数据库在哪个位置
南关区智能化网络技术诚信经营
下载数据库
企业网络安全防护标准
租一台云服务器费用
cs服务器架设
浙江gps双模时间服务器价格
软件开发销售情景模拟对话
兰州市网络安全教育视频
网络安全管控的难度
成年人网络安全问题
网络安全讲座内容简介