配置多数据源并动态切换


由于开发需求,项目上要使用多数据源,一个链接oracle一个链接sqlserver,也没有弄过,在度娘上看了一篇文章很受启发http://blog.csdn.net/q908555281/article/details/50316137,于是自己动手实践,第一次配置没有很多问题,自己也算是幸运的孩子,不过很简单
,不需要多少脑细胞。

这是spring配置

	<!--导入quartz  -->
	<!--<import resource="applicationContext-quartz.xml"/> --> 
	<!-- <import resource="applicationContext-aop.xml"/> -->
	<!--oracle数据源  -->
	<bean id="oracle_dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <!-- 数据库基本信息配置 -->
        <property name="driverClassName" value="${ORACLE_DB_DRIVER}" />
         <!-- 本机地址 -->
        <property name="url" value="${ORACLE_DB_URL}" />
        <property name="username" value="${ORACLE_DB_USER}" />
        <property name="password" value="${ORACLE_DB_PASSWORD}" />      
        <!-- 初始化连接数量 -->
        <property name="initialSize" value="5" />
        <!-- 最大并发连接数 -->
        <property name="maxActive" value="20" />
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="5" />
        <!-- 配置获取连接等待超时的时间 -->     
        <property name="maxWait" value="60000" />
        <!-- 超过时间限制是否回收 -->
        <property name="removeAbandoned" value="true" />
        <!-- 超过时间限制多长,单位:秒 -->
        <property name="removeAbandonedTimeout" value="600" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
        <property name="validationQuery" value="SELECT 1 from  dual" />
        <!-- 申请连接的时候检测 -->
        <property name="testWhileIdle" value="true" />
        <!--属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:                 
                监控统计用的filter:stat
                日志用的filter:log4j
               防御SQL注入的filter:wall -->
        <property name="filters" value="stat" />       
    </bean> 
    
    <!-- mysql数据源 -->
	<!-- 数据源配置, 使用druid连接池 -->
	<bean id="mysql_dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${MYSQL_DB_DRIVER}" />
		<property name="url" value="${MYSQL_DB_URL}" />
		<property name="username" value="${MYSQL_DB_USER}" />
		<property name="password" value="${MYSQL_DB_PASSWORD}" />
		<property name="filters" value="mergeStat" />
		<!-- 密码解密 -->
		<!-- <property name="filters" value="config" />
		<property name="connectionProperties" value="config.decrypt=true" /> -->
		<!-- 申请连接的时候检测 -->
		<property name="testWhileIdle" value="true"></property> 
		<!-- 检测连接 -->
		<property name="validationQuery" value="select 'x'"></property>
		<!--maxActive: 最大连接数量 -->
		<property name="maxActive" value="40" />
		<!--initialSize: 初始化连接 -->
		<property name="initialSize" value="5" />
	</bean>
	
	<!-- 动态配置数据源 -->  
   <bean id ="dataSource" class= "com.sjt.datasource.DynamicDataSource" >  
          <property name ="targetDataSources">  
                <map key-type ="java.lang.String">  
                      <entry value-ref ="oracle_dataSource" key= "oracle_dataSource"></entry >  
                      <entry value-ref ="mysql_dataSource" key= "mysql_dataSource"></entry >  
                </map >  
          </property >  
          <property name ="defaultTargetDataSource" ref= "oracle_dataSource"></property >      <!-- 默认使用ds1的数据源 -->  
   </bean >  
	
	
	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<!-- 自动扫描mapping.xml文件 -->  
		<property name="mapperLocations">
			<list>
				<value>classpath:mapping/*Mapper.xml</value>
			</list>
		</property>
	</bean>


这是动态切换工具

/**
 * @ClassName: DataSourceContextHolder
 * @Description: 数据库切换工具类
 * @author: libiao
 * @date: 2015-12-14 下午5:56:27
 */
public class DataSourceContextHolder {
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

	public static void setDbType(String dbType) {
		contextHolder.set(dbType);
	}

	public static String getDbType() {
		return ((String) contextHolder.get());
	}

	public static void clearDbType() {
		contextHolder.remove();
	}
}

这是切换类

public class DynamicDataSource extends AbstractRoutingDataSource {


    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }

}

这是静态产量

public class DataSourceType {
  
    public static final String ORACLE_ADMIN = "oracle_dataSource";
 
    public static final String MYSQL_PARTNER = "mysql_dataSource";
}


再说一次很简单 这样调用就可以了

 //切换数据库  
              DataSourceContextHolder. setDbType(DataSourceType.MYSQL_PARTNER);  
 这样就达到了你想要的效果,亲测有效。。



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