多数据源问题很常见,例如读写分离数据库配置。
原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题。
研究成果如下:
1、首先配置多个datasource
- <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">
- <propertyname="driverClassName"value="net.sourceforge.jtds.jdbc.Driver">
- </property>
- <propertyname="url"value="jdbc:jtds:sqlserver://10.82.81.51:1433;databaseName=standards">
- </property>
- <propertyname="username"value="youguess"></property>
- <propertyname="password"value="youguess"></property>
- </bean>
- <beanid="dataSource2"class="org.apache.commons.dbcp.BasicDataSource">
- <propertyname="driverClassName"value="net.sourceforge.jtds.jdbc.Driver">
- </property>
- <propertyname="url"value="jdbc:jtds:sqlserver://10.82.81.52:1433;databaseName=standards">
- </property>
- <propertyname="username"value="youguess"></property>
- <propertyname="password"value="youguess"></property>
- </bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"> </property> <property name="url" value="jdbc:jtds:sqlserver://10.82.81.51:1433;databaseName=standards"> </property> <property name="username" value="youguess"></property> <property name="password" value="youguess"></property> </bean> <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"> </property> <property name="url" value="jdbc:jtds:sqlserver://10.82.81.52:1433;databaseName=standards"> </property> <property name="username" value="youguess"></property> <property name="password" value="youguess"></property> </bean>
2、写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法
- package com.standard.core.util;
- import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
- publicclass DynamicDataSource extends AbstractRoutingDataSource {
- @Override
- protected Object determineCurrentLookupKey() {
- return CustomerContextHolder.getCustomerType();
- }
- }
package com.standard.core.util; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return CustomerContextHolder.getCustomerType(); } }
3、利用ThreadLocal解决线程安全问题
- package com.standard.core.util;
- publicclass CustomerContextHolder {
- publicstaticfinal String DATA_SOURCE_A = "dataSource";
- publicstaticfinal String DATA_SOURCE_B = "dataSource2";
- privatestaticfinal ThreadLocal<String> contextHolder = new ThreadLocal<String>();
- publicstaticvoid setCustomerType(String customerType) {
- contextHolder.set(customerType);
- }
- publicstatic String getCustomerType() {
- return contextHolder.get();
- }
- publicstaticvoid clearCustomerType() {
- contextHolder.remove();
- }
- }
package com.standard.core.util; public class CustomerContextHolder { public static final String DATA_SOURCE_A = "dataSource"; public static final String DATA_SOURCE_B = "dataSource2"; private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } }
4、数据源配置
- <beanid="dynamicDataSource"class="com.standard.core.util.DynamicDataSource">
- <propertyname="targetDataSources">
- <mapkey-type="java.lang.String">
- <entryvalue-ref="dataSource"key="dataSource"></entry>
- <entryvalue-ref="dataSource2"key="dataSource2"></entry>
- </map>
- </property>
- <propertyname="defaultTargetDataSource"ref="dataSource">
- </property>
- </bean>
<bean id="dynamicDataSource" class="com.standard.core.util.DynamicDataSource" > <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="dataSource" key="dataSource"></entry> <entry value-ref="dataSource2" key="dataSource2"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSource" > </property> </bean>
5、在DAOImpl中切换数据源
- CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
搞定!
相关推荐
本篇文章主要介绍了详解利用Spring的AbstractRoutingDataSource解决多数据源的问题。具有一定的参考价值,有兴趣的可以了解一下。
本篇文章主要介绍了浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题,具有一定的参考价值,有需要的可以了解一下
主要介绍了使用Spring的AbstractRoutingDataSource实现多数据源切换示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
本篇文章主要介绍了详解Spring(AbstractRoutingDataSource)实现动态数据源切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。
Spring Boot整合Mybatis使用druid实现多数据源自动切换
使用注解配置实现Spring动态数据源切换,实现原理 1、自定义动态数据源类DynamicDataSource: 实现spring类AbstractRoutingDataSource的方法determineCurrentLookupKey 2、自定义Spring AOP类DataSourceAspect 3、...
基于Spring的 AbstractRoutingDataSource 进行简单的封装,方便进行数据源的切换,目前主要用于主从数据库的读写切换上。切换spring数据源的工具,使用aop注解方式进行快速切换,减少编码的入侵
`AbstractRoutingDataSource` 是 MyBatis-Plus 提供的一个数据源路由类。它可以基于某个条件来动态地切换数据源。当调用 `selectAnyDataSources()` 方法时,它会根据当前线程的上下文信息来返回一个数据源。如果没有...
MySQL Master Slave 集群构架和spring整合,里面实现的是动态切换数据源,大家都是知道,spring2之后添加AbstractRoutingDataSource这个东西,这个就可以实现切换数据源,实现思路是:先按照搭建MySQL的MasterSlave...
《在Sping Cloud(Spring Boot)中基于AbstractRoutingDataSource 实现多数据源动态切换》多数据源元数据存储表,在postgres数据库可直接运行,如果是别的数据库请自行修改sql语句
spring +springboot+mybatis+maven 读写分离,数据库采用mysql, 采用springboot 采用项目框架搭建,继承spring 中的AbstractRoutingDataSource,实现 determineCurrentLookupKey 进行数据源的动态切换,采用Spring ...
主从数据源切换(两个版本)一是利用Spring提供的AbstractRoutingDataSource,二是使用自定义数据源切换类 模块 actdemo ├── mybatisGenerator --mybatis生成程序 └── web --SpringBoot项目 集成activiti6.0.0...
基于Enable驱动的spring boot多数据源配置的实现,主要运用了spring的AbstractRoutingDataSource和aop
--利用AbstractRoutingDataSource实现动态数据源切换 --> 数据源 <!-- write --> <!-- read --> <!-- 从org.springframework.jdbc.datasource.lookup....
读写分离的实现依然是继承了spring提供的AbstractRoutingDataSource,支持数据库一主多从的架构开发者可以根据框架中提供的@Read,@Write注解 显示告诉框架应该选择主库还是从库,这2个注解可以放在类上,也可以放到...
Spring boot + Mybatis + alibaba druid通过继承AbstractRoutingDataSource的determineCurrentLookupKey来动态切换DataSource,主从切换,读写分离。 可以直接运行,完整工程代码 + SQL脚本。