文档章节

spring 静态数据源动态切换

无知的小孩
 无知的小孩
发布于 2015/07/14 18:10
字数 537
阅读 79
收藏 5

beans.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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:task="http://www.springframework.org/schema/task"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/task          
     http://www.springframework.org/schema/task/spring-task-3.0.xsd">
 <context:annotation-config />
 <aop:aspectj-autoproxy />
 <!--加入此段配置, -->
 <context:component-scan base-package="zh.task" />
 <!-- Enables the Spring Task @Scheduled programming model -->
 <task:executor id="executor" pool-size="1" />
 <task:scheduler id="scheduler" pool-size="1" />
 <task:annotation-driven executor="executor"
  scheduler="scheduler" />
 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="classpath:jdbc.properties" />
 </bean>
 <!-- ========================= DataSource config ========================= -->
 <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource"
  init-method="init" destroy-method="close">
  <property name="url" value="${jdbc_url1}" />
  <property name="username" value="${jdbc_user1}" />
  <property name="password" value="${jdbc_password1}" />
  <property name="maxActive" value="20" />
  <property name="initialSize" value="1" />
  <property name="maxWait" value="60000" />
  <property name="minIdle" value="1" />
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
  <property name="minEvictableIdleTimeMillis" value="300000" />
  <property name="testWhileIdle" value="true" />
  <property name="testOnBorrow" value="false" />
  <property name="testOnReturn" value="false" />
  <property name="poolPreparedStatements" value="true" />
  <property name="maxPoolPreparedStatementPerConnectionSize"
   value="50" />
  <property name="filters" value="stat,log4j" />
  <property name="proxyFilters" ref="log-filter" />

 </bean>
 <bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
  init-method="init" destroy-method="close">
  <property name="url" value="${jdbc_url2}" />
  <property name="username" value="${jdbc_user2}" />
  <property name="password" value="${jdbc_password2}" />
  <property name="maxActive" value="20" />
  <property name="initialSize" value="1" />
  <property name="maxWait" value="60000" />
  <property name="minIdle" value="1" />
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
  <property name="minEvictableIdleTimeMillis" value="300000" />
  <property name="testWhileIdle" value="true" />
  <property name="testOnBorrow" value="false" />
  <property name="testOnReturn" value="false" />
  <property name="poolPreparedStatements" value="true" />
  <property name="maxPoolPreparedStatementPerConnectionSize"
   value="50" />
  <property name="filters" value="stat,log4j" />
  <property name="proxyFilters" ref="log-filter" />

 </bean>
 <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
  <property name="resultSetLogEnabled" value="false" />
  <property name="statementExecutableSqlLogEnable" value="true" />
  <property name="statementLoggerName" value="sqlLogger" />
 </bean>
 <!-- ibatis配置 -->
 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:ibatis.xml" />
  <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="dataSource" class="zh.dbcenter.DynamicDataSource1">
  <property name="targetDataSources">
   <map key-type="java.lang.String">
    <entry key="dataSource2" value-ref="dataSource2" />
    <entry key="dataSource1" value-ref="dataSource1" />
   </map>
  </property>
  <property name="defaultTargetDataSource" ref="dataSource1" />
 </bean>

DbContextHolder.java

public class DbContextHolder {
 
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
   
    public static void setDBType(String dbType) { 
     System.out.println((String) contextHolder.get());
        contextHolder.set(dbType);  
    }  
  
    public static String getDBType() {  
        return (String) contextHolder.get();  
    }  
  
    public static void clearDBType() {  
        contextHolder.remove();  
    } 
}

DynamicDataSource1.java

import org.apache.log4j.Logger;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource1 extends AbstractRoutingDataSource {
 Logger log = Logger.getLogger("DynamicDataSource"); 
 @Override
 protected Object determineCurrentLookupKey() {
  return DbContextHolder.getDBType();
 } 
 
 
 
 
}

DBCenter2.java

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import zh.Dao.CampusDao;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:beans1.xml"}) 
public class DBCenter2 { 
 
 @Autowired
 private CampusDao campusDao;
  
 @Test 
 public void testCampusAll() { 
  
  System.out.println("傻逼");
  System.out.println(campusDao.findAll().get(0));
  DbContextHolder.setDBType("dataSource2");
  System.out.println(campusDao.findAll().get(0));
  DbContextHolder.setDBType("default_dataSource");
  System.out.println(campusDao.findAll().get(0));
  
 }
}

© 著作权归作者所有

共有 人打赏支持
无知的小孩
粉丝 1
博文 70
码字总数 19034
作品 0
贵阳
后端工程师
私信 提问
Spring中用了哪些设计模式?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内...

HOT_POT
02/17
0
0
这些 Spring 中的设计模式,你都知道吗?

导读:设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪...

一看就喷亏的小猿
04/04
0
0
这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
2018/08/17
0
0
面试官:Spring中用了哪些设计模式?

前言 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪...

Java填坑路
02/15
0
0
Spring中用了哪些设计模式?这样回答面试官才稳

一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 sp...

java知识分子
02/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部