Springboot 使用小记-集成 MyBatis 单多数据源

文章目录

      • 1.单数据源
        • 1.1 application.properties 配置参考
        • 1.2应用类参考配置
      • 2.多数据源(主从)
        • 2.1 application.properteis 如下配置
        • 2.2 主从数据源的配置
        • 2.3 Mybatis 配置动态数据源
        • 2.4 动态数据源线程安全处理
        • 2.5 获取动态数据源
        • 2.6 AOP 配置,在 DAO 层切入,根据方法名进行主从切换

Springboot 集成 MyBatis,在纯血 Springboot 项目中增加如下依赖配置

${mybatis-starter-version}  是你要用的版本,自行替换
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-starter-version}</version>
</dependency>

1.单数据源

此处默认采用的数据源连接池为 HikariDataSource(据说性能很好) 。它是springboot 默认的连接池之一(Hikari、tomcat、dbcp2),具体参见

org.springframework.boot.jdbc.DataSourceBuilder 
1.1 application.properties 配置参考
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://ip:port/mytest?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
spring.datasource.username=xxxx
spring.datasource.password=xxx
spring.datasource.initial-size=2
spring.datasource.min-idle=2
spring.datasource.max-active=500
spring.datasource.max-wait=6000
spring.datasource.time-between-eviction-runs-millis=60000
spring.datasource.min-evictable-idle-time-millis=300000
spring.datasource.validation-query=select 1
spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=true
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=20
# mybatis 配置:实体及 mapper.xml 这里的配置类似 spring 与 mybatis 的集成,只是放到这里配置了
mybatis.type-aliases-package=com.test.app.dao.*.entity
mybatis.config-location=classpath:mybatis/mapper.xml
1.2应用类参考配置
  • 关键配置 @MapperScan(“com.test.app.dao.**.mapper”)
@Configuration
@SpringBootApplication
@MapperScan("com.test.app.dao.**.mapper")
public class DAOTestApplication extends SpringBootServletInitializer {public static void main(String[] args) {SpringApplication.run(DAOTestApplication.class, args);}@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {logger.info("DAO test Application is starting");return builder.sources(DAOTestApplication.class);}
}

2.多数据源(主从)

2.1 application.properteis 如下配置
# master
spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.master.jdbcUrl=jdbc:mysql://192.168.10.1:3306/mytest?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
spring.datasource.master.username=mysql
spring.datasource.master.password=******
spring.datasource.master.minimum-idle=5
spring.datasource.master.maximum-pool-size=200
spring.datasource.master.idle-timeout=30000
spring.datasource.master.max-lifetime=1800000
spring.datasource.master.connection-timeout=30000
spring.datasource.master.connection-test-query=SELECT 1# slave 
spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.slave.jdbcUrl=jdbc:mysql://192.168.10.2:3306/mytest?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
spring.datasource.slave.username=mysql
spring.datasource.slave.password=******
spring.datasource.slave.minimum-idle=5
spring.datasource.slave.maximum-pool-size=200
spring.datasource.slave.idle-timeout=30000
spring.datasource.slave.max-lifetime=1800000
spring.datasource.slave.connection-timeout=30000
spring.datasource.slave.connection-test-query=SELECT 1
spring.datasource.slave.read-only=true
2.2 主从数据源的配置
@Configuration
@EnableTransactionManagement
public class MultiDataSourceConfiguration {@Primary@Bean(name = "masterDataSource")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "slaveDataSource")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}
}
2.3 Mybatis 配置动态数据源
@Configuration
@AutoConfigureAfter({MultiDataSourceConfiguration.class})
public class MyBatisConfiguration extends MybatisAutoConfiguration {public MyBatisConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider,ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider,ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {super(properties, interceptorsProvider, resourceLoader, databaseIdProvider, configurationCustomizersProvider);}@Resource(name = "masterDataSource")private DataSource masterDataSource;@Resource(name = "slaveDataSource")private DataSource slaveDataSource;@Beanpublic SqlSessionFactory sqlSessionFactory() throws Exception {return super.sqlSessionFactory(routingDataSource());}public AbstractRoutingDataSource routingDataSource() {DynamicDataSource dynamicDataSource = new DynamicDataSource();Map<Object, Object> targetDataSources = new ClassLoaderRepository.SoftHashMap();targetDataSources.put(DynamicDataSourceHolder.MASTER, masterDataSource);targetDataSources.put(DynamicDataSourceHolder.SLAVE, slaveDataSource);dynamicDataSource.setDefaultTargetDataSource(masterDataSource);dynamicDataSource.setTargetDataSources(targetDataSources);return dynamicDataSource;}
}
2.4 动态数据源线程安全处理
public class DynamicDataSourceHolder {public static final String MASTER = "master";public static final String SLAVE = "slave";public static final ThreadLocal<String> holder = new ThreadLocal<String>();public static void setDataSource(String name) {holder.set(name);}public static String getDataSource() {return holder.get();}
}
2.5 获取动态数据源
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceHolder.getDataSource();}
}
2.6 AOP 配置,在 DAO 层切入,根据方法名进行主从切换
@Component
@Aspect
public class DataSourceMethodInterceptor {private static final Logger logger = LoggerFactory.getLogger(DataSourceMethodInterceptor.class);@Before("execution(* com.test.app.dao.*.mapper.*.*(..))")public void dynamicSetDataSoruce(JoinPoint joinPoint) throws Exception {String methodName = joinPoint.getSignature().getName();// 查询使用从库if (methodName.startsWith("select") || methodName.startsWith("load") || methodName.startsWith("get")|| methodName.startsWith("count") || methodName.startsWith("is") || methodName.startsWith("query")|| methodName.startsWith("search")) {logger.debug("methodName:{}, execute slave", methodName);DynamicDataSourceHolder.setDataSource("slave");} else { // 其它使用主库logger.debug("methodName:{}, execute master", methodName);DynamicDataSourceHolder.setDataSource("master");}}
}

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

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

相关文章

QT获取当前路径方法

一、获取应用程序运行路径 假设当前运行的应用程序在 ...\build-qt_python-Desktop_Qt_5_12_10_MinGW_64_bit-Debug\debug下&#xff0c;我们需要获取...\build-qt_python-Desktop_Qt_5_12_10_MinGW_64_bit-Debug\debug这个路径&#xff0c; 可以使用QCoreApplication提供的…

Spring: Springboot 框架集成不同版本的spring redis

文章目录 一、集成不同版本的spring redis1、Spring Data Redis 1.x&#xff1a;2、Spring Data Redis 2.x&#xff1a;3、Spring Data Redis 3.x&#xff08;Spring Boot 2.x&#xff09;&#xff1a; 二、springboot集成Spring Data Redis 2.x1、首先&#xff0c;确保在 pom.…

Vue:vue的安装与环境的搭建

文章目录 环境搭建安装node.js&#xff08;比较简单&#xff09;安装Vue脚手架初始化启动 环境搭建 安装node.js&#xff08;比较简单&#xff09; 首先要安装node.js&#xff0c;进入官网下载即可。 更改安装路径&#xff0c;保持默认配置&#xff0c;一直点击下一步安装即可…

Linux系统运维命令:查看cache里的URL,即查看系统访问了哪些包含http的url(使用grep结合awk,组合命令实现功能)

目 录 一、需求 二、解决方法 1、解决思路 2、命令 三、实例演示和命令解释 1、实例演示 2、命令解释 四、扩展 一、需求 想知道某台linux机器最近访问了哪些http的web地址&#xff0c;如何处理&#xff1f; 二、解决方法 1、解决思路 Linux系统访问外…

(undone) 如何计算 Hessian Matrix 海森矩阵 海塞矩阵

参考视频1&#xff1a;https://www.bilibili.com/video/BV1H64y1T7zQ/?spm_id_from333.337.search-card.all.click 参考视频2&#xff08;正定矩阵&#xff09;&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_…

如何电脑录屏?教你3分钟快速掌握!

在当今数字化时代&#xff0c;电脑录屏已成为一项必不可少的技能。无论是录制游戏画面、线上课程还是软件演示&#xff0c;录屏都可以帮助用户更好地保存和分享信息。可是如何电脑录屏呢&#xff1f;在本文中&#xff0c;我们将介绍两种常用的电脑录屏方法&#xff0c;并分步骤…

【nvm切换node版本,发现npm无法使用,简单粗暴的解决方案】

nvm切换node版本&#xff0c;发现npm无法使用&#xff0c;简单粗暴的解决方案 使用了nvm切换指定node版本后&#xff0c;发现npm命令无法使用。 在nodejs官网找到这部分内容 找到需要安装的压缩包 把解压的文件放入到自己的nvm文件夹内 这部分是解压的nodejs 示例

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…

从初步的需求收集到详细的规划和评估

综合需求分析建议 明确与细化用户故事 确保每个用户故事清晰、具体,包含角色、目标和成功标准。对用户故事进行优先级排序,以指导开发过程中的功能实现顺序。用户参与和原型制作 创建用户旅程图,以理解用户在使用产品或服务时的整体流程与体验。制作原型或草图,展示用户界面…

产品可靠性设计-浪涌防护设计中TVS选型与计算

产品可靠性设计-浪涌防护设计中TVS选型与计算 上一篇 有对产品浪涌和雷电脉冲的瞬态抑制方法和思路进行了分析&#xff0c;我们再对浪涌防护中TVS的能量计算方法举例给电子工程师们进行参考。 1&#xff09;浪涌与EFT及在产品抗扰度测试时的问题及差异 EFT测试是一种高频的现…

Golang 关于 interface 接口的理解

package mainimport "fmt"// 定义一个存储器接口&#xff1a;支持mysql存储、redis存储 type StorageManager interface {insert(data string) int // 增加update(id int, data string) int // 更新 }// 实现一个Mysql存储器 type Mysql struct{}func (mysql…

Langchain-Chatchat:离线运行的大模型知识库 | 开源日报 No.182

chatchat-space/Langchain-Chatchat Stars: 22k License: Apache-2.0 基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现的开源、可离线部署的检索增强生成 (RAG) 大模型知识库项目。该项目是一个可以实现完全本地化推理的知识库增强方案&#xff0c;重点解决数据安全保护…

【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成

前端三件套是指在网页开发中常用的三种技术&#xff1a;HTML&#xff0c;CSS和JavaScript。它们分别负责网页的结构&#xff0c;样式和交互&#xff0c;是构建网页的基础。下面我们来简单介绍一下它们的作用和特点&#xff0c;并举一些例子。 1 HTML——描述页面结构 HTML&am…

投票项目_登录功能的版本迭代

V0版本: 实现最简单的登录,写个接口去数据库查有没有前端传来的账号和密码,查到且密码正确返回“登录成功”&#xff0c;其余情况统一返回“账号或密码错误”。 V1版本: 用session代替cookie 先导入依赖,将session加入到redis中 1.导入依赖 <dependency><groupId>…

智慧园区可视化的价值,不要再吐槽没啥用了。

2023-04-20 13:30贝格前端工场 提高园区运营效率&#xff1a;智慧园区可以通过物联网技术、大数据分析等手段&#xff0c;实现对园区内设施、设备、人员等的实时监控和管理&#xff0c;从而提高园区的运营效率&#xff0c;降低管理成本。 提升园区服务水平&#xff1a;智慧园区…

前端Vue项目无法启动服务,提示无 ‘dev‘ npm的脚本问题解决

目录 一、问题详情 二、问题解决 一、问题详情 上周还能运行的项目&#xff0c;今天突然无法执行了&#xff0c;连最基本的启动按钮也没有了&#xff0c;所有的项目本地都突然跑不起来了&#xff0c;附上截图。 二、问题解决 后来排查的根本原因有点奇葩&#xff0c;是因为…

C++面试 -操作系统-安全能力:死锁的危害、出现原因、解决方法

目录 死锁的危害 死锁出现的原因 死锁的解决方法 死锁是计算机科学中一个非常重要的概念&#xff0c;特别是在多线程、并发编程以及数据库管理系统等领域中。下面是关于死锁的危害、出现原因和解决方法的基础概述&#xff1a; 死锁的危害 资源浪费&#xff1a;死锁导致系统…

ABBYY FineReader16文档转换、PDF管理与文档比较功能介绍

ABBYY FineReader 16作为一款OCR和PDF一体化程序&#xff0c;其强大的功能使得文档处理变得简单高效。在众多功能中&#xff0c;文档转换、PDF管理和文档比较这三大功能尤为突出&#xff0c;成为了众多企业和个人用户的首选工具。 ABBYY Finereader 16-安装包下载如下&#xff…

【每日前端面经】2023-02-26

题目来源: 牛客 http和https http是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说就是一种发布和接收HTML页面的方法&#xff0c;被用于在Web浏览器和网站服务器之间传递消息。该协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如…

内存函数(C语言进阶)

目录 前言 1、memcpy 2、memmove 3、memcmp 4、memset 结语 前言 本篇介绍了C语言中的内存函数&#xff0c;内存函数&#xff0c;顾名思义就是处理内存的函数。 1、memcpy memcpy&#xff1a;内存拷贝函数。 相对于strcpy只能拷贝字符串来讲&#xff0c;memcpy能拷…