java读写分离的实现
1. 背景
我们一般应用对 数据库 而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是从库,负责读取数据,我们称之为:读库; 那么,对我们的要求是: 1、读库和写库的数据一致;(这个是很重要的一个问题,处理业务逻辑要放在service层去处理,不要在dao或者mapper层面去处理) 2、写数据必须写到写库; 3、读数据必须到读库;2. 方案
解决读写分离的方案有两种:应用层解决和中间件解决。2.1. 应用层解决:

2.2. 中间件解决

3. 使用Spring基于应用层实现
3.1. 原理

3.2. DynamicDataSource


3.3. DynamicDataSourceHolder


3.4. DataSourceAspect


3.5. 配置2个数据源
3.5.1. jdbc.properties


3.5.2. 定义连接池


3.5.3. 定义DataSource


3.6. 配置事务管理以及动态切换数据源切面
3.6.1. 定义事务管理器
<!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>3.6.2. 定义事务策略


3.6.3. 定义切面


4. 改进切面实现,使用事务策略规则匹配
之前的实现我们是将通过方法名匹配,而不是使用事务策略中的定义,我们使用事务管理策略中的规则匹配。4.1. 改进后的配置


4.2. 改进后的实现


5. 一主多从的实现
很多实际使用场景下都是采用“一主多从”的 架构 的,所以我们现在对这种架构做支持,目前只需要修改DynamicDataSource即可。
5.1. 实现


6. MySQL主从复制
6.1. 原理

6.2. 主从配置需要注意的地方
1、主DB server和从DB server数据库的版本一致 2、主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录] 3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一6.3. 主库配置(windows,Linux下也类似)
可能有些朋友主从数据库的ip地址、用户名和账号配置不是很清楚,下面是我测试的主从配置,ip都是127.0.0.1,我在讲完自己的例子后,还会写 一个主从ip是不相同的配置的例子,大家可以通过这个例子去更加直观的了解配置方法。 在my.ini [mysqld] 下面修改(从库也是如此): #开启主从复制,主库的配置 log-bin= mysql3306-bin #指定主库serverid server-id=101 #指定同步的数据库,如果不指定则同步全部数据库 binlog-do-db=mybatis_1128 (my.ini中输入的这些命令一定要和下面有一行空格,不然MySQL不识别) 执行SQL语句查询状态: SHOW MASTER STATUS


6.4. 在主库创建同步用户
#授权用户slave01使用123456密码登录mysql grant replication slave on *.* to 'slave01'@'127.0.0.1'identified by '123456'; flush privileges;6.5. 从库配置
在my.ini修改: #指定serverid,只要不重复即可,从库也只有这一个配置,其他都在SQL语句中操作 server-id=102 以下执行SQL(使用从机的root账户执行): CHANGE MASTER TO master_host='127.0.0.1',//主机的ip地址 master_user='slave01',//主机的用户(就是刚刚在主机通过sql创建出来的账户) master_password='123456', master_port=3306, master_log_file='mysql3306-bin.000006',//File master_log_pos=1120;//Position #启动slave同步 START SLAVE; #查看同步状态 SHOW SLAVE STATUS;


更多精彩