`

spring mybatis多数据源配置

 
阅读更多

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将会报错

 

 

 

分享到:
评论

相关推荐

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    spring整合mybatis多数据源

    在提供的"spring整合mybatis多数据源"的demo实例中,你可能能看到上述各个步骤的具体实现,包括配置文件、路由类、以及相关的业务代码。这个实例可以帮助你快速理解并应用到自己的项目中。 总的来说,Spring整合...

    Spring+MyBatis多数据源配置实现

    总之,Spring+MyBatis多数据源配置是大型项目中常见的需求,它通过`AbstractRoutingDataSource`实现了动态数据源选择,结合MyBatis的Mapper接口和注解,可以方便地在多个数据库之间切换,从而满足复杂的数据库访问...

    Springboot mybatis多数据源配置项目实例

    Spring Boot 和 MyBatis 的组合提供了这样的灵活性,可以方便地进行多数据源配置。本项目实例将详细讲解如何在 Spring Boot 中集成 MyBatis 并配置多数据源。 首先,我们需要了解 Spring Boot 中的数据源配置。...

    spring,mybatis 对数据源配置与管理

    在企业级应用开发中,经常需要访问和操作多个数据库,这种需求促使了多数据源配置与管理在Spring框架和MyBatis持久层框架中的重要性。下面对这个主题的知识点进行详细说明。 1. **多数据源场景介绍** 在处理多数据...

    STS下spring boot、mybatis多数据源配置

    本项目是基于Spring Boot和MyBatis实现的多数据源配置示例,适合在Spring Tool Suite (STS) 开发环境中运行。 首先,我们需要理解Spring Boot的自动配置特性。Spring Boot通过`@EnableAutoConfiguration`注解简化了...

    springboot + mybatis 多数据源demo

    Spring Boot结合MyBatis框架提供了一种优雅的方式来处理多数据源的配置和切换,以满足不同业务需求。本文将深入探讨如何使用Spring Boot与MyBatis实现多数据源的示例。 1. **Spring Boot简介** Spring Boot是...

    Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 详细教程 本教程主要介绍了 Spring3 整合 MyBatis3 配置多数据源动态选择 SqlSessionFactory 的详细教程。下面将详细介绍如何实现 Spring 整合 ...

    Spring下mybatis多数据源配置

    ### Spring 下 MyBatis 多数据源配置详解 在企业级应用开发中,经常会遇到需要同时操作多个数据库的情况。为了实现这一目标,开发者通常会采用多数据源配置的方法。本篇文章将详细介绍如何在Spring框架中配置...

    Spring+Mybatis 多数据源配置

    当我们面临多数据源的配置需求时,即在一个应用程序中需要同时操作多个数据库,Spring和Mybatis的集成就显得尤为重要。这篇博客“Spring+Mybatis 多数据源配置”将深入探讨如何在项目中实现这一功能。 首先,我们...

    spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码

    这些代码可以直接集成到你的项目中,只需要调整为匹配你的数据库配置,就可以实现Spring Boot 2下的多数据源支持,同时利用Hibernate和MyBatis的优势。 总之,多数据源的实现是Spring Boot 2应用中的高级特性,它...

    Spring+SpringMVC+Mybatis多数据源

    总结来说,"Spring+SpringMVC+Mybatis多数据源"的整合涉及了Spring的数据源管理、SpringMVC的请求路由、Mybatis的数据源配置以及事务管理。具体实现时,可以根据项目需求选择合适的方式进行数据源切换,以达到优化...

    springboot+mybatis多数据源配置下载

    在提供的资源中,`spring-boot-examples-master.zip`可能是包含了一个完整的Spring Boot多数据源配置示例项目,而`sprint boot mybatis多数据源.docx`文档可能详细阐述了配置过程和注意事项。建议参考这些资源,结合...

    spring boot mybatis多数据源最简解决方案

    当我们的项目涉及到多数据源时,即需要连接并操作多个数据库,Spring Boot和MyBatis的整合就显得尤为重要。本文将深入探讨如何实现Spring Boot结合MyBatis的多数据源最简解决方案。 首先,我们来理解多数据源的需求...

    mybatis spring 多数据源

    标题 "mybatis spring 多数据源" 涉及到的...总的来说,"mybatis spring 多数据源"的主题涵盖了如何在Java应用中利用MyBatis和Spring进行多数据库管理,包括数据源配置、动态数据源路由、事务管理以及相关工具的使用。

    myBatis多数据源配置

    myBatis 多数据源配置就是为了解决这样的问题。myBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。与 Spring Boot 结合使用时,可以方便地管理和切换不同的数据源。 首先,我们要理解什么...

    Springboot+Mybatis+Druid多数据源配置

    在多数据源场景下,我们可以通过Spring Boot的@ConfigurationProperties特性来配置不同的数据源。每个数据源都需要定义一套包括URL、用户名、密码和驱动类名等属性。例如: ```java @Configuration @...

    Springboot+mybatis+druid多数据源配置(oracle+mybatis)

    总结,Spring Boot结合Mybatis和Druid实现多数据源配置的过程包括:配置数据源、配置Mybatis、创建数据源切换器、以及针对不同数据库的测试。这一过程涉及了Spring Boot的自动配置、依赖注入、配置属性绑定等多个...

    springboot+mybatis双数据源配置及事务处理

    Spring Boot通过`@EnableAutoConfiguration`注解自动配置了大量常见服务,包括数据源和MyBatis的配置。然而,当涉及到多个数据源时,我们需要手动进行一些配置。 1. **配置双数据源** - 首先,为每个数据源创建一...

Global site tag (gtag.js) - Google Analytics