Mysql读写分离实例
吐槽:前天刚加完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读写分离实例的更多相关文章
- 三十五.MySQL读写分离 MySQL多实例 、MySQL性能调优
1.实现MySQL读写分离 搭建一主一从结构 配置maxscale代理服务器 测试分离配置 1.1 搭建一主一从结构 192.168.4.51 主 192.168.4.52 从 测试OK 1. ...
- [记录]MySQL读写分离(Atlas和MySQL-proxy)
MySQL读写分离(Atlas和MySQL-proxy) 一.阿里云使用Atlas从外网访问MySQL(RDS) (同样的方式修改配置文件可以实现代理也可以实现读写分离,具体看使用场景) 1.在跳板机 ...
- docker环境 mysql读写分离 mycat maxscale
#mysql读写分离测试 环境centos 7.4 ,docker 17.12 ,docker-compose mysql 5.7 主从 mycat 1.6 读写分离 maxscale 2.2.4 读 ...
- 提高性能,MySQL 读写分离环境搭建
这是松哥之前一个零散的笔记,整理出来分享给大伙! MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了.受困于 Linux 和 MySQL 版本问题,很多人经常会搭建失败,今天松哥就给大伙举 ...
- mysql读写分离(PHP类)
mysql读写分离(PHP类) 博客分类: php mysql 自己实现了php的读写分离,并且不用修改程序 优点:实现了读写分离,不依赖服务器硬件配置,并且都是可以配置read服务器,无限扩展 ...
- amoeba实现MySQL读写分离
amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为19 ...
- PHP代码实现MySQL读写分离
关于MySQL的读写分离有几种方法:中间件,Mysql驱动层,代码控制 关于中间件和Mysql驱动层实现Mysql读写分离的方法,今天暂不做研究, 这里主要写一点简单的代码来实现由PHP代码控制MyS ...
- 转:Mysql读写分离实现的三种方式
1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自 ...
- 使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置
参考博文: MySQL-(Master-Slave)配置 本人按照博友北在北方的配置已成功 我使用的是 mysql5.6.27版本. 使用Atlas实现MySQL读写分离 数据切分——Atlas读 ...
随机推荐
- 宿主机Windows访问虚拟机Linux文件(二)
上一篇文章中详细讲述FTP服务(基于文件传输协议的服务),本文则介绍另一种能够实现此功能Telnet(Telecommunications network 远程登陆)服务.本文介绍的telnet我常用 ...
- Linux安装loadrunner负载机
1.loadrunner下载地址:http://download.csdn.net/download/intel80586/9542271或者其他资源 2.首先用rpm -qa|grep -i c++ ...
- IT部门域事件与业务分析
IT event--->system--->IT dept |--------------->IT dept |--------------->system 域事件分类: 直接 ...
- python 之format字符串格式化
print函数之format字符串格式化方法的使用与学习笔记. 一.映射关系 (1)“映射”示例,以下通过位置举例说明: [+]Example_1: >>> print(" ...
- mvc的help和functions语法
@helper show(int num ) { ) { @:存在 } else { @:不存在 } } @functions { /// <summary> /// 方法必须要求为静态 ...
- XManager 远程连接Netbackup图形用户界面
XManager远程连接Netbackup图形用户界面 目标: 在自己的Windows桌面打开Linux的Netbackup图形用户界面 工具: Windows: Xmanager,Xshell, ...
- [Docker] Docker安装和简单指令
Docker笔记 安装 sudo apt install docker.io 启动和关闭Docker服务 # 启动Docker服务 sudo service docker start # 关闭Dock ...
- HTML之基本语法(表单)
一.表单的基本介绍 表单:就是互联网上用于收集用户信息的一种结构,在HTML当中事先定义好了一种标签来完成此事,标签名称为form,它是一个双标签<form action="" ...
- Tomcat详细安装配置
1.首先是Tomcat的获取和安装. 获取当然得上Apache的官方网站下载,开源免费,而且带宽也足够.下载会很快. 这是两种不同的下载,一个是普通安装版本,一个是解压安装版本.使用起来是一样的,只是 ...
- IOS中将颜色转换为image
- (UIImage *)createImageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f ...