Spring多数据源详解之读写分离

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:……我操你了,说的那么复杂,能不能举个例子

Spring多数据源详解之读写分离_第1张图片

【1】、目录结构: DynamicDataSource entend AbstractRoutingDataSource

Spring多数据源详解之读写分离_第2张图片

【2】、pom.xml {这波操作aop才是核心}


Spring多数据源详解之读写分离_第3张图片

【3】、Spring的配置文件:动态数据源是核心

Spring多数据源详解之读写分离_第4张图片

Spring多数据源详解之读写分离_第5张图片

【4】、Service And Service  Implements



Spring多数据源详解之读写分离_第6张图片
Spring多数据源详解之读写分离_第7张图片

【5】、这个类的before方法会在Spring调用service中方法之前---AOP

Spring多数据源详解之读写分离_第8张图片

    获许有细心的小伙伴会发现,我们明明切入的是实现类,但是我们的注解却是放在了接口上,这波操作我只想说……Spring在实现AOP的时候用的是动态代理【没看过源码】,而Spring会帮我们生成代理对象 ,我们不会直接操作实际对象,Spring更多的是面向接口,哎……水不下去了 。哪位大神知道对我说一下……

Spring多数据源详解之读写分离_第9张图片


【6】、数据源处理

Spring多数据源详解之读写分离_第10张图片


Spring多数据源详解之读写分离_第11张图片

【7】、DynamicDataSource数据源详解之AbstractRoutingDataSource

    其实关键点都在 AbstractRoutingDataSource这个类里面,这个类是一个控制器,只要你给他数据源类型,那么,他就会使用什么数据源类型。翻一下源码吧,就大致了解了 。随便截几个图意思一下!!


Spring多数据源详解之读写分离_第12张图片


Spring多数据源详解之读写分离_第13张图片

【8】、数据库运行之前


Spring多数据源详解之读写分离_第14张图片
Spring多数据源详解之读写分离_第15张图片

【9】、运行之后:插入用的是master数据源,查询用的slaver数据源


Spring多数据源详解之读写分离_第16张图片
Spring多数据源详解之读写分离_第17张图片
Spring多数据源详解之读写分离_第18张图片
插入
Spring多数据源详解之读写分离_第19张图片
查询
Spring多数据源详解之读写分离_第20张图片

【10】、结语:


Spring多数据源详解之读写分离_第21张图片

你可能感兴趣的:(Spring多数据源详解之读写分离)