使用Spring+MySql实现读写分离spring整合多数据库

Posted 肥宅兜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Spring+MySql实现读写分离spring整合多数据库相关的知识,希望对你有一定的参考价值。

紧接着上一章,因为现在做的项目还是以spring为主要的容器管理框架,所以写以下spring如何整合多个数据源。

 

1. 背景

我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案,

其中一个是主库,负责写入数据,我们称之为:库;

其它都是从库,负责读取数据,我们称之为:库;

 

那么,对我们的要求是:

1、 读库和写库的数据一致;

2、 写数据必须写到写库;

3、 读数据必须到读库;

 

2. 方案

解决读写分离的方案有两种:应用层解决和中间件解决。

2.1. 应用层解决:

 

优点:

1、 多数据源切换方便,程序自动完成;

2、 不需要引入中间件;

3、 理论上支持任何数据库;

缺点:

1、 程序员完成,运维参与不到;

2、 不能做到动态增加数据源;

 

 

2.2. 中间件解决

 

优点:

1、 源程序不需要做任何改动就可以实现读写分离;

2、 动态添加数据源不需要重启程序;

缺点:

1、 程序依赖于中间件,会导致切换数据库变得困难;

2、 由中间件做了中转代理,性能有所下降;

相关中间件产品使用:

mysql-proxyhttp://hi.baidu.com/geshuai2008/item/0ded5389c685645f850fab07

Amoeba for MySQLhttp://www.iteye.com/topic/188598http://www.iteye.com/topic/1113437

 

 

3. 使用Spring基于应用层实现(重要

3.1. 原理

 

在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以queryfind、get等开头的就走读库,其他的走写库。

 

 

3.2. DynamicDataSource

 

 

 

3.3. DynamicDataSourceHolder

 

 

 

3.4. DataSourceAspect

 

 

 

3.5. 配置2个数据源

 

 

 

3.5.2. 定义连接池

 springmvc是子容器,spring是父容器,在父容器的applicationContext.xml配置文件中再添加新配置的数据源

 

 

3.5.3. 定义DataSource

 

 

xml中:

 

 

 

3.6. 配置事务管理以及动态切换数据源切面

 

 

 好啦,就是这样,算是简单的实现,如果想优化,改进切面实现,使用事务策略规则匹配

以上是关于使用Spring+MySql实现读写分离spring整合多数据库的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis+Spring实现Mysql读写分离

使用Spring实现读写分离( MySQL实现主从复制)

使用Spring+MySql实现读写分离主从复制

使用Spring AOP实现MySQL数据库读写分离案例分析

mysql读写分离

使用Spring+MySql实现读写分离spring整合多数据库