首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于AbstractRoutingDataSource实现读写分离

二、AbstractRoutingDataSource源码分析 ?...AbstractRoutingDataSource继承了AbstractDataSource并且实现了InitializingBean接口,我们看一下属性声明和几个核心的方法实现。...四、基于AbstractRoutingDataSource实现读写分离 了解了动态数据源AbstractRoutingDataSource的源码和原理,我们大致知道了具体如何使用,只需要在子类中实现自定义...; DataSourceHolder.clearDataSource(); } } AOP拦截Dao层的所有public方法,在方法执行之前判断如果是读操作且没有开启事务...总结 本篇文章我们介绍了读写分离的基本概念和应用场景,也详细的分析了动态数据源AbstractRoutingDataSource的源码和工作原理,通过实例代码测试验证了基于动态数据源实现读写分离

1.5K61
您找到你想要的搜索结果了吗?
是的
没有找到

一文弄懂spring官方多数据源

路由键#determineCurrentLookupKey先看一下AbstractRoutingDataSource的类图我们可以看到,它间接实现了DataSource。...是个抽象类,只有一个抽象方法#determineCurrentLookupKey()java复制代码public abstract class AbstractRoutingDataSource extends...其自身就是一个DataSource,获取jdbc连接时会通过该方法获取数据源java复制代码public abstract class AbstractRoutingDataSource extends...新建实现类java复制代码public class RoutingDataSource extends AbstractRoutingDataSource { /** * 获取路由key,...还好我已经替你们实现啦Scindapsus-DS,而且还通过本地事务解决了AOP与Spring声明式事务冲突只能单数据源事务的问题,感兴趣的小伙伴们可以自行查看源码

23410

MySQL读写分离的三种实现方案

MySQL读写分离的三种实现方案 文章目录 MySQL读写分离的三种实现方案 一、搭建一个“一主两从”的MySQL集群 二、读写分离实现:方案一 2.1 配置多个数据源 2.2 使用AbstractRoutingDataSource...2.2 使用AbstractRoutingDataSource (3)、改进一下1.1:基于操作 AbstractRoutingDataSource 和自定义注解 readOnly 之 类的,简化自动切换数据源...(4)、改进二下1.2:支持配置多个从库; 使用AbstractRoutingDataSource和自定义注解。...三、读写分离实现:方案二 3.1 通过ShardingSphere-jdbc 实现读写分离 改进v1.0,ShardingSphere-jdbc 的 Master-Slave 功能 1)SQL 解析和事务管理...,自动实现读写分离 第一,将事务都管理起来; 第二,做SQL解析,自动实现读写分离; 2)解决”写完读”不一致的问题 如果在一个事务中,先写后读,该框架有个优化;在一个事务里,前几个都是毒,正常读就行,

4.4K10

基于Spring的数据库读写分离

数据库读写分离 MySQL主从数据库搭建 基于AbstractRoutingDataSource实现多数据源切换 @Transactional 测试 1.数据库读写分离 数据库读写分离的实现主要有两种方式...本文的实现我们基于Spring的AbstractRoutingDataSource来实现。 2....基于AbstractRoutingDataSource实现多数据源切换 整个实现大约有以下核心类: DataSourceName:定义数据源的名称 TargetDataSource注解:程序在运行时需要选择的数据源...@Transactional 通过@Transactional开启事务以后,在获取到数据源建立连接后,后面不会再对数据源进行切完,直至整个事务完成。...一般我们在开启事务的时候往往是因为业务逻辑中包含多个写操作,需要一起失败或者一起成功,既然需要写操作,我们必须保证我们建立的数据库连接 是与Master库建立。

50550

SpringBoot 多数据源及事务解决方案

数据源切换原理 通过扩展Spring提供的抽象类AbstractRoutingDataSource,可以实现切换数据源。...resolvedDataSources&resolvedDefaultDataSource 当Spring容器创建AbstractRoutingDataSource对象时,通过调用afterPropertiesSet...3.3 方案不足 基于AbstractRoutingDataSource的多数据源动态切换,有个明显的缺点,无法动态添加和删除数据源。在我们的产品中,不能把应用数据源写死在配置文件。...参考AbstractRoutingDataSource的设计思路,实现自定义数据源管理。 4.1 设计数据源表 主库的数据源信息仍然配置在项目配置文件中,应用库数据源配置参数,则设计对应的数据表。...AbstractRoutingDataSource 只支持单库事务,切换数据源是在开启事务之前执行。Spring使用 DataSourceTransactionManager进行事务管理。

38300

SpringBoot 多数据源及事务解决方案

数据源切换原理 通过扩展Spring提供的抽象类AbstractRoutingDataSource,可以实现切换数据源。...resolvedDataSources&resolvedDefaultDataSource 当Spring容器创建AbstractRoutingDataSource对象时,通过调用afterPropertiesSet...3.3 方案不足 基于AbstractRoutingDataSource的多数据源动态切换,有个明显的缺点,无法动态添加和删除数据源。在我们的产品中,不能把应用数据源写死在配置文件。...参考AbstractRoutingDataSource的设计思路,实现自定义数据源管理。 4.1 设计数据源表 主库的数据源信息仍然配置在项目配置文件中,应用库数据源配置参数,则设计对应的数据表。...AbstractRoutingDataSource 只支持单库事务,切换数据源是在开启事务之前执行。Spring使用 DataSourceTransactionManager进行事务管理。

86331

谈谈Spring Boot 数据源加载及其多数据源简单实现

本文提供方法仅供类似简单业务场景,在生产环境和复杂的业务场景 请使用分库分表的中间件(例如mycat)或者框架 sharding-sphere (一直在用)等 先来看Spring 默认的数据源注入策略,如下代码默认的事务管理器在初始化时回去加载数据源实现...这里就是我们动态数据源的入口 // 默认的事务管理器 ppublic class DataSourceTransactionManager extends AbstractPlatformTransactionManager...看下Spring 默认提供的路由数据源字段 public abstract class AbstractRoutingDataSource extends AbstractDataSource implements...determineCurrentLookupKey() { return DynamicDataSourceContextHolder.getDataSourceType(); } } 把我们动态数据源实现注入到Spring 的事务管理器...我们在数据源管理面维护了数据源,动态去修改这个 dataSourceMap 其实是无效的,不能做到实时刷新 我们来看下 AbstractRoutingDataSource 的加载map 数据源的源码,只有在初始化的时候调用

99630

springboot基于mybaits实现mysql读写分离

,可能会遇到事务中同时用到读库和写库,可能会有延时造成脏读,所以增加了线程变量设置,来保证一个事务内读写都是同一个库 新增文件 package com.zyd.blog.framework.holder...void clearDbType() { contextHolder.remove(); } } 配置数据源路由类 新增文件:DataSourceRouter.java,继承AbstractRoutingDataSource...; import java.util.Random; public class DataSourceRouter extends AbstractRoutingDataSource { @Value.../** * 设置事务事务需要知道当前使用的是哪个数据源才能进行事务处理 */ @Bean public DataSourceTransactionManager...,事务需要知道当前使用的是哪个数据源才能进行事务处理 */ @Bean public DataSourceTransactionManager dataSourceTransactionManager

63430

Spring主从数据库的配置和动态数据源切换原理

Spring内置了一个AbstractRoutingDataSource,它可以把多个数据源配置成一个Map,然后,根据不同的key返回不同的数据源。...因为AbstractRoutingDataSource也是一个DataSource接口,因此,应用程序可以先设置好key, 访问数据库的代码就可以从AbstractRoutingDataSource拿到对应的一个真实的数据源...RoutingDataSource 然后,我们用Spring内置的RoutingDataSource,把两个真实的数据源代理为一个动态数据源: public class RoutingDataSource extends AbstractRoutingDataSource...我们仔细想想,Spring提供的声明式事务管理,就只需要一个@Transactional()注解,放在某个Java方法上,这个方法就自动具有了事务。...想要在应用程序中少写代码,我们就得多做一点底层工作:必须使用类似Spring实现声明式事务的机制,即用AOP实现动态数据源切换。

2.6K20

如何写一个读写分离中间件

网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件...从而保证整个方法的事务属性。 解决思路 我们将获取真实数据库(主库还是哪个从库)放到需要建立连接时的地方,为此我们创建了 BackendConnection(传统是先连接数据库,然后再创建连接)。...如果要支持方法级别的事务(也就是整个方法的 SQL 请求都发送到主库),需要借助拦截器,我们采用的是 AspectJ 方式的拦截器。... abstractRoutingDataSource;   //用于缓存一条sql(可能对应多个statement)或者一次事务中的连接   private final Map<String, Connection... abstractRoutingDataSource) {     this.abstractRoutingDataSource = abstractRoutingDataSource;   }

45631

3种方式实现多数据源控制切换、实现读写分离;演示借助AbstractRoutingDataSource实现多数据源的动态切换代码【享学Spring】

DataSourceTransactionManager(masterDataSource()); dataSourceTransactionManager.setEnforceReadOnly(true); // 让事务管理器进行只读事务层面上的优化...Spring 2.0.1引入了一个AbstractRoutingDataSource ,我相信这值得关注。...能有在运行时, 根据某种key值来动态切换到真正的DataSource上, 同时对于不支持事务隔离级别的JTA事务来说, Spring还提供了另外一个类IsolationLevelDataSourceRouter...(具体在JTA事务里再会详解) 另外,上面讲述的这些API都在spring-jdbc.jar里。 最后也留一个小悬念:多数据源切换是成功了,但牵涉到事务呢?...单数据源事务是ok的,但如果多数据源需要同时使用一个事务呢?

8.2K51
领券