基于Spring+Mybatis的多数据源动态切换

Spring单数据源直接在<bean id="dataSource">下配置数据源的各种连接参数。但动态数据源需要配置个各个数据源例如ds1、ds2等。然后在dataSource中动态根据传递过来的参数动态调用不同的数据源。

1、当进行访问时,首先通过DbContextHolder.setDbType("ds1");设置需要使用的数据源。DbContextHolder就是一个用来存储数据源信息的类,其中通过ThreadLocal来记录数据源信息。

2、DynamicDataSource类集成Spring的AbstractRoutingDataSource类,通过determineCurrentLookupKey方法来获取数据源类型,如果没有对应的数据源则使用defaultTargetDataSource配置。

注意:当设置了数据源之后会一直使用该数据源进行连接,除非使用 DbContextHolder.setDbType重新设置数据源或使用DbContextHolder.clearDbType()清除,清除后使用defaultTargetDataSource进行连接。

1、配置文件

properties

ds1.driverClassName=oracle.jdbc.OracleDriver
ds1.url=jdbc:oracle:thin:@localhost:1521:ORCL
ds1.username=SSM
ds1.password=SSM  

ds2.driverClassName=oracle.jdbc.OracleDriver
ds2.url=jdbc:oracle:thin:@10.27.192.43:1522:ORCL
ds2.username=FRAMEWORK_DEV
ds2.password=123456  

xml

<bean id="dataSource" class="com.cnpc.framework.db.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="ds1" value-ref="ds1" />
                <entry key="ds2" value-ref="ds2" />
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="ds1" />
    </bean>  

    <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${ds1.driverClassName}" />
        <property name="url" value="${ds1.url}" />
        <property name="username" value="${ds1.username}" />
        <property name="password" value="${ds1.password}" />
    </bean>
    <bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${ds2.driverClassName}" />
        <property name="url" value="${ds2.url}" />
        <property name="username" value="${ds2.username}" />
        <property name="password" value="${ds2.password}" />
    </bean>  

2、Java文件 
com.cnpc.framework.db.DynamicDataSource 源码

public class DynamicDataSource extends AbstractRoutingDataSource {  

    /**
     * 取得当前使用那个数据源。
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DbContextHolder.getDbType();
    }  

    public Logger getParentLogger() {
        // TODO Auto-generated method stub
        return null;
    }  

}  

DbContextHolder 源码

public class DbContextHolder
{
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  

    /**
     * 设置当前数据库。
     * @param dbType
     */
    public static void setDbType(String dbType)
    {
        contextHolder.set(dbType);
    }  

    /**
     * 取得当前数据源。
     * @return
     */
    public static String getDbType()
    {
        String str = (String) contextHolder.get();
        return str;
    }  

    /**
     * 清除上下文数据
     */
    public static void clearDbType()
    {
        contextHolder.remove();
    }  

}  

3、测试Code

public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception {  

        DbContextHolder.setDbType("ds1");
        List<DemoSysUser> list1 = demoSysUserService.getAll();
        System.out.println(DbContextHolder.getDbType() + ".list.size()=" + list1.size());  

        DbContextHolder.setDbType("ds2");
        List<DemoSysUser> list2 = demoSysUserService.getAll();
        System.out.println(DbContextHolder.getDbType() + ".list.size()=" + list2.size());
        DbContextHolder.clearDbType();  

        List<DemoSysUser> list = demoSysUserService.getAll();
        ModelAndView mv = this.getAutoView().addObject("sysUserList", list);
        return mv;
    }  


获取【下载地址】

时间: 2024-10-23 07:31:16

基于Spring+Mybatis的多数据源动态切换的相关文章

基于spring的aop实现多数据源动态切换

https://lanjingling.github.io/2016/02/15/spring-aop-dynamicdatasource/ 基于spring的aop实现多数据源动态切换 发表于 2016-02-15   |   分类于 spring  | 一.多数据源动态切换原理 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此:又例如:读写分离数据库配置的系统. 1.多数据源设置: 1)静态数据源切换:一般情况下,我们可以配置多个数据源,然后为每个数据源写一套对应的

基于spring+mybatis+atomikos+jta实现分布式事务(2)-动态切换数据源

本文介绍基于spring+mybatis+atomikos+jta实现分布式事务,由程序动态切换数据源,通过atomikos可实现分布式事务一致性. 版本:spring-3.2.9.RELEASE.mybatis-3.4.4.atomikos-4.0.5.jdk1.8 1,maven配置文件pom.xml如下: <!-- test --> <dependency> <groupId>junit</groupId> <artifactId>juni

基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例

一.概述 基于Spring动态配置多数据源,在大型的应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效的提高系统的水平伸缩性,而这样的解决方案就会补同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求以及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据. Spring配置多个数据源的方式和具体使用过程,Spring对于多数据源,以数据库表为参照,大体上可以分为两大类情况: 1.表级上的跨数据库,即对于不同的数据库却有不相同的表(表名和表结构完全

springboot多数据源动态切换和自定义mybatis件分页插

1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.datasource.url= jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 route.datasource.username= root route.datasource.password= 1234

spring 数据源动态切换 与dubbo服务

1:问题描述 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上.这个问题在先调用读操作后再调用写操作会出现.经分析原因有3: 第一:当程序运行一段时间后调用duboo服务时,读操作与写操作有可能会在一个线程里,当这种情况出现时 2:数据源配置 <idclass>    <name>       <key-type>          <keyvalue-ref/>          <keyv

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法(转)

一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基本上没有什么问题,但唯一可能出现问题的就是在hibernate做添加操作生成主键策略的时候.因为我们都知道hibernate的数据库本地方言会针对不同的数据库采用不同的主键生成策略. 所以针对这一问题不得不采用自定义的主键生成策略,自己写一个主键生成器的表来维护主键生成方式或以及使用其他的方式来生成

搭建基于Spring+MyBatis+Jersey的Maven-Web系统

搭建基于Spring+MyBatis+Jersey的Maven-Web系统 版本: Spring(4.1.0.RELEASE) + MyBatis(3.2.7)+ Jersey(1.18.1) 工具: IntelliJ + Maven 详细步骤如下: 创建一个基于maven-archetype-webapp的项目 打开pom文件,添加spring,jersey,jersey-spring依赖的库     <properties>         <project.build.source

koala 多数据源动态切换

koala 特点:多数据源动态切换,数据源分组和负载均衡(轮询) 项目源码以及demo:https://github.com/zeq9069/koala 请大家关注一下哦!!哈哈! 最近,在开发项目的时候后,要用到多个数据源的动态切换,于是就开发了koala 这个小小得框架,koala支持多数据源的切换,数据源的分组和负载均衡(轮询)! 只需要将jar引入到你自己的项目中之后,然后进行简单配置就可以使用了!!使用起来 非常方便,该项目提供了三个核心的注解@ChangeTo,@DataSource

spring+mybatis多数据源动态切换

spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web.xml <context-param> <param-name>webAppRootKey</param-name> <param-value>trac</param-value> </context-param> <!-- Spr