zoukankan      html  css  js  c++  java
  • spring+mybatis多数据源

    1. 数据库properties配置

    2.数据源xml配置(默认数据库1):

    ...
        <!-- 读取配置文件信息 -->
        <context:property-placeholder ignore-unresolvable="true" location="classpath:*.properties"/>
    
        <bean name="dataSource" class="com.hsq.datasource.MultipleDataSource">
            <property name="targetDataSources">
                <map key-type="java.lang.String">
                    <entry key="dataSource_one" value-ref="dataSource_one" />
                    <entry key="dataSource_two" value-ref="dataSource_two" />
                </map>
            </property>
            <property name="defaultTargetDataSource" ref="dataSource_one" />
        </bean>
    
        <bean id="dataSource_one" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
            <!-- 数据库基本配置 -->
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url_one}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
    
            <!-- 初始化连接数量 -->
            <property name="initialSize" value="${jdbc.initialSize}"/>
            <!-- 最大并发连接数量 -->
            <property name="maxActive" value="${jdbc.maxActive}"/>
            <!-- 最小空闲连接数 -->
            <property name="minIdle" value="${jdbc.minIdle}"/>
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="${jdbc.maxWait}" />
            <!-- 超过时间限制是否回收 -->
            <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
            <!-- 超过时间限制多长 -->
            <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
            <!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
            <property name="validationQuery" value="${jdbc.validationQuery}" />
            <!-- 申请连接的时候检测 -->
            <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
            <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
            <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
            <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能  -->
            <property name="testOnReturn" value="${jdbc.testOnReturn}" />
            <property name="logAbandoned" value="true" />
            <!-- 配置监控统计拦截的filters,wall用于防止sql注入,stat用于统计分析 -->
            <property name="filters" value="stat,log4j" />
        </bean>
    
        <bean id="dataSource_two" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
            <!-- 数据库基本配置 -->
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url_two}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
    
            <!-- 初始化连接数量 -->
            <property name="initialSize" value="${jdbc.initialSize}"/>
            <!-- 最大并发连接数量 -->
            <property name="maxActive" value="${jdbc.maxActive}"/>
            <!-- 最小空闲连接数 -->
            <property name="minIdle" value="${jdbc.minIdle}"/>
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="${jdbc.maxWait}" />
            <!-- 超过时间限制是否回收 -->
            <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
            <!-- 超过时间限制多长 -->
            <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
            <!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
            <property name="validationQuery" value="${jdbc.validationQuery}" />
            <!-- 申请连接的时候检测 -->
            <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
            <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
            <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
            <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能  -->
            <property name="testOnReturn" value="${jdbc.testOnReturn}" />
            <property name="logAbandoned" value="true" />
            <!-- 配置监控统计拦截的filters,wall用于防止sql注入,stat用于统计分析 -->
            <property name="filters" value="stat,log4j" />
        </bean>
    ...

    3.数据源枚举类DbTypeEnum

    package com.hsq.datasource;
    
    public enum DbTypeEnum {
        one("dataSource_one"), two("dataSource_two");
        private String value;
    
        DbTypeEnum(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }

    4.数据源调用配置类MultipleDataSource

    package com.hsq.datasource;
    
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    /**
     * 配置mybatis多数据源,使用 MultipleDataSource.setDataSourceKey("") 配置数据源
     *
     * @author xiaokun
     */
    public class MultipleDataSource extends AbstractRoutingDataSource {
        private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();
    
        public static void setDataSourceKey(String dataSource) {
            dataSourceKey.set(dataSource);
        }
    
        public static String getDataSourceKey() {
            return dataSourceKey.get();
        }
    
        @Override
        protected Object determineCurrentLookupKey() {
            return dataSourceKey.get();
        }
    }

    5.调用方式(切换至数据库2):

    try {
                MultipleDataSource.setDataSourceKey(DbTypeEnum.two.getValue());
               ......
            } finally {
                MultipleDataSource.setDataSourceKey(DbTypeEnum.one.getValue());
            }
  • 相关阅读:
    ios中的几种多线程实现
    在mac下使用终端管理svn
    关于UIScrollViewDelegate协议中每个回调函数的意义及执行顺序的理解
    UIView 及其子类对象 抖动效果的实现
    ios、andriod、cocos2d 视图层次理解
    委托  通知中心   监听/观察
    iphone 中使用苹果禁用的私有Framework
    关于苹果官方网站Reachability检测网络的总结
    iOS设备的分辨率
    ios开发多线程、网络请求的理解 错误码的理解
  • 原文地址:https://www.cnblogs.com/007sx/p/8288280.html
Copyright © 2011-2022 走看看