spring mvc 多数据源的配置

来源:互联网 发布:平面设计师所用的软件 编辑:程序博客网 时间:2024/05/09 14:29

spring-XXX.xml 配置文件中 配置

<!--   dataSourceB中配置的是H2内存数据库 --> 

<bean id="dataSourceB" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
      <!-- 基本属性 url、user、password -->
      <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test"/>
    <property name="username" value="sa" />
    <property name="password" value="" />




      <!-- 配置初始化大小、最小、最大 -->
      <property name="initialSize" value="1" />
      <property name="minIdle" value="1" /> 
      <property name="maxActive" value="20" />


      <!-- 配置获取连接等待超时的时间 -->
      <property name="maxWait" value="60000" />


      <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
      <property name="timeBetweenEvictionRunsMillis" value="60000" />


      <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
      <property name="minEvictableIdleTimeMillis" value="300000" />


      <property name="validationQuery" value="SELECT 'x'" />
      <property name="testWhileIdle" value="true" />
      <property name="testOnBorrow" value="false" />
      <property name="testOnReturn" value="false" />


      <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
      <property name="poolPreparedStatements" value="true" />
      <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />


      <!-- 配置监控统计拦截的filters -->
      <property name="filters" value="stat" /> 
  </bean>
  


<!--   dataSourceA中配置的是mysql数据库  --> 
  
   <bean id="dataSourceA" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
      <!-- 基本属性 url、user、password -->
      <property name="driverClassName" value="${driver}" />
      <property name="url" value="${url}" />
      <property name="username" value="${username}" />
      <property name="password" value="${password}" />


      <!-- 配置初始化大小、最小、最大 -->
      <property name="initialSize" value="1" />
      <property name="minIdle" value="1" /> 
      <property name="maxActive" value="20" />


      <!-- 配置获取连接等待超时的时间 -->
      <property name="maxWait" value="60000" />


      <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
      <property name="timeBetweenEvictionRunsMillis" value="60000" />


      <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
      <property name="minEvictableIdleTimeMillis" value="300000" />


      <property name="validationQuery" value="SELECT 'x'" />
      <property name="testWhileIdle" value="true" />
      <property name="testOnBorrow" value="false" />
      <property name="testOnReturn" value="false" />


      <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
      <property name="poolPreparedStatements" value="true" />
      <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />


      <!-- 配置监控统计拦截的filters -->
      <property name="filters" value="stat" /> 
  </bean>
  
  
<!-- 关键在如下配置-->
  
  <bean id="dataSource" class="com.test.DynamicDataSource">
     <!-- 通过key-value的形式来关联数据源 -->
     <property name="targetDataSources">
        <map key-type="java.lang.String">
            <entry value-ref="dataSourceA" key="dataSourceA"></entry>
            <entry value-ref="dataSourceB" key="dataSourceB"></entry>
        </map>
     </property>
     <property name="defaultTargetDataSource" ref="dataSourceA" >
     </property>
  </bean>




DynamicDataSource.java



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


public class DynamicDataSource extends AbstractRoutingDataSource{


/*public static final String DATA_SOURCE_A = "dataSourceA";


        public static final String DATA_SOURCE_B = "dataSourceB";


        private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();


        public static void setCustomerType(String customerType) {


                contextHolder.set(customerType);


        }


        public static String getCustomerType() {


                return contextHolder.get();


        }


        public static void clearCustomerType() {


                contextHolder.remove();


        }


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


DataSourceContextHolder.java


public class DataSourceContextHolder {


 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
 public static final String DATA_SOURCE_A = "dataSourceA";


      public static final String DATA_SOURCE_B = "dataSourceB";
  
      public static void setDbType(String dbType) {  
       contextHolder.set(dbType);  
   }  
 
   public static String getDbType() {  
       return ((String) contextHolder.get());  
   }  
 
   public static void clearDbType() {  
       contextHolder.remove();  
   }  
}

<!--  配置结束  -->


引用如下:

@Controller
@RequestMapping("/Test")
@Transactional(rollbackFor=Exception.class)
public class TestController {

@Resource
private H2Service H2service;
         

         @Resource
private
MysqlService msqlservice;         
   

                @Transactional
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String insert(HttpSession session,HttpServletResponse res) {
res.addHeader("Cache-Control","no-cache, must-revalidate");
DataSourceContextHolder.setDbType("dataSourceA");//重点是这里

                        //这是在调用service之前设置是启用哪个数据源 

msqlservice.XX();

                DataSourceContextHolder.setDbType("dataSourceB");//重点是这里

                        H2service.XX();

        return "";

     }

}


 

                                                                                                                                                                                                                                                     ----- yt.Liu







0 0
原创粉丝点击