Mybatis-plus动态数据源

由于服务没有做微服务部署,需要在后台管理系统访问其他服务的库,所以需要用到动态数据源切换

引入依赖

mybatis-plus动态数据源依赖

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</version></dependency>

更改配置

spring:application:name: appNamedatasource:dynamic:# 指定默认数据源primary: aaaa1strict: falsedatasource:# 配置第一个数据源aaaa1:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://host:3306/xxx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: usernamepassword: password# 配置第二个数据源 aaaa2:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://host:3306/xxx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=trueusername: usernamepassword: passworddruid:# 初始连接数initialSize: 5# 最小连接池数量minIdle: 10# 最大连接池数量maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsewebStatFilter:enabled: truestatViewServlet:enabled: true# 设置白名单,不填则允许所有访问allow:url-pattern: /druid/*# 控制台管理用户名和密码#        login-username: login-username#        login-password: login-passwordfilter:stat:enabled: true# 慢SQL记录log-slow-sql: trueslow-sql-millis: 1000merge-sql: truewall:config:multi-statement-allow: true

配置类

package com.ruoyi.framework.config;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.ruoyi.common.utils.StringUtils;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;import javax.sql.DataSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;/*** Mybatis支持*匹配扫描包** @author ruoyi*/
@Configuration
public class MyBatisConfig {@Autowiredprivate Environment env;static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";public static String setTypeAliasesPackage(String typeAliasesPackage) {ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);List<String> allResult = new ArrayList<String>();try {for (String aliasesPackage : typeAliasesPackage.split(",")) {List<String> result = new ArrayList<String>();aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;Resource[] resources = resolver.getResources(aliasesPackage);if (resources != null && resources.length > 0) {MetadataReader metadataReader = null;for (Resource resource : resources) {if (resource.isReadable()) {metadataReader = metadataReaderFactory.getMetadataReader(resource);try {result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());} catch (ClassNotFoundException e) {e.printStackTrace();}}}}if (result.size() > 0) {HashSet<String> hashResult = new HashSet<String>(result);allResult.addAll(hashResult);}}if (allResult.size() > 0) {typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));} else {throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");}} catch (IOException e) {e.printStackTrace();}return typeAliasesPackage;}public Resource[] resolveMapperLocations(String[] mapperLocations) {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();List<Resource> resources = new ArrayList<Resource>();if (mapperLocations != null) {for (String mapperLocation : mapperLocations) {try {Resource[] mappers = resourceResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));} catch (IOException e) {// ignore}}}return resources.toArray(new Resource[resources.size()]);}@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");String mapperLocations = env.getProperty("mybatis.mapperLocations");String configLocation = env.getProperty("mybatis.configLocation");typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);VFS.addImplClass(SpringBootVFS.class);// 注意这里使用的是MybatisSqlSessionFactoryBean而不是SqlSessionFactoryBeanfinal MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);sessionFactory.setTypeAliasesPackage(typeAliasesPackage);sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));sessionFactory.setPlugins(new MybatisSqlLoggerInterceptor());return sessionFactory.getObject();}
}

添加注解

@DS注解我一般放在dao层,因为觉得这样更合理,如果使用了BaseMapper的批量处理以及接口操作,可以将注解放在service层解决找不到数据库问题

启动测试

问题:

动态数据源切换时效

当服务层接口添加事务注解,动态数据源切换就会失效,并且会使用默认的主数据源

批量处理接口异常

当dao层具体实现继承了BaseMapper并且服务处使用IService去实现,在批量处理时候就会出现异常,此时可以通过更改配置解决

使用 MybatisSqlSessionFactoryBean 替换 SqlSessionFactoryBean

参开原文:mybatis-plus框架TABLE_INFO_CACHE获取不到对应的TableInfo对象_error: can not execute. because can not find cache-CSDN博客

 另一种方式实现(未测试):https://www.cnblogs.com/zhaww/p/12706941.html

根据Mybatis-plus配置动态数据源-从数据库获取源_mybatis plus 拦截器怎么获取当前数据库类型-CSDN博客

工作笔记,持续更新完善中

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLSQL的下载与安装

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

Java面试:MySQL面试题汇总

1.说一下 MySQL 执行一条查询语句的内部执行过程&#xff1f; 答&#xff1a;MySQL 执行一条查询的流程如下&#xff1a; 客户端先通过连接器连接到 MySQL 服务器&#xff1b;连接器权限验证通过之后&#xff0c;先查询是否有查询缓存&#xff0c;如果有缓存&#xff08;之前…

音频调试(2)

前言&#xff1a; 大家好&#xff0c;今天继续分享记录一下最近的音频调试心得&#xff01;同时这个过程中&#xff0c;也有朋友过来交流音频的问题&#xff0c;通过交流&#xff0c;也是学习到了新东西&#xff01; 视频和音频复合推流&#xff1a; 在上一篇文章里面有提到fdk…

1688商品评论接口技术全解析:掌握电商评论管理的关键,助力销量飙升!

1688商品评论接口技术解析 随着电商行业的飞速发展&#xff0c;商品评论成为了消费者购物决策的重要依据。作为商家&#xff0c;如何有效地获取、管理并展示商品评论&#xff0c;对于提升用户体验、增加销售至关重要。1688作为国内领先的B2B电商平台&#xff0c;其商品评论接口…

claude3国内注册

claude3国内注册 Claude 3 作为大型语言模型的强大之处在于其先进的算法设计和大规模训练数据的应用&#xff0c;能够执行复杂和多样化的任务。以下是 Claude 3 主要的强项&#xff1a; 接近人类的理解能力&#xff1a;Claude 3 能够更加深入地理解文本的含义&#xff0c;包括…

如何清除Magento Cache

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;如何清除Magento的Cache。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有帮助。 缓存是存储以供以后使用的…

科技云报道:“老三样”不管用了,网络安全要靠啥?

科技云报道原创。 从安全的视角看&#xff0c;网络空间充斥着病毒、黑客、漏洞。在过去&#xff0c;企业习惯用“老三样”——防火墙、IDS、杀毒软件来搞定安全。 如果将网络空间比喻成一个大厦&#xff0c;那么防火墙相当于门锁&#xff0c;用于隔离内外网或不同安全域&…

(亲测有效)win7安装nodejs高版本(18.8.0)

现在学习vue3,vite,使用pnpm创建项目都需要高版本的nodejs了&#xff0c;win7最高只能安装13版本&#xff0c;好多已经不支持了。当然此篇只是以安装18.8.0为例&#xff0c;可以替换成更高的18或者20版本&#xff0c;只是太高的话可能出现冲突&#xff0c;够用就好。希望对各位…

Windows系统安装SeaFile个人云盘服务器并实现公网访问管理文件

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c…

Kafka复习

消息中间件的作用: 异步处理: 与并行相比,虽然减少了时间,但是还是得等待其他线程执行完,但是消息中间件对于简单的业务处理,还要引入一个中间件也比较复杂如果我投递了简历之后需要发送成功邮件以及短信,就可以交给消息中间件就像数据库、redis数据一致性,需要用到延迟…

vue快速入门(二十六)生命周期钩子函数

注释很详细&#xff0c;直接上代码 上一篇 新增内容 生命周期钩子函数的解析生命周期函数效果演示 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

《Linux运维总结:Kylin V10+ARM架构CPU基于docker-compose一键离线部署mongodb4.0.11之副本集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

华为“天才少年”4万字演讲:现在的AI技术要么无趣,要么无用

近期&#xff0c;一篇4万字的演讲风靡于国内人工智能&#xff08;AI&#xff09;学术圈。 原华为“天才少年”、Logenic AI公司联合创始人李博杰博士&#xff0c;日前发表了一篇关于AI Agent思考的文章&#xff0c;题为“AI Agent 应该更有趣还是更有用”。 李博杰在这篇文章…

Claude国内镜像网站

AI生产力工具Claude 3私藏链接大公开&#xff01; &#x1f680; 国内尚未开放注册&#xff1f;别担心&#xff0c;这里有你想要的解决方案&#xff01; &#x1f517; 私藏链接&#xff1a;https://hiclaude3.cn &#x1f31f; 推荐指数&#xff1a;&#x1f31f;&#x1f…

探索设计模式的魅力:融合AI大模型与函数式编程、开启智能编程新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;融合AI大模型与函数式…

葡萄书--图卷积网络

现有图神经网络皆基于邻居聚合的框架&#xff0c;即为每个目标节点通过聚合其邻居刻画结构信息&#xff0c;进而学习目标节点的表示 谱域方法&#xff1a;利用图上卷积定理从谱域定义图卷积。空间域方法&#xff1a;从节点域出发&#xff0c;通过在节点层面定义聚合函数来聚合…

如何把PDF转成word文件?三个好用的方法推荐给你

PDF转Word的问题&#xff0c;一直是许多人在处理文档时经常遇到的挑战。PDF作为一种广泛使用的文件格式&#xff0c;具有许多优点&#xff0c;如保持文档的原始布局、防止内容被轻易修改等。然而&#xff0c;这也意味着PDF文件在某些情况下不易编辑&#xff0c;特别是当需要对其…

Linux系统一键安装DataEase结合内网穿透实现公网访问本地WebUI界面

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

基于51单片机点滴输液控制系统LCD显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机点滴输液控制系统LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机点滴输液控制系统LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上…

SpringBoot 集成Swagger3

说明&#xff1a; 1&#xff09;、本文使用Spring2 集成Swagger3&#xff0c; 本想使用Springboot3 jdk 17 集成Swagger3, 但是搜了一些资料&#xff0c;Spring 想引用swagger3 需要依赖降级使用Spring2 版本&#xff0c;不然会出现下图的报错信息&#xff0c; 或者使用Sprin…