欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring整合多數(shù)據(jù)源實現(xiàn)動態(tài)切換的實例講解

 更新時間:2017年07月12日 08:29:53   投稿:jingxian  
下面小編就為大家?guī)硪黄猄pring整合多數(shù)據(jù)源實現(xiàn)動態(tài)切換的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在實際項目中時常需要連接多個數(shù)據(jù)庫,而且不同的業(yè)務需求在實現(xiàn)過程當中往往需要訪問不同的數(shù)據(jù)庫。

jdbc.properties配置文件,配置多個dataSource

##########################MySQL#####################################
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
connection.driver_class=com.mysql.jdbc.Driver
connection.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
connection.username=yahu
connection.password=123456

##########################Oracle#####################################
connection1.driver_class=oracle.jdbc.driver.OracleDriver
connection1.url=jdbc\:oracle\:thin\:@localhost\:1521/MEDB
connection1.username=yahu
connection1.password=123456

##########################Sql Server2008#####################################
connection2.driver_class=net.sourceforge.jtds.jdbc.Driver
connection2.url=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=test
connection2.username=yahu
connection2.password=123456

spring-config.xml配置文件如下,將DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同時配置DynamicDataSource的targetDataSources(多數(shù)據(jù)源目標)屬性的Map映射,使用動態(tài)數(shù)據(jù)源DynamicDataSource是繼承與AbstractRoutingDataSource,而AbstractRoutingDataSource又是繼承于org.springframework.jdbc.datasource.AbstractDataSource,AbstractDataSource實現(xiàn)了統(tǒng)一的DataSource接口,所以DynamicDataSource同樣可以當一個DataSource使用:

<!-- 數(shù)據(jù)庫連接池配置 -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${connection.driver_class}" />
  <property name="url" value="${connection.url}" />
  <property name="username" value="${connection.username}" />
  <property name="password" value="${connection.password}" />
  
  <property name="initialSize" value="5" />
  <property name="minIdle" value="1" /> 
  <property name="maxActive" value="200" />
  
  <!-- 配置獲取連接等待超時的時間 -->
  <property name="maxWait" value="30000" />
  
  <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
  
  <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
  <property name="minEvictableIdleTimeMillis" value="300000" />
 </bean>
 
 <!-- Oracle -->
 <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${connection1.driver_class}" />
  <property name="url" value="${connection1.url}" />
  <property name="username" value="${connection1.username}" />
  <property name="password" value="${connection1.password}" />
 </bean>

 <!-- Sql server 2008 -->
 <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${connection2.driver_class}" />
  <property name="url" value="${connection2.url}" />
  <property name="username" value="${connection2.username}" />
  <property name="password" value="${connection2.password}" />
 </bean>
 
  <!-- 動態(tài)數(shù)據(jù)源 -->
  <bean id="dynamicDataSource" class="com.yahu.core.dao.DynamicDataSource"> 
  <!-- 通過key-value的形式來關聯(lián)數(shù)據(jù)源 --> 
  <property name="targetDataSources"> 
   <map> 
    <entry value-ref="dataSource" key="datasource" /> 
    <entry value-ref="dataSource1" key="datasource1" />
    <entry value-ref="dataSource2" key="datasource2" />   
   </map> 
  </property> 
  <property name="defaultTargetDataSource" ref="dataSource" /> 
 </bean>

DynamicDataSource動態(tài)數(shù)據(jù)源類,擴展Spring的AbstractRoutingDataSource抽象類,實現(xiàn)動態(tài)數(shù)據(jù)源,AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是實現(xiàn)數(shù)據(jù)源的route的核心.這里對該方法進行Override:

package com.yahu.core.dao;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/*******************************************************************
 * @describe : 建立動態(tài)數(shù)據(jù)源類 必須繼承AbstractRoutingDataSource
 ********************************************************************/
public class DynamicDataSource extends AbstractRoutingDataSource {
 //coverity 修改
 //private Log log = LogFactory.getLog(getClass());

 protected Object determineCurrentLookupKey() {
  String value = CustomerContextHolder.getCustomerType();
  //log.info(value);
  return value;
 }

}

獲得和設置上下文環(huán)境,為一線程安全的ThreadLocal:

package com.yahu.core.dao;

/*******************************************************************
 * @describe : 獲得和設置上下文環(huán)境
 ********************************************************************/
public class CustomerContextHolder {

 /**
  * mysql
  */
 public static final String DATASOURCE = "datasource";

 /**
  * oracle
  */
 public static final String DATASOURCE_1 = "datasource1";
 
 /**
  * sql server
  */
 public static final String DATASOURCE_2 = "datasource2";

 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();
 }
}

動態(tài)數(shù)據(jù)源的管理,如何選擇控制每個業(yè)務中需要的具體數(shù)據(jù)源,可以使用手動控制,業(yè)務層通過加入以下代碼

CustomerContextHolder.setCustomerType(CustomerContextHolder.DATASOURCE);

即可實現(xiàn)動態(tài)切換數(shù)據(jù)源,如果在service層有比較統(tǒng)一的規(guī)則的話,也可以使用aop設置數(shù)據(jù)源使用,這里一般都是一個service一個數(shù)據(jù)源,所以最好使用aop在service層執(zhí)行完之后統(tǒng)一調用

CustomerContextHolder.clearCustomerType();

清空數(shù)據(jù)源信息。

當然,在上面配置里面有個參數(shù)defaultTargetDataSource為默認數(shù)據(jù)源,就是不設置數(shù)據(jù)源的話,就是用這個數(shù)據(jù)源。

以上這篇Spring整合多數(shù)據(jù)源實現(xiàn)動態(tài)切換的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)將txt文件轉成xls文件的方法

    Java實現(xiàn)將txt文件轉成xls文件的方法

    今天小編就為大家分享一篇Java實現(xiàn)將txt文件轉成xls文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Java中的構造方法和方法重載完整代碼

    Java中的構造方法和方法重載完整代碼

    在Java編程中,構造方法用于初始化對象,而方法重載允許同一個類中存在多個同名方法但參數(shù)不同,文中通過代碼及圖文介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • Java框架設計靈魂之反射的示例詳解

    Java框架設計靈魂之反射的示例詳解

    反射就是把Java類中的各個成員映射成一個個的Java對象。本文將通過示例為大家詳細講解Java框架設計的靈魂:反射,感興趣的可以了解一下
    2022-06-06
  • 使用Spring Initializr方式如何快速構建Spring Boot項目

    使用Spring Initializr方式如何快速構建Spring Boot項目

    Spring lnitializr是一個Web應用,它提供了一個基本的項目結構,能夠幫助我們快速構建一個基礎的Spring Boot項目,本文分步驟講解如何使用Spring Initializr方式構建Spring Boot項目,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • SpringBoot 請求參數(shù)忽略大小寫的實例

    SpringBoot 請求參數(shù)忽略大小寫的實例

    這篇文章主要介紹了SpringBoot 請求參數(shù)忽略大小寫的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Mybatis-plus批量去重插入ON DUPLICATE key update使用方式

    Mybatis-plus批量去重插入ON DUPLICATE key update使用方式

    這篇文章主要介紹了Mybatis-plus批量去重插入ON DUPLICATE key update使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • resty mail的簡單發(fā)送郵件方法

    resty mail的簡單發(fā)送郵件方法

    這篇文章主要為大家介紹了簡單的resty mail發(fā)送郵件方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • SpringBoot使用Sa-Token實現(xiàn)賬號封禁、分類封禁、階梯封禁的示例代碼

    SpringBoot使用Sa-Token實現(xiàn)賬號封禁、分類封禁、階梯封禁的示例代碼

    本文主要介紹了SpringBoot使用Sa-Token實現(xiàn)賬號封禁、分類封禁、階梯封禁的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • MyBatis中防止SQL注入講解

    MyBatis中防止SQL注入講解

    這篇文章主要介紹了MyBatis中防止SQL注入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • 一文教會你使用Java中的枚舉Enmu

    一文教會你使用Java中的枚舉Enmu

    枚舉是 Java 中的一種特殊類型,它用于表示一組固定值,這篇文章就是來和大家講講枚舉的作用與具體使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06

最新評論