spring在管理数据源的时候是直接使用DataSourceTransactionManager,并将datasource放入进去,所以在多数据源的时候,只要在这个时间节点前,改变DataSource就行了。
spring的多数据源支持类是一个叫AbstractRoutingDataSource的抽象类
捡几个重要属性和方法说一下
targetDataSources目前数据源是一个map集合
defaultTargetDataSource默认数据源
lenientFallback当目标数据源未找到时,是否使用默认数据源,默认为true
resolvedDataSources和resolvedDefaultDataSource这两个属性是将目标数据源通过afterPropertiesSet方法进行重新赋值
主要的方式是determineTargetDataSource
这个方法是在目标查询是确定该数据源是使用哪个数据源
determineCurrentLookupKey获取目标数据源,是一个抽象方法,如果我们动态该变数据源的时候,就需要重写这个方法
所以在这种情况下,我们需要写一个动态获取数据源的类DynamicDataSource
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDb();
}
@Override
protected DataSource determineTargetDataSource() {
DataSource dataSource = super.determineTargetDataSource();
return dataSource;
}
}
这个类继承AbstractRoutingDataSource,并重写其中的determineCurrentLookupKey方法,因为这个方法要获取数据源的名称,那么再定义个数据源获取类DbContextHolder
public class DbContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setDb(String db) {
contextHolder.set(db);
}
public static String getDb() {
return contextHolder.get();
}
public static void cleanDb() {
contextHolder.remove();
}
}
这样既可
然后在配置文件里面新增多数据源配置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${master.driverClassName}" />
<property name="url" value="${master.url}" />
<property name="username" value="${master.username}" />
<property name="password" value="${master.password}" />
<property name="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="40" />
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="40" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000" />
</bean>
<bean id="dataSourceAssist1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${assist.driverClassName}" />
<property name="url" value="${assist.url}" />
<property name="username" value="${assist.username}" />
<property name="password" value="${assist.password}" />
<property name="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="40" />
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="40" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000" />
</bean>
<bean id="dataSourceNew2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${new.driverClassName}" />
<property name="url" value="${new.url}" />
<property name="username" value="${new.username}" />
<property name="password" value="${new.password}" />
<property name="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="40" />
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="40" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000" />
</bean>
多数据源配置完毕后,配置动态获取数据源的bean
<bean id="dynamicDataSource" class="com.fyz.boss.common.datasouces.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="dataSource" value-ref="dataSource" />
<entry key="dataSourceAssist1" value-ref="dataSourceAssist1" />
<entry key="dataSourceNew2" value-ref="dataSourceNew2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource" />
</bean>
这个时候,将SqlSessionFactoryBean和DataSourceTransactionManager的DataSource属性引用为动态数据源的bean
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource" />
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<property name="mapperLocations">
<list>
<value>classpath:com/fyz/boss/**/*.xml</value>
</list>
</property>
</bean>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dynamicDataSource" />
</bean>
测试环节
@Test
public void testDb() {
System.out.println("------------------");
if(memberServiceImpl == null){
System.out.println("123");
}
DbContextHolder.setDb("dataSourceNew2");
Member m = new Member();
m.setAccountName("22213");
m.setMemberName("gui");
System.out.println(DbContextHolder.getDb());
System.out.println(memberServiceImpl.add(m));
//DbContextHolder.setDb("dataSource");
}
这个时候可以动态的改变数据源了,如果在配置文件中将lenientFallback属性设置为false的话,测试的配置中如果找不到dataSourceNew2将会报错
相关推荐
在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...
在提供的"spring整合mybatis多数据源"的demo实例中,你可能能看到上述各个步骤的具体实现,包括配置文件、路由类、以及相关的业务代码。这个实例可以帮助你快速理解并应用到自己的项目中。 总的来说,Spring整合...
总之,Spring+MyBatis多数据源配置是大型项目中常见的需求,它通过`AbstractRoutingDataSource`实现了动态数据源选择,结合MyBatis的Mapper接口和注解,可以方便地在多个数据库之间切换,从而满足复杂的数据库访问...
Spring Boot 和 MyBatis 的组合提供了这样的灵活性,可以方便地进行多数据源配置。本项目实例将详细讲解如何在 Spring Boot 中集成 MyBatis 并配置多数据源。 首先,我们需要了解 Spring Boot 中的数据源配置。...
在企业级应用开发中,经常需要访问和操作多个数据库,这种需求促使了多数据源配置与管理在Spring框架和MyBatis持久层框架中的重要性。下面对这个主题的知识点进行详细说明。 1. **多数据源场景介绍** 在处理多数据...
本项目是基于Spring Boot和MyBatis实现的多数据源配置示例,适合在Spring Tool Suite (STS) 开发环境中运行。 首先,我们需要理解Spring Boot的自动配置特性。Spring Boot通过`@EnableAutoConfiguration`注解简化了...
Spring Boot结合MyBatis框架提供了一种优雅的方式来处理多数据源的配置和切换,以满足不同业务需求。本文将深入探讨如何使用Spring Boot与MyBatis实现多数据源的示例。 1. **Spring Boot简介** Spring Boot是...
Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 详细教程 本教程主要介绍了 Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 的详细教程。下面将详细介绍如何实现 Spring 整合 ...
### Spring 下 MyBatis 多数据源配置详解 在企业级应用开发中,经常会遇到需要同时操作多个数据库的情况。为了实现这一目标,开发者通常会采用多数据源配置的方法。本篇文章将详细介绍如何在Spring框架中配置...
当我们面临多数据源的配置需求时,即在一个应用程序中需要同时操作多个数据库,Spring和Mybatis的集成就显得尤为重要。这篇博客“Spring+Mybatis 多数据源配置”将深入探讨如何在项目中实现这一功能。 首先,我们...
这些代码可以直接集成到你的项目中,只需要调整为匹配你的数据库配置,就可以实现Spring Boot 2下的多数据源支持,同时利用Hibernate和MyBatis的优势。 总之,多数据源的实现是Spring Boot 2应用中的高级特性,它...
总结来说,"Spring+SpringMVC+Mybatis多数据源"的整合涉及了Spring的数据源管理、SpringMVC的请求路由、Mybatis的数据源配置以及事务管理。具体实现时,可以根据项目需求选择合适的方式进行数据源切换,以达到优化...
在提供的资源中,`spring-boot-examples-master.zip`可能是包含了一个完整的Spring Boot多数据源配置示例项目,而`sprint boot mybatis多数据源.docx`文档可能详细阐述了配置过程和注意事项。建议参考这些资源,结合...
当我们的项目涉及到多数据源时,即需要连接并操作多个数据库,Spring Boot和MyBatis的整合就显得尤为重要。本文将深入探讨如何实现Spring Boot结合MyBatis的多数据源最简解决方案。 首先,我们来理解多数据源的需求...
标题 "mybatis spring 多数据源" 涉及到的...总的来说,"mybatis spring 多数据源"的主题涵盖了如何在Java应用中利用MyBatis和Spring进行多数据库管理,包括数据源配置、动态数据源路由、事务管理以及相关工具的使用。
myBatis 多数据源配置就是为了解决这样的问题。myBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。与 Spring Boot 结合使用时,可以方便地管理和切换不同的数据源。 首先,我们要理解什么...
在多数据源场景下,我们可以通过Spring Boot的@ConfigurationProperties特性来配置不同的数据源。每个数据源都需要定义一套包括URL、用户名、密码和驱动类名等属性。例如: ```java @Configuration @...
总结,Spring Boot结合Mybatis和Druid实现多数据源配置的过程包括:配置数据源、配置Mybatis、创建数据源切换器、以及针对不同数据库的测试。这一过程涉及了Spring Boot的自动配置、依赖注入、配置属性绑定等多个...
Spring Boot通过`@EnableAutoConfiguration`注解自动配置了大量常见服务,包括数据源和MyBatis的配置。然而,当涉及到多个数据源时,我们需要手动进行一些配置。 1. **配置双数据源** - 首先,为每个数据源创建一...