项目中用到了动态数据源,所以在这里做下记录。
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`,我们可以实现数据源的动态选择。这个抽象类会根据当前的业务上下文(例如,通过`ThreadLocal`变量)决定使用哪个数据源。这样,我们可以在运行时根据业务需求灵活地切换...
【Spring 动态数据源切换】使用 `AbstractRoutingDataSource` 的详细实现在处理多数据库环境时,Spring 提供了一个强大的工具 `AbstractRoutingDataSource`,它允许我们根据特定条件动态地切换数据源。本文将深入...
Spring框架的多数据源支持非常完善,可以通过AbstractRoutingDataSource实现动态数据源切换,或者使用Spring Boot的MultiDataSource配置,根据业务需求灵活选择数据源。 再来看“线程池多线程访问”。线程池是Java...
DynamicDataSource是继承自AbstractRoutingDataSource抽象类的动态数据源实现类,该类的作用是根据配置参数创建数据源。DynamicDataSource类中定义了一个etermineCurrentLookupKey方法,该方法用于确定当前的数据源...
以下是如何使用`AbstractRoutingDataSource` 来实现数据源切换的步骤: 1. **创建自定义数据源路由类**: 首先,你需要创建一个类继承自`AbstractRoutingDataSource`,并覆盖`determineCurrentLookupKey()` 方法。...
SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。
- 在业务代码中,可以通过设置ThreadLocal变量来保存当前数据源的标识,然后在`AbstractRoutingDataSource`的实现中读取这个标识来决定使用哪个数据源。 - 另一种方式是在Service层或DAO层的接口上添加自定义注解...
本文将深入探讨如何在Spring Boot 1.5.9版本中结合MyBatis实现动态指定数据源,并通过自定义注解来实现这一功能。 首先,我们需要理解动态数据源的概念。动态数据源是指在运行时可以动态切换或选择的数据源,这在多...
Spring框架通过其强大的IoC(Inversion of Control)容器和AOP(Aspect-Oriented Programming)支持,提供了多种实现动态数据源的方法。其中最常用的一种是使用`AbstractRoutingDataSource`类。这个类是一个抽象的、...
租户通过域名访问接口,用filter获取租户独立标识,比如 zhangsan.localhost.com 、lisi.localhost.com 2.实现AbstractRoutingDataSource类来跟进当前访问的租户来动态获取数据源 3.每个租户访问自己的数据源。项目...
我们需要创建一个自定义的DataSource,继承自`AbstractRoutingDataSource`,并在`determineCurrentLookupKey`方法中实现数据源的选择逻辑。 ```java public class DynamicDataSource extends ...
总结起来,使用`ThreadLocal`和`AbstractRoutingDataSource`实现动态数据源切换的关键步骤包括: 1. 创建`ThreadLocal`实例来保存线程的数据源信息。 2. 实现`AbstractRoutingDataSource`,并重写`...
在现代企业级应用开发...总的来说,Spring Boot结合JPA或MyBatis实现多数据源动态切换,不仅提高了系统的灵活性,还便于进行数据库扩展和管理。理解和掌握这一技术,对于提升系统设计能力和解决复杂问题具有重要意义。
在这个项目中,我们利用自定义的Aop注解来实现数据源的动态切换。自定义注解可以附加在方法上,当该方法被调用时,AOP会捕获这个调用并执行相应的逻辑,即切换到指定的数据源。 具体实现步骤如下: 1. 定义数据源...
7. **实现方式**:在Spring中,可以通过`AbstractRoutingDataSource`实现动态数据源。该类可以根据当前上下文中的键(例如,一个线程绑定的变量)来决定使用哪个实际的数据源。你需要定义一个数据源路由规则,并实现...
在Spring Boot中,AOP(面向切面编程)和多数据源的整合是常见的应用场景,尤其是在大型企业级项目中,为了实现数据的隔离或者优化数据库访问,常常需要配置多个数据源。本文将深入探讨如何使用Spring Boot的AOP注解...
总结来说,动态数据源在SpringBoot中的实现主要是通过配置多个数据源、创建自定义的RoutingDataSource以及在业务代码中灵活选择数据源来完成的。这使得系统能够根据用户身份或其他条件灵活地切换到对应的数据源,...
Spring Boot通过DataSourceProperties和AbstractRoutingDataSource等组件,可以实现动态数据源的配置。通过编程或配置文件的方式,我们可以设置数据源的优先级、权重以及自动切换规则。 接下来,我们关注如何在...
本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...