Spring+mybatis+Druid+AbstractRoutingDataSource配置多数据源切换进行读写分离

2023-11-01

自我理解是这样的。首先配置事务管理器设置设置方法是否是只读创建一个DynamicDataSourceTransactionManager的类继承DataSourceTransactionManager去重写doBegin与doCleanupAfterCompletion方法。doBegin方法里根据事务设置默认类TransactionDefinition 对象调用isReadOnly()方法来判断当前事务切点的方法的读写属性(在Spring的xml或者事务注解中配置)如果为true为只读那么就使用ThreadLocal线程锁的特性设置一个标识字符串slave否则设置为master.最后调用父类的doBegin的方法。在重写的doCleanupAfterCompletion中清除掉保存的标识符,这些标识。也就是相当说在原来的方法上面多了设置线程标识的功能。然后到xml.中配置数据源。创建一个抽象类AbstractRoutingDataSource继承AbstractDataSource是DataSource的子类(也就是获得连接对象DataSource的地方)需要重写getConnection方法,还需要继承InitializingBeanSpring框架注册初始化类的接口。创建一个抽象方法determineCurrentLookupKey()该方法可以获取到dataSource的key值就可以从配置文件中设置好后存入的Map获取到对应的DataSource.如果找不到就用配置默认的数据源。创建DynamicDataSource类继承AbstractRoutingDataSource。重写determineCurrentLookupKey(),afterPropertiesSet(),determineTargetDataSource()。重点在于determineTargetDataSource()根据获取当前线程标识

1.创建DateSourceHolder类,根据ThreadLocal 特性来识别线程来获取哪个数据源。

import javax.sql.DataSource;


public class DateSourceHolder {
private static final String MASTER = "master";
private static final String SLAVE = "slave";

private static final ThreadLocal<String> dataSource = new ThreadLocal<>();
private static final ThreadLocal<DataSource> masterLocal = new ThreadLocal<>();
private static final ThreadLocal<DataSource> slaveLocal = new ThreadLocal<>();


private static void setDataSource(String dataSourceKey) {
dataSource.set(dataSourceKey);
}

private static String getDataSource() {
return dataSource.get();
}
public static boolean isMaster() {
return getDataSource() == MASTER;
}


public static boolean isSlave() {
return getDataSource() == SLAVE;
}

public static void setMaster() {
setDataSource(MASTER);
}


public static void setSlave() {
setDataSource(SLAVE);
}

public static void setSlave(DataSource dataSource) {
slaveLocal.set(dataSource);
}


public static void setMaster(DataSource dataSource) {
masterLocal.set(dataSource);
}
public static void clearDataSource() {
dataSource.remove();
masterLocal.remove();
slaveLocal.remove();
}

}

2.创建AbstractRoutingDataSource 抽象类并继承AbstractDataSource 实现InitializingBean

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;


import javax.sql.DataSource;


import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.Abstr

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring+mybatis+Druid+AbstractRoutingDataSource配置多数据源切换进行读写分离 的相关文章

随机推荐

  • 虚拟专用网拨号出现错误提示:没有设置允许基本路由封装GRE协议数据包通过-原因解决方法

    今天给用户配置虚拟专用网拨号到单位的服务器 操作系统为win10 执行拨号后 提示上面的信息经过百度搜索 发现这个问题和网络运营商有关系 因为你使用的是移动或联通宽带 服务商阻止了虚拟专用网通道 只要换电信宽带就好了 恰巧就是使用了联通的移
  • C语言工资管理系统

    include
  • 03.前后端分离中台框架 zhontai 项目代码生成器的使用

    zhontai 项目 基于 Net7 x Vue 等技术的前后端分离后台权限管理系统 想你所想的开发理念 希望减少工作量 帮助大家实现快速开发 后端地址 https github com zhontai Admin Core 前端地址 ht
  • flutter实现APP版本更新(全局弹窗overlay实现)

    升级说明 Android 应用内更新下载 安装 iOS 跳转到appstore下载安装 注 可以通过热更新技术进行升级 我不会 引用插件 获取当前版本 package info 0 4 3 2 版本内更新 ota update 2 4 1
  • Mac下终端(Terminal)中打开某应用的技巧

    Mac下一般都是点击某一个应用的图标 或者在Alfred中键入应用名称打开该应用 但有时候在终端执行某些代码 此时想打开程序 以上操作都不流畅 所以琢磨能否在终端下直接打开某些程序 比如要 编辑路径下的shell脚本文件 但又不想使用vim
  • 基于Stable Diffusion的AIGC服饰穿搭实践

    本文主要介绍了基于Stable Diffusion技术的虚拟穿搭试衣的研究探索工作 文章展示了使用LoRA ControlNet Inpainting SAM等工具的方法和处理流程 并陈述了部分目前的实践结果 通过阅读这篇文章 读者可以了解
  • python爬虫学习笔记-requests高级

    简历模板下载拓展 import requests from lxml import etree import os headers User Agent Mozilla 5 0 Macintosh Intel Mac OS X 10 15
  • http与websocket

    http与websocket HTTP 是一个在计算机世界里专门在两点之间传输文字 图片 音频 视频等超文本数据的约定和规范 WebSocket是HTML5出的东西 协议 也就是说HTTP协议没有变化 或者说没关系 但HTTP是不支持持久连
  • 小程序中使用CANVAS实现手写签名并写入模板图片中

    实测 开发者工具中滚动条位置会影响书写 显示会有些问题 并且会卡顿 安卓 苹果手机上测试正常 index js const App getApp Page 页面的初始数据 data curScrollTop 0 生命周期函数 监听页面加载
  • python计时模块——timeit

    timeit模块 timeit 模块定义了接受两个参数的 Timer 类 两个参数都是字符串 第一个参数是你要计时的语句或者函数 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句 从内部讲 timeit 构建起一个独立的
  • PWM驱动MOS管H桥电路分析

    H桥是一个典型的直流电机控制电路 因为它的电路形状酷似字母H 故得名与 H桥 4个三极管组成H的4条垂直腿 而电机就是H中的横杠 注意 图中只是简略示意图 而不是完整的电路图 其中三极管的驱动电路没有画出来 01 H桥驱动原理 1 电机驱动
  • 网络安全-文件包含漏洞原理、攻击及防御

    目录 简介 类型 原理 攻击 仅本地文件包含 防御 简介 文件包含 是一个功能 在各种开发语言中都提供了内置的文件包含函数 可以使开发人员在一个代码文件中直接包含 引入 另外一个代码文件 类型 根据不同的配置环境 文件包含漏洞分为如下两种情
  • Qt - QLabel设置字体颜色

    Qt QLabel设置字体颜色 第一种 使用setPalette 方法如下 QLabel label new QLabel tr Hello Qt QPalette pe pe setColor QPalette WindowText Qt
  • 等级保护2.0四级通用要求测评方法

    等级保护2 0四级通用要求测评方法
  • Python 使用 smtp ssl 模式 发送邮件与附件

    参考 发送邮件简单入门 以qq邮箱 163邮箱为例 https blog csdn net qq 38661599 article details 81013834 smtp ssl 模式 发送邮件 与 附件 https www cnblo
  • Vue-组件之间的的数据传递

    目录 组件的使用 注册全局组件 props组件 组件之间样式冲突问题 父 子关系传递 子 父关系传递 兄弟之间的传递 ref引用 什么是组件 只要是 vue后缀的文件都是一个组件 而组件之间是独立的 相互之间没有关系 当在使用组件的时候 根
  • 数据库 数据结构设计实验报告 包括er图转关系模式

    年级 班号 组号 学号 专业 日期 姓名 实验名称 实验一 数据库设计 实验室 实验 目的 或 要求 1 通过了解具体的应用案例体验数据库的应用 以及数据库系统和应用程序之间的关联关系 从而进一步理解数据 数据库 DBMS基本概念知识 2
  • chatgpt赋能python:如何利用Python绘制窗口

    如何利用Python绘制窗口 作为一门高级编程语言 Python具备强大的绘图能力 可以用来创建各种窗口应用程序 本篇文章将介绍如何利用Python绘制窗口 并分析其在搜索引擎优化方面的作用 绘制窗口的基本步骤 要利用Python绘制窗口
  • 测试-python筑基1.1-(列表/元组/字典/集合/字符串)

    列表 列表 列表 一种将多个数据组合到一起的容器 标识符 关键字 list 给列表赋值变量名的时候 不要用关键字 list 1 定义一个空列表 list 2 1 2 3 4 5 定义一个有值的列表 不是数组 print type list
  • Spring+mybatis+Druid+AbstractRoutingDataSource配置多数据源切换进行读写分离

    自我理解是这样的 首先配置事务管理器设置设置方法是否是只读创建一个DynamicDataSourceTransactionManager的类继承DataSourceTransactionManager去重写doBegin与doCleanup