使用Spring+MySql实现读写分离(二)spring整合多数据库
2017-11-30 21:58
344 查看
紧接着上一章,因为现在做的项目还是以spring为主要的容器管理框架,所以写以下spring如何整合多个数据源。
其中一个是主库,负责写入数据,我们称之为:写库;
其它都是从库,负责读取数据,我们称之为:读库;
那么,对我们的要求是:
1、 读库和写库的数据一致;
2、 写数据必须写到写库;
3、 读数据必须到读库;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/9f9feffce6070d510a27afd69bf11410.png)
优点:
1、 多数据源切换方便,由程序自动完成;
2、 不需要引入中间件;
3、 理论上支持任何数据库;
缺点:
1、 由程序员完成,运维参与不到;
2、 不能做到动态增加数据源;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/cbd63ad91468630529efd1f3a673215c.png)
优点:
1、 源程序不需要做任何改动就可以实现读写分离;
2、 动态添加数据源不需要重启程序;
缺点:
1、 程序依赖于中间件,会导致切换数据库变得困难;
2、 由中间件做了中转代理,性能有所下降;
相关中间件产品使用:
mysql-proxy:http://hi.baidu.com/geshuai2008/item/0ded5389c685645f850fab07
Amoeba for MySQL:http://www.iteye.com/topic/188598和http://www.iteye.com/topic/1113437
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/8822611d6d0a3e0bcff4187a40dfabe1.png)
在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/4887bdb970a5862f301f911c6d2fcdd9.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/c75c198a257ef4f27bb912e15d06e207.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/565430e47eb42abb07a03e9e5af3142c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/bd3706190401ea70a3657a503efda643.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/6b194d74dcea74d23cde3026bd9bf501.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/85b7d7f7b3ce1353dd64d03fcb46f9f4.png)
xml中:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/15d4dcef8297a04b9a4cfa81765293f5.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/94d2e1ad5f02838e8d4c7d0d9a1827dc.png)
好啦,就是这样,算是简单的实现,如果想优化,改进切面实现,使用事务策略规则匹配
1. 背景
我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案,其中一个是主库,负责写入数据,我们称之为:写库;
其它都是从库,负责读取数据,我们称之为:读库;
那么,对我们的要求是:
1、 读库和写库的数据一致;
2、 写数据必须写到写库;
3、 读数据必须到读库;
2. 方案
解决读写分离的方案有两种:应用层解决和中间件解决。2.1. 应用层解决:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/9f9feffce6070d510a27afd69bf11410.png)
优点:
1、 多数据源切换方便,由程序自动完成;
2、 不需要引入中间件;
3、 理论上支持任何数据库;
缺点:
1、 由程序员完成,运维参与不到;
2、 不能做到动态增加数据源;
2.2. 中间件解决
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/cbd63ad91468630529efd1f3a673215c.png)
优点:
1、 源程序不需要做任何改动就可以实现读写分离;
2、 动态添加数据源不需要重启程序;
缺点:
1、 程序依赖于中间件,会导致切换数据库变得困难;
2、 由中间件做了中转代理,性能有所下降;
相关中间件产品使用:
mysql-proxy:http://hi.baidu.com/geshuai2008/item/0ded5389c685645f850fab07
Amoeba for MySQL:http://www.iteye.com/topic/188598和http://www.iteye.com/topic/1113437
3. 使用Spring基于应用层实现(重要)
3.1. 原理
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/8822611d6d0a3e0bcff4187a40dfabe1.png)
在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。
3.2. DynamicDataSource
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/4887bdb970a5862f301f911c6d2fcdd9.png)
3.3. DynamicDataSourceHolder
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/c75c198a257ef4f27bb912e15d06e207.png)
3.4. DataSourceAspect
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/565430e47eb42abb07a03e9e5af3142c.png)
3.5. 配置2个数据源
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/bd3706190401ea70a3657a503efda643.png)
3.5.2. 定义连接池
springmvc是子容器,spring是父容器,在父容器的applicationContext.xml配置文件中再添加新配置的数据源![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/6b194d74dcea74d23cde3026bd9bf501.png)
3.5.3. 定义DataSource
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/85b7d7f7b3ce1353dd64d03fcb46f9f4.png)
xml中:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/15d4dcef8297a04b9a4cfa81765293f5.png)
3.6. 配置事务管理以及动态切换数据源切面
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/29/94d2e1ad5f02838e8d4c7d0d9a1827dc.png)
好啦,就是这样,算是简单的实现,如果想优化,改进切面实现,使用事务策略规则匹配
相关文章推荐
- dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(三)使用Spring AOP实现mysql的读写分离
- mysql+spring+mybatis实现数据库读写分离[代码配置]
- 使用Spring实现读写分离(MySQL实现主从复制)
- mysql5.6.13通用二进制格式安装并使用amoeba实现对mysql5.6数据库读写分离
- 使用Spring实现读写分离( MySQL实现主从复制)
- 使用Spring实现读写分离(MySQL实现主从复制)
- 使用mysql 中间件 Atlas 实现数据库读写分离
- 使用Spring实现读写分离( MySQL实现主从复制)
- mysql+spring+mybatis实现数据库读写分离[代码配置]
- 使用Spring实现读写分离(MySQL实现主从复制)
- 使用spring的动态路由实现数据库读写分离【数据库读写分离(二) 】
- 使用yii2实现读写分离(MySQL主从数据库)
- 使用Spring实现读写分离( MySQL实现主从复制)
- 使用spring实现读写分离(mysql实现主从复制)
- 使用Spring实现读写分离( MySQL实现主从复制)
- 使用Spring实现读写分离( MySQL实现主从复制)
- mysql+spring+mybatis实现数据库读写分离[代码配置] .
- MariaDB数据库读写分离实现(一):mysql-proxy的使用
- 使用Spring实现读写分离( MySQL实现主从复制)
- 使用MySQL-Proxy实现数据库读写分离