1. 程式人生 > >SpringMVC動態切換多個數據源解決方案(自測可用)

SpringMVC動態切換多個數據源解決方案(自測可用)

SpringMVC動態切換多個數據源解決方案

1.資料來源配置

 <!-- 事務  -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager
="transactionManager"/>
<!-- 資料來源1 --> <bean id="coreDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property
name="url">
<value>${db.mysql.core.url}</value> </property> <property name="username"> <value>${db.mysql.core.username}</value> </property> <property name="password"> <value>${db.mysql.core.password}</value
>
</property> <!-- 初始化連線大小 --> <property name="initialSize" value="1"/> <!-- 連線池最大使用連線數量 --> <property name="maxTotal" value="20"/> <!-- 連線池最大空閒 --> <property name="maxIdle" value="20"/> <!-- 連線池最小空閒 --> <property name="minIdle" value="1"/> <!-- 獲取連線最大等待時間 --> <property name="maxWaitMillis" value="60000"/> <property name="validationQuery" value="select 1 from dual"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="testWhileIdle" value="true"/> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="28800000"/> </bean> <!-- 資料來源2 --> <bean id="reportDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>${db.mysql.report.url}</value> </property> <property name="username"> <value>${db.mysql.report.username}</value> </property> <property name="password"> <value>${db.mysql.report.password}</value> </property> <!-- 初始化連線大小 --> <property name="initialSize" value="1"/> <!-- 連線池最大使用連線數量 --> <property name="maxTotal" value="20"/> <!-- 連線池最大空閒 --> <property name="maxIdle" value="20"/> <!-- 連線池最小空閒 --> <property name="minIdle" value="1"/> <!-- 獲取連線最大等待時間 --> <property name="maxWaitMillis" value="60000"/> <property name="validationQuery" value="select 1 from dual"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="testWhileIdle" value="true"/> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="28800000"/> </bean> <bean id="dataSource" class="com.xiaomi.dev.service.datasource.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="coreDataSource" key="core"></entry> <entry value-ref="reportDataSource" key="report"></entry> </map> </property> <!-- 預設使用server的資料來源 --> <property name="defaultTargetDataSource" ref="coreDataSource"></property> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置對映檔案 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 自動掃描mapping.xml檔案 --> <property name="mapperLocations" value="classpath:sqlmap/*.xml"></property> </bean> <bean class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"/> </bean>

2. DataSourceConst.java

public class DataSourceConst {
    public static final String CORE = "core";
    public static final String REPORT = "report";
}  

3. DynamicDataSource.java

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }

}  

4. DataSourceContextHolder.java

public class DataSourceContextHolder {
    private static final ThreadLocal contextHolder = new ThreadLocal();

    public static void setDataSourceType(String dataSourceType) {
        contextHolder.set(dataSourceType);
    }

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

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

}    

5. 資料庫查詢前切換到指定庫

// 切換為report庫
DataSourceContextHolder.setDataSourceType(DataSourceConst.REPORT);
// 切換為core庫
DataSourceContextHolder.setDataSourceType(DataSourceConst.CORE);

相關推薦

SpringMVC動態切換個數解決方案可用

SpringMVC動態切換多個數據源解決方案 1.資料來源配置 <!-- 事務 --> <bean id="transactionManager"

AngularJS $q 和 $q.all 單個數個數合並promise的說明

獲取 lar debug let index 被拒 可用 第一個 brush 這篇文章講的不錯, angular $q 和 promise!! -------------------------------------------------------------- 通

Spring Boot實現個數教程收集待實踐

get shu 多個 href eos net -c smi tar 先收集,後續實踐。 http://blog.csdn.net/catoop/article/details/50575038 http://blog.csdn.net/neosmith/article

hibernate配置個數及事物以兩個資料來源為例

在ssh專案中,需要連線兩個不同ip下的資料庫,所以必須要給hibernate配置兩個或多個數據源 因為我只有一臺電腦,所以我配置的是sqlserver+mysql兩個資料來源 首先hibernate配置是直接從myeclipse中新增的   右鍵----myeclipse

單個工程中Spring+Mybatis連線個數庫的配置個人分享版本

上一篇部落格說到同一個問題,經過和朋友的研究已經參考網上的資料,現在給出一份更簡潔的配置。 情景:現在單個工程中需要連線兩個庫,這兩個庫在同一個mysql中,兩個庫都需要進行讀寫。 解決: 第一步:將spring和mybatis整合,這個過程就不具體演示了,在這個過程中建立

win10環境下配置django2.0.4+Apache2.4+python3.6專案,以及Django靜態檔案、Apache專案配置的解決方案

1 安裝django, Apache,python 要求Apache和python位數一致,比如我的Apache2.4-x86和 python3.6-32位 我的安裝位置: Apache2.4 ---  E:\Apache24 python3.6---E:\pht

轉 Android SDK Manager國內無法更新的解決方案有效

轉自 Android SDK Manager國內無法更新的解決方案(親測有效) 現在由於GWF,google基本和咱們說咱見了,就給現在在做Android 或者想學習Android 的朋友帶來了諸多的不便,最簡單的就是Android SDK Manager 你無法更新了。 現在這裡有一

IDEA建立struct2問題報錯解決方案有效

報錯案例 [2018-10-06 03:30:14,199] Artifact untitled1:war exploded: Artifact is being deployed, please wait... 06-Oct-2018 15:30:14.824 警告 [RM

新建的webservice本地測試除錯,只能localhost訪問不能ip訪問的解決辦法可用

用管理員身份執行VS(這個設定目前測試適用於使用了express版本)。 右鍵點選IIS Express ==》顯示所有應用程式,下面有配置,用VS開啟配置 3.開啟applicationhost.config檔案,找到sites節點,找到自己的webservice的site節點,然後新增繫結ip和埠

“ADB Interface”安裝失敗的問題解決方案可行

在學習Android的過程中,想要通過真機對應用程式進行除錯,電腦連線USB安裝驅動時並不順利,彈出提示為 ADB Interface驅動未安裝,如圖: Android ADB Interface是一個支援android和PC連線的程式,通過它Windows就可以自動識別並安裝驅動軟

SpringCloud之基於SpringCloud+MybatisPlus+Config實現個數動態切換

一、首先,專案基於SpringCloud,配置檔案在Git上(包括資料來源的配置資訊)。 二、開始基於原有專案進行重構 1、寫一個動態資料來源上下文.程式碼如下: /** * 動態資料來源上下文 */ public class DbContextHolder { p

Spring配置個數,並實現資料來源的動態切換

1.首先在config.properties檔案中配置兩個資料庫連線的基本資料。這個省略了 2.在spring配置檔案中配置這兩個資料來源: 資料來源1 <!-- initialSize初始化時建立物理連線的個數0 maxActive最大

Spring動態切換多數解決方案

http aso 解決 目標 可能 bcp pro start map spring動態配置多數據源,即在大型應用中對數據進行切分,並且采用多個數據庫實例進行管理,這樣可以有效提高系統的水平伸縮性。而這樣的方案就會不同於常見的單一數據實例的方案,這就要程序在運行時根據當時的

Delphi動態鏈接個數執行操作例子

ado btn form ldb var 運行 數據源 ons user 1.首先配置文件[SubExamDep1]DBSERVER=(local)DBNAME=herpeisweixinUSERNAME=saPWD=bjbrMSG=SubExamDep1失敗[SubExa

Spring Profile和Mybatis進行個數H2和Mysql切換

sql pda 開箱 https tails val 收集 sqlserver jpetstore 總結: 最近在做WebMagic的後臺,遇到一個問題:後臺用到了數據庫,本來理想情況下是用Mysql,但是為了做到開箱即用,也整合了一個嵌入式數據庫H2。這裏面就有個問題了,

分散式事務--XA 解決個數操作

個人備忘 事務(官方解釋):是由一組sql語句組成的“邏輯處理單元”。 事務具有如下四個屬性,通常稱為事務的ACID屬性 : 1. 原子性(Atomicity): 事務是一個原子操作單元,要麼都執行,要麼都不執行。 2. 一致性(Consistent):

使用Spring Profile和Mybatis進行個數H2和Mysql切換

轉載自:http://my.oschina.net/flashsword/blog/209872 最近在做WebMagic的後臺,遇到一個問題:後臺用到了資料庫,本來理想情況下是用Mysql,但是為了做到開箱即用,也整合了一個嵌入式資料庫H2。這裡面就有個問題了,如何用

一個程式配置個數,並進行資料來源切換

1>.在資料庫連接配置檔案中配置,資料庫連線資訊,資料來源選擇器,多個數據源資訊,sql會話工廠 <!-- 在applicationContext-dao.xml引入資料庫資訊配置檔案db.properties --> <bean id="prope

EJB 配置個數

name XML cti kong 添加 local ima 不能 transacti 1.修改jboss-6.simple\server\default\deploy\transaction-jboss-beans.xml 配置文件 <bean name="Co

個數multiple data sources

art multipl spring detail 多個 教程 boot net sdn 參考資料: SpringBoot非官方教程 | 第五篇:springboot整合 beatlsql多個數據源(multiple data sources)