最近搭建的一个项目需要实现数据源的读写分离,在这里将代码进行分享,以供参考。

关键词:DataSource 、AbstractRoutingDataSource、AOP

首先是配置数据源

//配置省略

//配置省略

数据源是如何切换的呢?

通过动态数据源的配置我们知道原来是通过key来进行切换,这里要使用到org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,我们可以编写自己的动态数据源类DynamicDataSource来继承它。

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DataSourceContextHolder.getType();

}

}

还需要一个存放key的地方DataSourceContextHolder 为保证切换时线程安全我们使用ThreadLocal来保存我们的key。

public class DataSourceContextHolder {

private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class);

public static final String DATA_SOURCE_WRITE = "WRITE";

public static final String DATA_SOURCE_READ = "READ";

// 线程本地环境

private static final ThreadLocal contextHolder = new ThreadLocal();

// 设置数据源类型

public static void setType(String type) {

if(LOGGER.isDebugEnabled())

LOGGER.debug("==============切换数据源,类型:"+type+"================");

contextHolder.set(type);

}

// 获取数据源类型

public static String getType() {

return (contextHolder.get());

}

// 清除数据源类型

public static void clearType() {

contextHolder.remove();

}

}

好了,我们可以通过操作DataSourceContextHolder来实现数据源动态的切换了。小伙伴们可能会说了,难道每次调用方法都要手动选择要切换的数据源类型?当然不是啦,Spring AOP登场。

@Component

@Aspect

public class DynamicDataSourceAspect {

@Pointcut("execution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ")

public void readMethodPointcut() {}

@Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))")

public void writeMethodPointcut() {}

@Before("readMethodPointcut()")

public void switchReadDataSource(){

//System.out.println("============切换到读数据源===========");

DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);

}

@Before("writeMethodPointcut()")

public void switchWriteDataSource(){

//System.out.println("=============切换到写数据源==========");

DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);

}

}

好啦,在访问Mapper(本项目使用的是MyBatis啦,相当于是DAO)中查询方法时会切换到读数据源,增、删、改方法会切换到写数据源。

写在最后:欢迎留言讨论,加关注,持续更新!!!

Java 阿里巴巴数据源_阿里P7教你如何使用 Spring 配置动态数据源实现读写分离相关推荐

  1. java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  2. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  3. Spring 的动态数据源实现

    1. 配置多个数据源 这里以两个c3p0数据库连接池的数据源作为实例.在Spring框架下使用c3p0的数据库需要加入c3p0-0.9.1.2.jar(现在最新的)这个支持包.这里以数据同步项目为例: ...

  4. 接口返回数据太大_阿里工程师教你 3 分钟实现数据源编排和接入

    作者| 阿里文娱高级开发工程师 天甘 慕理 责编 | 屠敏 头图 | CSDN 下载自东方 IC 背景 你一定也深有同感,在开发业务需求时,1/3是时间都花费在了前期准备工作上.比如,调研数据来自哪里 ...

  5. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  6. 阿里java工程师要求_阿里Java P系列技术要求(P5-P7)

    阿里p系列薪资(最新数据比这个高1倍左右) 阿里P5(高级研发工程师) 工作要求: 能独立完成日常工作,并能够对一些方案提出自己的建议. 基本考核就是能上手独立完成工作,熟练掌握. 技能要求(熟练): ...

  7. 项目如何用jetty运行_阿里大牛教你如何用Dubbox+SpringBoot+Docker架构,实现双11项目...

    前言 本篇围绕秒杀抢购应用场景,对当下流行的Dubbox+ Spring Boot+Docker微服务架构解决方案进行讲解.主要内容包括微服务架构介绍.Dubbox 原理及运用.使用Spring Bo ...

  8. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望

    点关注,不迷路:持续更新Java相关技术及资讯!!! 内容源于群友投稿!记录一次阿里Java后端开发面经,分享给大家,感谢支持! 前言 秋招面试的第一家公司,也是第一次面试,真的超级紧张,从自我介绍到 ...

  9. java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. ---------------------------------------- ...

最新文章

  1. 简述DataInputStream和DataOuputStream
  2. 用Python分析了十年电影票房,原来我错过了这么多好电影!
  3. 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
  4. ubuntu14.04 nginx php编译安装,Ubuntu 14.04 编译安装 Nginx
  5. 从民宅到独栋大厦 我们搬家啦!
  6. php上传视频文件代码,php上传视频的代码
  7. 应用层协议:HTTP与HTTPS协议详解、二者的区别
  8. Maven系列2--pom.xml 配置详解
  9. MVC 3 基本操作增加修改
  10. [Ext JS 4] 实战之Chart, Column Chart 定制颜色
  11. 剑指offer面试题68 - II. 二叉树的最近公共祖先(递归)
  12. Struts2-01-配置文件
  13. Captura录屏软件使用说明
  14. 前端知识点——Web Sockets
  15. 解决tensorflow2.x中使用tf.contrib.slim包时出现的No module named:tensorflow.contrib 问题
  16. 保留至百位并且向上取整 例如:125631 >>125700
  17. 徐州php溪谷_ThinkPHP溪谷H5游戏平台系统V3.0完整版源码
  18. Word标题跟随正文样式缩进的解决办法
  19. 360视频:CMP和ACP投影
  20. 什么语言最适合做 GUI?

热门文章

  1. 电子设计竞赛(三)-SPWM与PID
  2. 不懂电容原理?那是你没看到这些动图
  3. verilog or VHDL乒乓球游戏电路设计
  4. java生产者与消费者问题_java生产者与消费者问题
  5. 安卓 sqlite数据存入mysql_在Android上简单导出和导入SQLite数据库
  6. Flask-SQLAlchemy的基本使用
  7. BZOJ1835: [ZJOI2010]base 基站选址(线段树优化Dp)
  8. Delphi开发的服务在Windows2003 64位注册方式。
  9. 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
  10. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-Switch Case语句是否会自动跳转到下一个