Question:为什么要用读写分离?
Reason:数据库中由于表级锁、行级锁的存在,使我们在插入时查询效率降低,造成了严重的资源浪费,从而导致服务器压力过大,连接数不够。所以数据源的读写分离的效果1+1>2
下面,我就以两个已经建立起主从复制的Mysql数据库,在Sping中建立读写分离机制。
Spring在设计的时候就已经提供了这个功能,而我们要实现的是他的数据源插入机制,也就是在什么时候用Master(插入的数据源),什么时候用Slaver(查询的数据源)。AbstractRoutingDataSource就是这个控制器,只要我们实现它,然后重写他的抽象方法。
Q:那么,我们什么时候用master、slaver呢??
A:废话,当然是查询的时候用slaver插入的时候用master
Q:好,你怎么知道什么时候是插入、什么时候是查询呢?
A:在service方法中,自定义注解>>反射读取注解>>判断数据源>>分配数据源到 AbstractRoutingDataSource >>Spring给你装配到DAO
Q:那么Spring怎么知道呢,Spring怎样保证分配的数据源不会给你分配错呢?
A: 我靠,你烦不烦,你创建一个ThreadLocal啊,然后在分配数据源的时候在ThreadLocal里面看看啊,这不就行了。
Q:……我操你了,说的那么复杂,能不能举个例子
【1】、目录结构: DynamicDataSource entend AbstractRoutingDataSource
【2】、pom.xml {这波操作aop才是核心}
【3】、Spring的配置文件:动态数据源是核心
【4】、Service And Service Implements
【5】、这个类的before方法会在Spring调用service中方法之前---AOP
获许有细心的小伙伴会发现,我们明明切入的是实现类,但是我们的注解却是放在了接口上,这波操作我只想说……Spring在实现AOP的时候用的是动态代理【没看过源码】,而Spring会帮我们生成代理对象 ,我们不会直接操作实际对象,Spring更多的是面向接口,哎……水不下去了 。哪位大神知道对我说一下……
【6】、数据源处理
【7】、DynamicDataSource数据源详解之AbstractRoutingDataSource
其实关键点都在 AbstractRoutingDataSource这个类里面,这个类是一个控制器,只要你给他数据源类型,那么,他就会使用什么数据源类型。翻一下源码吧,就大致了解了 。随便截几个图意思一下!!
网友评论