当前位置: 首页 > news >正文

spring兼容mysql_使用Spring+MySql实现读写分离(二)spring整合多数据库

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

1. 背景

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

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

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

那么,对我们的要求是:

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

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

3、 读数据必须到读库;

2. 方案

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

2.1. 应用层解决:

9f9feffce6070d510a27afd69bf11410.png

优点:

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

2、 不需要引入中间件;

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

缺点:

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

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

2.2. 中间件解决

cbd63ad91468630529efd1f3a673215c.png

优点:

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

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

缺点:

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

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

相关中间件产品使用:

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

3.1. 原理

8822611d6d0a3e0bcff4187a40dfabe1.png

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

3.2. DynamicDataSource

4887bdb970a5862f301f911c6d2fcdd9.png

3.3. DynamicDataSourceHolder

c75c198a257ef4f27bb912e15d06e207.png

3.4. DataSourceAspect

565430e47eb42abb07a03e9e5af3142c.png

3.5. 配置2个数据源

bd3706190401ea70a3657a503efda643.png

3.5.2. 定义连接池

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

6b194d74dcea74d23cde3026bd9bf501.png

3.5.3. 定义DataSource

85b7d7f7b3ce1353dd64d03fcb46f9f4.png

xml中:

15d4dcef8297a04b9a4cfa81765293f5.png

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

94d2e1ad5f02838e8d4c7d0d9a1827dc.png

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

相关文章:

  • 修改mysql+表格内容_java修改MySQL表中的数据问题:如代码
  • jdba怎么连接mysql_JDBA——java连接oracle问题
  • php简单图书管理系统源代码_【程序源代码】简单通用的后台管理系统
  • linux shell命令sed 向末尾插入一行_谈一谈Linux三剑客sed命令,基本概念及简单案例...
  • mysql flink 实时_Flink1.8实时数仓项目实战
  • 创建excel服务失败_什么是数据驱动测试?学习创建框架
  • mysql cbo优化器_Oracle约束Constraint对于CBO优化器的作用
  • php结合MySQL的柱状图_jpgraph+php+mysql生成柱状图(含代码)
  • 查看有哪些namespace_Linux操作系统中的namespace是个什么鬼
  • zabbix php mysql_Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署
  • 判别式模型python_判别式模型与生成式模型
  • 双鉴探测器是哪两种探测方式结合_报警的基本知识
  • 虚拟机annaconda连接mysql_Python3.5(ANCONDA3)连接MYSQL数据库
  • mysql 存储过程enum 变量初始化_mysql存储过程变量使用-bug记要
  • mysql获取option的value_js:如何获取select选中的值
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 0基础学习移动端适配
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • css属性的继承、初识值、计算值、当前值、应用值
  • express + mock 让前后台并行开发
  • express.js的介绍及使用
  • iOS编译提示和导航提示
  • js数组之filter
  • Map集合、散列表、红黑树介绍
  • orm2 中文文档 3.1 模型属性
  • Phpstorm怎样批量删除空行?
  • php中curl和soap方式请求服务超时问题
  • React系列之 Redux 架构模式
  • scala基础语法(二)
  • Vue2.0 实现互斥
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 聊聊redis的数据结构的应用
  • 前端面试之闭包
  • 实现简单的正则表达式引擎
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信开源mars源码分析1—上层samples分析
  •  一套莫尔斯电报听写、翻译系统
  • C# - 为值类型重定义相等性
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • (11)MATLAB PCA+SVM 人脸识别
  • (70min)字节暑假实习二面(已挂)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (待修改)PyG安装步骤
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (三)docker:Dockerfile构建容器运行jar包
  • (新)网络工程师考点串讲与真题详解
  • (转)LINQ之路
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET 常见的偏门问题
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET多线程执行函数
  • .net连接MySQL的方法