一主多从

实际项目中
一般都是采用一主多从的架构
修改数据源,动态切换数据源

DynamicDataSource

定义动态数据源

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;import javax.sql.DataSource;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.util.ReflectionUtils;/*** 定义动态数据源,实现通过集成Spring提供的AbstractRoutingDataSource,只需要实现determineCurrentLookupKey方法即可* * 由于DynamicDataSource是单例的,线程不安全的,所以采用ThreadLocal保证线程安全,由DynamicDataSourceHolder完成。**/
public class DynamicDataSource extends AbstractRoutingDataSource {private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDataSource.class);private Integer slaveCount;// 轮询计数,初始为-1,AtomicInteger是线程安全的private AtomicInteger counter = new AtomicInteger(-1);// 记录读库的keyprivate List<Object> slaveDataSources = new ArrayList<Object>(0);@Overrideprotected Object determineCurrentLookupKey() {// 使用DynamicDataSourceHolder保证线程安全,并且得到当前线程中的数据源keyif (DynamicDataSourceHolder.isMaster()) {Object key = DynamicDataSourceHolder.getDataSourceKey(); if (LOGGER.isDebugEnabled()) {LOGGER.debug("当前DataSource的key为: " + key);}return key;}Object key = getSlaveKey();if (LOGGER.isDebugEnabled()) {LOGGER.debug("当前DataSource的key为: " + key);}return key;}@SuppressWarnings("unchecked")@Overridepublic void afterPropertiesSet() {super.afterPropertiesSet();// 由于父类的resolvedDataSources属性是私有的子类获取不到,需要使用反射获取Field field = ReflectionUtils.findField(AbstractRoutingDataSource.class, "resolvedDataSources");field.setAccessible(true); // 设置可访问try {Map<Object, DataSource> resolvedDataSources = (Map<Object, DataSource>) field.get(this);// 读库的数据量等于数据源总数减去写库的数量this.slaveCount = resolvedDataSources.size() - 1;for (Map.Entry<Object, DataSource> entry : resolvedDataSources.entrySet()) {if (DynamicDataSourceHolder.MASTER.equals(entry.getKey())) {continue;}slaveDataSources.add(entry.getKey());}} catch (Exception e) {LOGGER.error("afterPropertiesSet error! ", e);}}/*** 轮询算法实现* * @return*/public Object getSlaveKey() {// 得到的下标为:0、1、2、3……Integer index = counter.incrementAndGet() % slaveCount;if (counter.get() > 9999) { // 以免超出Integer范围counter.set(-1); // 还原}return slaveDataSources.get(index);}
}

MySQL读写分离一主多从实现相关推荐

  1. 基于mycat的mysql_基于Mycat中间件的MySQL读写分离

    基于Mycat中间件的MySQL读写分离 简述 mycat是国内开源的数据库中间件,可以实现mysql读写分离和主备热切换,容灾,数据分片等功能. 详情:http://www.mycat.io/ 架构 ...

  2. mysql读写分离 存储过程_MySQL读写分离 · wang-y/Technical-Information Wiki · GitHub

    MySQL读写分离 1.主(master)从(slave)服务器上安装mysql; 2.配置步骤 主服务器master 配置: mysql 配置文件添加:(windows: my.ini;linux: ...

  3. mysql主主备份_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离

    一.MySQL主从备份 为保证数据库的安全和效率,可以使用主从备份,当有写的操作可以在主服务器上操作,操作完之后备份到从服务器上,当有读操作时可以访问从服务器,这样在一定程度上保证了数据库的安全,当主 ...

  4. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...

    [Mysql主从复制] 解决的问题 数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了. 负载均 ...

  5. Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从

    Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从 参考文章: (1)Mycat分布式数据库架构解决方案--搭建MySQL读写分离环境--一主多从 (2)https://ww ...

  6. mysql备份-a是什么_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离

    一.MYSQL主从备份 为保证数据库的安全和效率,可以使用主从备份,当有写的操作可以在主服务器上操作,操作完之后备份到从服务器上,当有读操作时可以访问从服务器,这样在一定程度上保证了数据库的安全,当主 ...

  7. MyCat实现MySQL读写分离(双主双从多库)

    在数据库集群架构中,主数据库负责处理事务性查询(写入操作),而从数据库只负责处理select查询(读操作),这样可以提高数据库整体读写性能.主数据库另外一个功能就是负责将数据变更同步到从数据库中. 读 ...

  8. MyCat实现MySQL读写分离(单主单从多库)

    在数据库集群架构中,主数据库负责处理事务性查询(写入操作),而从数据库只负责处理select查询(读操作),这样可以提高数据库整体读写性能.主数据库另外一个功能就是负责将数据变更同步到从数据库中. 读 ...

  9. proxy实现 mysql 读写分离

    实现 mysql 读写分离 图解: 环境: iptables 和 selinux 关闭 proxy:test2 172.25.1.2 Master: test3 172.25.1.3 Slave:te ...

最新文章

  1. “一切都是消息”--iMSF(即时消息服务框架)入门简介
  2. 大数据2 Hadoop伪分布模式配置部署
  3. hbase hmaster一会就没了_浅析HBase
  4. java方法区对象类型_浅谈Java内存区域与对象创建过程
  5. abap常用系统变量
  6. ubuntu 查找qt是否安装_Ubuntu Qt 安装教程--快速下载连接(网盘)
  7. vue中v-show指令的使用之Vue知识点归纳(五)
  8. 安卓应用安全指南 4.5.1 使用 SQLite 示例代码
  9. win10电脑一开机提示拒绝访问怎么办
  10. Flutter之路由系列之Route
  11. 金蝶K3 SQL报表系列-BOM成本明细表
  12. ipad上的电子阅读器们
  13. Duilib控件拖动改变大小
  14. Vscode tab键使用
  15. PacketTracer简单使用】
  16. [译]使用MVI打造响应式APP(三):状态折叠器
  17. 沐风:如何创造更多的睡后收入?
  18. [4G5G专题-97]:MAC层- 调度 - 上行调度的原理、过程与算法
  19. 关于数据治理的读书笔记 - 什么是数据治理?
  20. 温度测量基于c语言,基于PN结的温度测量系统设计论文(C语言)--189876772.doc

热门文章

  1. 搜狗浏览器挡住了任务栏,上下显示不全
  2. springmvc学习笔记(10)-springmvc注解开发之商品改动功能
  3. CentOS7安装xfce桌面环境
  4. HDU2102 A计划
  5. 关于java的JIT知识
  6. android 关于多任务下载问题
  7. vlc windows 编译文档
  8. 关于Exception类
  9. IAR 使用小技巧--持续更新
  10. LevelDB (1)概述