项目中用到了动态数据源,所以在这里做下记录。
AbstractRoutingDataSource中route是路由的意思,单从名字,我们就可以看出这个类是做什么用的
动态数据源是指,同一个数据库访问接口,根据上下文不通,可以利用不同的数据源访问数据库。 项目中采用了spring jdbc来访问数据库,配置文件如下:
<!--sqlMapClient配置--> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="xxxxxx" /> </bean> <!--数据源配置--> <bean id="dataSource" class="继承类AbstractRoutingDataSource"> <property name="targetDataSources"> <!--配置多个数据源--> </property> </bean>
spring中提供了类AbstractRoutingDataSource来实现动态数据源,这个类实现了DataSource接口,getConnection()方法如下:
public Connection getConnection() throws SQLException { return determineTargetDataSource().getConnection(); } protected DataSource determineTargetDataSource() { Assert.notNull(this.resolvedDataSources, "DataSource router not initialized"); Object lookupKey = determineCurrentLookupKey(); DataSource dataSource = this.resolvedDataSources.get(lookupKey); if (dataSource == null && (this.lenientFallback || lookupKey == null)) { dataSource = this.resolvedDefaultDataSource; } if (dataSource == null) { throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]"); } return dataSource; }
在getConnection方法中又调用了方法determineTargetDataSource,在这个方法中,只是返回一个数据源对象,但是返回哪个数据源对象呢,玄机在Object lookupKey = resolveSpecifiedLookupKey(entry.getKey());
这行代码,我们可以在自己的实现类中去定制这个方法,根据自己的要求来确定具体返回哪一个数据源对象
每一次DAO接口调用,都会有一个线程上下文,我可以把需要使用哪一个数据源的信息放到线程变量中,然后再AbstractRoutingDataSource的实现类中,我可以像下面那样重写determineCurrentLookupKey方法
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); @Override protected Object determineCurrentLookupKey() { return contextHolder.get(); }
这样每个线程间相互隔离,也不会担心线程安全问题
相关推荐
springboot+mybatis+mysql+AbstractRoutingDataSource实现多数据源切换(一写多读数据源)项目中包含完整的demo案例配备文档说明,亲测可用;实现简单,代码思路清晰.
本篇文章主要介绍了详解Spring(AbstractRoutingDataSource)实现动态数据源切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
主要介绍了使用Spring的AbstractRoutingDataSource实现多数据源切换示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。
租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的租户来动态获取数据源 3.每个租户访问自己的数据源。项目...
在数据源切换的场景中,我们通常将数据源信息存储在 `ThreadLocal` 中,然后在数据访问层(如 DAO)中通过 `ThreadLocal` 来获取当前线程的数据源信息,从而动态地切换数据源。 `AbstractRoutingDataSource` 是 ...
使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...
Spring Boot整合Mybatis使用druid实现多数据源自动切换
MySQL Master Slave 集群构架和spring整合,里面实现的是动态切换数据源,大家都是知道,spring2之后添加AbstractRoutingDataSource这个东西,这个就可以实现切换数据源,实现思路是:先按照搭建MySQL的MasterSlave...
《在Sping Cloud(Spring Boot)中基于AbstractRoutingDataSource 实现多数据源动态切换》多数据源元数据存储表,在postgres数据库可直接运行,如果是别的数据库请自行修改sql语句
(1)、AbstractRoutingDataSource注册多数据源,AOP实现读写分离、读写源自动切换 (2)、一主多从,多个从库的负载均衡策略可以自定义。(双主多从、故障转移因mysql环境为一主一从,所以代码未实现,不难实现,...
spring +springboot+mybatis+maven 读写分离,数据库采用mysql, 采用springboot 采用项目框架搭建,继承spring 中的AbstractRoutingDataSource,实现 determineCurrentLookupKey 进行数据源的动态切换,采用Spring ...
基于@Enable驱动的spring boot多数据源配置,主要运用了spring的AbstractRoutingDataSource和aop来实现
使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。 如果采用了mybatis, 可以将读写分离放在ORM层,比如mybatis可以通过mybatis plugin拦截sql语句,所有的insert/update/delete都访问master库,...
这是一个轻量级分库分表框架&读写分离框架,无需搭建中间层代理服务,开发者只需要引入本框架的jar包,并进行相应的配置即可实现分库...开发者只需要根据自身的数据源信息组装好此数据源,在此框架中定义了一个DataSo
master-slave环境:mysql、mybatis、springboot 、tkmapper1、通过MultiDataSourceConfig 创建多数据源指定@Primary初始数据库,以防报错2、通过RoutingDataSource 实现数据库路由实现AbstractRoutingDataSource接口...
--利用AbstractRoutingDataSource实现动态数据源切换 --> 数据源 <!-- write --> <!-- read --> <!-- 从org.springframework.jdbc.datasource.lookup....