吐槽:前天刚加完MQ,这回加读写分离。我也是醉了,但是弄完之后,就发现,似乎没我想的那么复杂,真的!另外,昨天试了一下用swagger编写API文档,太方便了,加上Mock service测试。这两天都好忙啊,忙着优化项目,忙着写接口,不过,再忙的日子,也得写总结!今天,主要是记录一下,往项目中加读写分离的过程。

1,mysql数据库安装,不说了。主从配置,也不说了。有需要的,请宝宝吃饭,宝宝手把手教!

2,宏观描述一下过程:在访问service方法前,通过AOP做出判断(以方法名:嘿嘿,命名规范哈)如果是以query、find、get等读操作打头的,就走从库(读库),其他的,则走主库(写库)

3、具体实施

3.1,首先是定义动态数据源,通过继承实现Spring提供的AbstractRoutingDataSource抽象类的determineCurrentLookupKey方法:

public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
* 定义动态数据源
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
//返回当前线程中的数据源
return DynamicDataSourceHolder.getDataSourceKey();
}
}
public class DynamicDataSourceHolder {

    //写库数据源key值
private static final String MASTER="master";
//读库数据源key值
private static final String SLAVE="slave"; //使用threadlocal记录当前线程的数据源
private static final ThreadLocal<String> holder=new ThreadLocal<>(); //设置数据源
public static void putDataSourceKey(String key){
holder.set(key);
} //获取数据源
public static String getDataSourceKey(){
return holder.get();
} public static void markMaster(){
putDataSourceKey(MASTER);
} public static void markSlave(){
putDataSourceKey(SLAVE);
}
}

3.2,编写AOP织入的切面

public class DataSourceAspect {

    /**
* 进入service方法之前执行
* @param joinpoint 切面对象
*/
public void before(JoinPoint joinpoint){
//获取当前执行方法名
String methodName=joinpoint.getSignature().getName();
//分别标记读、写库
if(isSlave(methodName)){
DynamicDataSourceHolder.markSlave();
}else{
DynamicDataSourceHolder.markMaster();
}
} /**
* 是否是从库(读库)
* @param methodName 访问的方法名称
* @return 如果是从库,返回true
*/
private boolean isSlave(String methodName){
return StringUtils.startsWithAny(methodName,"query","find","get");
} }

3.3,配置数据源

首先,是在db.properties文件中,配置两个数据源(可能会有多个从库,这里以主从分别为一个说明),分别为写库和读库

其次,为两个数据源配置连接池

然后,定义DataSource

<bean id="dataSource" class="DynamicData.DynamicDataSource">
<!--配置多个数据源-->
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="master" value-ref="masterDataSource"/>
<entry key="slave" value-ref="slaveDataSource"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="masterDataSource"/>
</bean>

3.4,定义切面

事务什么的,早就配好了,这里略过,主要是说关于读写分离的要点。

<!--定义AOP切面处理器-->
<bean class="DynamicData.DataSourceAspect" id="dataSourceAspect"/> <!-- 切面 -->
<aop:config>
<!-- 定义切面,所有的service的所有方法——读写 -->
<aop:pointcut id="txPointcut"
expression="execution(* *.service.*.*(..))" /> <!--事务传播策略-->
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *.service.*.*(..))" />
<!-- 将切面应用到自定义的切面处理器上,-9999保证该切面优先级最高执行 -->
<aop:aspect ref="dataSourceAspect" order="-9999">
<aop:before method="before" pointcut-ref="txPointcut" />
</aop:aspect>
</aop:config>

4,总结

这样子,就配好了(嘿嘿,但愿我没有忘记什么,这两天脑袋里东西有点多) 读写分离,配好了。值得一说的是,虽然没有过多的说mysql的安装配置,但是,对于主从的存储引擎配置,应该注意。分别为主从数据库,配置相应的存储引擎!

Mysql读写分离实例的更多相关文章

  1. 三十五.MySQL读写分离 MySQL多实例 、MySQL性能调优

    1.实现MySQL读写分离 搭建一主一从结构 配置maxscale代理服务器 测试分离配置   1.1 搭建一主一从结构 192.168.4.51 主 192.168.4.52 从 测试OK   1. ...

  2. [记录]MySQL读写分离(Atlas和MySQL-proxy)

    MySQL读写分离(Atlas和MySQL-proxy) 一.阿里云使用Atlas从外网访问MySQL(RDS) (同样的方式修改配置文件可以实现代理也可以实现读写分离,具体看使用场景) 1.在跳板机 ...

  3. docker环境 mysql读写分离 mycat maxscale

    #mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...

  4. 提高性能,MySQL 读写分离环境搭建

    这是松哥之前一个零散的笔记,整理出来分享给大伙! MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了.受困于 Linux 和 MySQL 版本问题,很多人经常会搭建失败,今天松哥就给大伙举 ...

  5. mysql读写分离(PHP类)

    mysql读写分离(PHP类) 博客分类: php mysql   自己实现了php的读写分离,并且不用修改程序 优点:实现了读写分离,不依赖服务器硬件配置,并且都是可以配置read服务器,无限扩展 ...

  6. amoeba实现MySQL读写分离

    amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为19 ...

  7. PHP代码实现MySQL读写分离

    关于MySQL的读写分离有几种方法:中间件,Mysql驱动层,代码控制 关于中间件和Mysql驱动层实现Mysql读写分离的方法,今天暂不做研究, 这里主要写一点简单的代码来实现由PHP代码控制MyS ...

  8. 转:Mysql读写分离实现的三种方式

    1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自 ...

  9. 使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置

    参考博文: MySQL-(Master-Slave)配置  本人按照博友北在北方的配置已成功  我使用的是 mysql5.6.27版本. 使用Atlas实现MySQL读写分离 数据切分——Atlas读 ...

随机推荐

  1. 深入理解Java流机制(一)

    一.前言 C语言本身没有输入输出语句,而是调用"stdio.h"库中的输入输出函数来实现.同样,C++语言本身也没有输入输出,不过有别于C语言,C++有一个面向对象的I/O流类库& ...

  2. JavaScript_10_错误

    Try...catch... throw <!DOCTYPE html> <html> <head> <title></title> < ...

  3. JavaScript_6_函数

    函数是由事件驱动的或者当它被调用执行的可重复使用的代码块 调用带参数的函数 带有返回值的函数 <!DOCTYPE html> <html> <head> <t ...

  4. hdu 2126 Buy the souvenirs 买纪念品(01背包,略变形)

    题意: 给出一些纪念品的价格,先算出手上的钱最多能买多少种东西k,然后求手上的钱能买k种东西的方案数.也就是你想要买最多种东西,而最多种又有多少种组合可选择. 思路: 01背包.显然要先算出手上的钱m ...

  5. uva10129 PlayOnWords(并查集,欧拉回路)

    判断无向图是否存在欧拉回路,就是看度数为奇数的点有多少个,如果有两个,那么以那分别两个点为起点和终点,可以构造出一条欧拉回路,如果没有,就任意来,否则,欧拉回路不存在. 首先用并查集判断连通,然后统计 ...

  6. [视觉] 基于YoloV3的实时摄像头记牌器

    基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...

  7. [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)

    题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  ...

  8. 第二单元OO总结

    目录 前言 一.第一次作业分析 1. UML及复杂度分析 二.第二次作业分析 1. UML及复杂度分析 2. 性能优化 2.1 楼层类的实现 2.2 调度算法 3. bug分析 三.第三次作业分析 1 ...

  9. Linux运维笔记--第三部

    第三部 3. Linux系统文件重要知识初步讲解 # ls  -lhi   (i: inode,每个文件前的数字代表文件身份ID:h: human 人类可读) 显示:25091 -rw-r--r-- ...

  10. error PRJ0019: 工具从 “正在执行生成后事件... ”

    error PRJ0019: 工具从"正在执行生成后事件..." 原因是属性->生成事件->生成后事件 命令行设置错误导致的,修改即可 因为path前面有空格,所以这里 ...