Springmvc+mybatis 多數據源配置

config.properties   文件

#兩個數據源連接的配置
jdbc.mysql.url=jdbc:oracle:thin:@43.232.157.93:1521:orcl
jdbc.mysql.username=traffic
jdbc.mysql.password=traffic

jdbc.mysql.url1=jdbc:oracle:thin:@www.sxkai.com:1521:orcl
jdbc.mysql.username1=QKCG_PUB
jdbc.mysql.password1=JXKJ

spring-datasource.xml   文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
       default-lazy-init="true">

	<!-- 讀取數據庫配置文件 -->
	<context:property-placeholder ignore-unresolvable="true" location="classpath*:/spring/config.properties" /> 

	<!-- 配置數據源 -->
	<bean id="mysqlDataSource" name="mysqlDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.mysql.driver}"/>
		<property name="url" value="${jdbc.mysql.url}" />
		<property name="username" value="${jdbc.mysql.username}" />
		<property name="password" value="${jdbc.mysql.password}" />
		<!-- 初始化連接數量 -->
        <property name="initialSize" value="${druid.initialSize}" />
        <!-- 最大併發連接數 -->
        <property name="maxActive" value="${druid.maxActive}" />
        <!-- 最大空閒連接數 -->
      <!--   <property name="maxIdle" value="${druid.maxIdle}" /> -->
        <!-- 最小空閒連接數 -->
        <property name="minIdle" value="${druid.minIdle}" />
        <!-- 配置獲取連接等待超時的時間 -->     
        <property name="maxWait" value="${druid.maxWait}" />
        <!-- 超過時間限制是否回收 -->
        <property name="removeAbandoned" value="${druid.removeAbandoned}" />
        <!-- 超過時間限制多長; -->
        <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
        <!-- 用來檢測連接是否有效的sql,要求是一個查詢語句-->
        <property name="validationQuery" value="${druid.validationQuery}" />
        <!-- 申請連接的時候檢測 -->
        <property name="testWhileIdle" value="${druid.testWhileIdle}" />
        <!-- 申請連接時執行validationQuery檢測連接是否有效,配置爲true會降低性能 -->
        <property name="testOnBorrow" value="${druid.testOnBorrow}" />
        <!-- 歸還連接時執行validationQuery檢測連接是否有效,配置爲true會降低性能  -->
        <property name="testOnReturn" value="${druid.testOnReturn}" />
        <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />     
        <property name="maxPoolPreparedStatementPerConnectionSize" value="${druid.maxPoolPreparedStatementPerConnectionSize}" />
        <!--屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:                 
                監控統計用的filter:stat
                日誌用的filter:log4j
               防禦SQL注入的filter:wall -->
        <property name="filters" value="${druid.filters}" />     
	</bean>
	
	
	
	<!-- 配置數據源 -->
	<bean id="mysqlDataSource1" name="mysqlDataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.mysql.driver}"/>
		<property name="url" value="${jdbc.mysql.url1}" />
		<property name="username" value="${jdbc.mysql.username1}" />
		<property name="password" value="${jdbc.mysql.password1}" />
		<!-- 初始化連接數量 -->
        <property name="initialSize" value="${druid.initialSize}" />
        <!-- 最大併發連接數 -->
        <property name="maxActive" value="${druid.maxActive}" />
        <!-- 最大空閒連接數 -->
      <!--   <property name="maxIdle" value="${druid.maxIdle}" /> -->
        <!-- 最小空閒連接數 -->
        <property name="minIdle" value="${druid.minIdle}" />
        <!-- 配置獲取連接等待超時的時間 -->     
        <property name="maxWait" value="${druid.maxWait}" />
        <!-- 超過時間限制是否回收 -->
        <property name="removeAbandoned" value="${druid.removeAbandoned}" />
        <!-- 超過時間限制多長; -->
        <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />
        <!-- 用來檢測連接是否有效的sql,要求是一個查詢語句-->
        <property name="validationQuery" value="${druid.validationQuery}" />
        <!-- 申請連接的時候檢測 -->
        <property name="testWhileIdle" value="${druid.testWhileIdle}" />
        <!-- 申請連接時執行validationQuery檢測連接是否有效,配置爲true會降低性能 -->
        <property name="testOnBorrow" value="${druid.testOnBorrow}" />
        <!-- 歸還連接時執行validationQuery檢測連接是否有效,配置爲true會降低性能  -->
        <property name="testOnReturn" value="${druid.testOnReturn}" />
        <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />     
        <property name="maxPoolPreparedStatementPerConnectionSize" value="${druid.maxPoolPreparedStatementPerConnectionSize}" />
        <!--屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:                 
                監控統計用的filter:stat
                日誌用的filter:log4j
               防禦SQL注入的filter:wall -->
        <property name="filters" value="${druid.filters}" />     
	</bean>
	
	
	 <bean id="dynamicDataSource" class="com.wisdomtraffic.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <!--通過不同的key決定用哪個dataSource -->
                <entry value-ref="mysqlDataSource" key="mysqlDataSource"></entry>
                <entry value-ref="mysqlDataSource1" key="mysqlDataSource1"></entry>
            </map>
        </property>
        <!--設置默認的dataSource -->
        <property name="defaultTargetDataSource" ref="mysqlDataSource">
        </property>
    </bean>
	
	

    <!-- MyBatis配置 -->
    <bean id="mysqlSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dynamicDataSource" />
        <!-- 自動掃描entity目錄, 省掉xml裏的手工配置 -->
        <property name="typeAliasesPackage" value="com.wisdomtraffic.entity" />
        <!-- 顯式指定Mapper文件位置  -->
        <property name="mapperLocations">
            <list>
                <value>classpath:/mybatis/**/**/*Mapper.xml</value>
            </list>
        </property>
        <property name="plugins"><array><ref bean="pagePlugin" /></array></property>
    </bean>
    <!-- 分頁配置-->
    <bean id="pagePlugin" class="com.wisdomtraffic.common.mybatis.PageInterceptor">
		<property name="properties">
			<props>
				<prop key="databaseType">oracle</prop>
			</props>
		</property>
	</bean>
    <!-- 分頁配置end-->
    <!-- 掃描basePackage下所有以@MyBatisRepository標識的 接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="mysqlSqlSessionFactory"/>
        <property name="basePackage" value="com.wisdomtraffic.repository" />
        <!-- 優化速度-->
        <property name="annotationClass" value="com.wisdomtraffic.repository.base.wisdomtrafficBatis"/>
    </bean>
	<!-- 配置事務管理器 -->
	<bean id="mysqlTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dynamicDataSource" />
	</bean>
	<!--  攔截器方式配置事務 -->
	<tx:advice id="mysqlTransactionAdvice" transaction-manager="mysqlTransactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="find*" propagation="SUPPORTS" />
			<tx:method name="*" propagation="SUPPORTS" />
		</tx:attributes>
	</tx:advice>
	<aop:config proxy-target-class="true">
		<aop:pointcut id="mysqlTransactionPointcut" expression="execution(* com.wisdomtraffic.service.*.*(..))" />
		<aop:advisor pointcut-ref="mysqlTransactionPointcut" advice-ref="mysqlTransactionAdvice" />
	</aop:config>
	<tx:annotation-driven transaction-manager="mysqlTransactionManager" proxy-target-class="true" />
</beans>

DynamicDataSource.java  文件

package com.wisdomtraffic;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
	@Override
    protected Object determineCurrentLookupKey() {
        // TODO Auto-generated method stub
        return DataSourceContextHolder.getCustomerType();
    }
 
}

DataSourceContextHolder.java  文件

package com.wisdomtraffic;

import org.springframework.util.StringUtils;

public class DataSourceContextHolder {
	public static final String DATA_SOURCE_MYSQL = "mysqlDataSource";
    public static final String DATA_SOURCE_MYSQL1 = "mysqlDataSource1";
    // 用ThreadLocal來設置當前線程使用哪個dataSource
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
 
    public static void setCustomerType(String customerType) {
        contextHolder.set(customerType);
    }
 
    public static String getCustomerType() {
        String dataSource = contextHolder.get();
        if (StringUtils.isEmpty(dataSource)) {
            return DATA_SOURCE_MYSQL;
        } else {
            return dataSource;
        }
    }
 
    public static void clearCustomerType() {
        contextHolder.remove();
    }
}

測試------------------

在訪問數據庫前加上
DataSourceContextHolder.setCustomerType(DataSourceContextHolder.DATA_SOURCE_MYSQL1);

DataSourceContextHolder.setCustomerType(DataSourceContextHolder.DATA_SOURCE_MYSQL1);
List<HashMap<String, String>> test = service.getTest();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章