tenantDataSources = new ConcurrentHashMap(); private final DataSourceProperties properties; private AbstractRoutingDataSource...properties; } @Bean public DataSource dataSource() { multiTenantDataSource = new AbstractRoutingDataSource...} https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html
本文将详细介绍 AbstractRoutingDataSource 的作用、使用场景及其实现方法。 1....什么是 AbstractRoutingDataSource 位置:org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource...AbstractRoutingDataSource 的作用 在实际应用中,AbstractRoutingDataSource 主要用于以下几个方面: 根据上下文动态选择数据源:例如,在多租户系统中,可以根据当前租户的...如何使用 AbstractRoutingDataSource 实现 AbstractRoutingDataSource 的步骤相对简单,关键在于实现其 determineCurrentLookupKey...AbstractRoutingDataSource 的优势 AbstractRoutingDataSource 通过动态数据源切换,提供了极大的灵活性。
二、AbstractRoutingDataSource源码分析 ?...AbstractRoutingDataSource继承了AbstractDataSource并且实现了InitializingBean接口,我们看一下属性声明和几个核心的方法实现。...四、基于AbstractRoutingDataSource实现读写分离 了解了动态数据源AbstractRoutingDataSource的源码和原理,我们大致知道了具体如何使用,只需要在子类中实现自定义...; DataSourceHolder.clearDataSource(); } } AOP拦截Dao层的所有public方法,在方法执行之前判断如果是读操作且没有开启事务...总结 本篇文章我们介绍了读写分离的基本概念和应用场景,也详细的分析了动态数据源AbstractRoutingDataSource的源码和工作原理,通过实例代码测试验证了基于动态数据源实现读写分离
二、实现原理 1、扩展Spring的AbstractRoutingDataSource抽象类(该类充当了DataSource的路由中介, 能有在运行时, 根据某种key值来动态切换到真正的DataSource...从AbstractRoutingDataSource的源码中: public abstract class AbstractRoutingDataSource extends AbstractDataSource..."); } return dataSource; } 上面这段源码的重点在于determineCurrentLookupKey()方法,这是AbstractRoutingDataSource
除了引入一些分库分表组件,Spring自身提供了AbstractRoutingDataSource的方式,让多数数据源的管理成为可能。...1.基本原理 多数据源能进行动态切换的核心就是spring底层提供了AbstractRoutingDataSource类进行数据源路由。...AbstractRoutingDataSource实现了DataSource接口,所以我们可以将其直接注入到DataSource的属性上。...像Spring的嵌套事务等实现的原理,也是基于ThreadLocal去运行的。所以,DataSourceContextHolder.本质上是一个操作ThreadLocal的类。...public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object
本文链接:https://blog.csdn.net/luo4105/article/details/77743161 我们来查看AbstractRoutingDataSource源码,来更好的理解多数据源配置
我最初的想法是: 读方法走读库,写方法走写库(一般是主库),保证在Spring提交事务之前确定数据源. ?...保证在Spring提交事务之前确定数据源,这个简单,利用AOP写个切换数据源的切面,让他的优先级高于Spring事务切面的优先级。至于读,写方法的区分可以用2个注解。 但是如何切换数据库呢?...--温安适 20180309 我搜索了一些网文,发现都提到了一个AbstractRoutingDataSource类。...AbstractRoutingDataSource简单总结: AbstractRoutingDataSource,内部有一个Map的域resolvedDataSources...AbstractRoutingDataSource重点回顾: AbstractRoutingDataSource,内部有一个Map的域resolvedDataSources
路由键#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声明式事务冲突只能单数据源事务的问题,感兴趣的小伙伴们可以自行查看源码
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)解决”写完读”不一致的问题 如果在一个事务中,先写后读,该框架有个优化;在一个事务里,前几个都是毒,正常读就行,
数据库读写分离 MySQL主从数据库搭建 基于AbstractRoutingDataSource实现多数据源切换 @Transactional 测试 1.数据库读写分离 数据库读写分离的实现主要有两种方式...本文的实现我们基于Spring的AbstractRoutingDataSource来实现。 2....基于AbstractRoutingDataSource实现多数据源切换 整个实现大约有以下核心类: DataSourceName:定义数据源的名称 TargetDataSource注解:程序在运行时需要选择的数据源...@Transactional 通过@Transactional开启事务以后,在获取到数据源建立连接后,后面不会再对数据源进行切完,直至整个事务完成。...一般我们在开启事务的时候往往是因为业务逻辑中包含多个写操作,需要一起失败或者一起成功,既然需要写操作,我们必须保证我们建立的数据库连接 是与Master库建立。
SSH框架(二) 利用AbstractRoutingDataSource实现动态数据源切换...强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码 在Spring 2.0.1中引入了AbstractRoutingDataSource, 该类充当了...具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。...一、原理 首先看下AbstractRoutingDataSource类结构,继承了AbstractDataSource ?... public class DynamicDataSource extends AbstractRoutingDataSource { ?
数据源切换原理 通过扩展Spring提供的抽象类AbstractRoutingDataSource,可以实现切换数据源。...resolvedDataSources&resolvedDefaultDataSource 当Spring容器创建AbstractRoutingDataSource对象时,通过调用afterPropertiesSet...3.3 方案不足 基于AbstractRoutingDataSource的多数据源动态切换,有个明显的缺点,无法动态添加和删除数据源。在我们的产品中,不能把应用数据源写死在配置文件。...参考AbstractRoutingDataSource的设计思路,实现自定义数据源管理。 4.1 设计数据源表 主库的数据源信息仍然配置在项目配置文件中,应用库数据源配置参数,则设计对应的数据表。...AbstractRoutingDataSource 只支持单库事务,切换数据源是在开启事务之前执行。Spring使用 DataSourceTransactionManager进行事务管理。
* 设置数据源路由,通过该类中的determineCurrentLookupKey决定使用哪个数据源 */ @Bean("routingDataSource") public AbstractRoutingDataSource...resolver.getResources("classpath*:mapper/*Mapper.xml")); return bean.getObject(); } /** * 设置事务...,事务需要知道当前使用的是哪个数据源才能进行事务处理 */ @Bean public DataSourceTransactionManager dataSourceTransactionManager...(@Qualifier("routingDataSource") AbstractRoutingDataSource routingDataSource) { return new DataSourceTransactionManager...;@Slf4jpublic class MyAbstractRoutingDataSource extends AbstractRoutingDataSource { @Override protected
2 如何实现多数据源 对于大多数的java应用,都使用了spring框架,spring-jdbc模块提供了 AbstractRoutingDataSource,其内部可以包含了多个DataSource...应用直接操作的是AbstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource...关于如何利用AbstractRoutingDataSource实现多数据源访问,各种博客已经很多,基本功能都能实现,但是易用性不够好,要修改大量代码,业务侵入性太强。...version>1.0.0 routing-datasource中,最重要的就是以下两个组件:RoutingDataSource类:其实现了类似于spring的AbstractRoutingDataSource...(见事务整合分析)。
,可能会遇到事务中同时用到读库和写库,可能会有延时造成脏读,所以增加了线程变量设置,来保证一个事务内读写都是同一个库 新增文件 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
本文提供方法仅供类似简单业务场景,在生产环境和复杂的业务场景 请使用分库分表的中间件(例如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 数据源的源码,只有在初始化的时候调用
DynamicDataSource import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /**...* @author binghe */ public class DynamicDataSource extends AbstractRoutingDataSource{ @Override...定义事务管理器 <!...,我们使用事务管理策略中的规则匹配。...* 如果事务管理中配置了事务策略,则采用配置的事务策略中的标记了ReadOnly的方法是用Slave,其它使用Master。
Spring内置了一个AbstractRoutingDataSource,它可以把多个数据源配置成一个Map,然后,根据不同的key返回不同的数据源。...因为AbstractRoutingDataSource也是一个DataSource接口,因此,应用程序可以先设置好key, 访问数据库的代码就可以从AbstractRoutingDataSource拿到对应的一个真实的数据源...RoutingDataSource 然后,我们用Spring内置的RoutingDataSource,把两个真实的数据源代理为一个动态数据源: public class RoutingDataSource extends AbstractRoutingDataSource...我们仔细想想,Spring提供的声明式事务管理,就只需要一个@Transactional()注解,放在某个Java方法上,这个方法就自动具有了事务。...想要在应用程序中少写代码,我们就得多做一点底层工作:必须使用类似Spring实现声明式事务的机制,即用AOP实现动态数据源切换。
网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件...从而保证整个方法的事务属性。 解决思路 我们将获取真实数据库(主库还是哪个从库)放到需要建立连接时的地方,为此我们创建了 BackendConnection(传统是先连接数据库,然后再创建连接)。...如果要支持方法级别的事务(也就是整个方法的 SQL 请求都发送到主库),需要借助拦截器,我们采用的是 AspectJ 方式的拦截器。... abstractRoutingDataSource; //用于缓存一条sql(可能对应多个statement)或者一次事务中的连接 private final Map<String, Connection... abstractRoutingDataSource) { this.abstractRoutingDataSource = abstractRoutingDataSource; }
领取专属 10元无门槛券
手把手带您无忧上云