其實乙個工程多資料來源比較常見。
比如我們將所有工程中使用到的定時任務都持久化到同乙個資料庫,或者我們為工作流框架單獨提供乙個資料來源。
其實這些都好說,畢竟這些情況都是框架替我們做一些工作,我們幾乎沒有必要去訪問這些資料;或者框架已經提供了方便的api去訪問持久化資料,我們不用去考慮這方面的事情。
比較煩的情況是,乙個工程必須有多個資料來源,而且我們經常通過api訪問。
無論是使用orm框架還是jdbc或者sqltemplate,對於多個資料來源盡量保證相同的訪問方式,畢竟這些**到處都是,開發時誰都不想考慮對於哪個資料來源應該使用哪種訪問方式。
正好我本地的工程是用的mybatis,連線池使用dbcp,那就以這些為例,記錄一下多資料來源的配置。
(對於mybatis本身的配置就直接無視了,不同的org.mybatis.spring.sqlsessionfactorybean物件可以使用各自的mybatis配置也可以共享同乙個配置,看自己的需要了。)
先從配置資料來源開始,鑑於我用的是dbcp...算了,隨便配置乙個吧,具體引數看 。
下面是簡單配置:
id="mydatasource"接下來再弄個oracle的,太麻煩了,主要是bean id和一部分屬性不同,剩下的我們不需要關心:class="org.apache.commons.dbcp.basicdatasource"
destroy-method="close">
name="driverclassname"
value="com.mysql.jdbc.driver" />
name="url"
value="jdbc:mysql://localhost:3306/oasys?useunicode=true&characterencoding=utf-8" />
name="username"
value="root" />
name="password"
value="" />
name="initialsize"
value="2" />
name="maxactive"
value="10" />
name="maxwait"
value="-1" />
name="removeabandonedtimeout"
value="60" />
name="removeabandoned"
value="true" />
name="defaultautocommit"
value="true" />
name="testwhileidle"
value="true" />
name="testonborrow"
value="false" />
name="testonreturn"
value="false" />
name="numtestsperevictionrun"
value="10" />
name="timebetweenevictionrunsmillis"
value="900000" />
name="poolpreparedstatements"
value="true" />
name="maxopenpreparedstatements"
value="50" />
bean>
id="oracledatasource"兩種資料來源則兩種會話,我們需要兩個sqlsessionfactory,即:class="org.apache.commons.dbcp.basicdatasource"
destroy-method="close">
name="driverclassname"
value="oracle.jdbc.oracledriver" />
name="url"
value="jdbc:oracle:thin:@//localhost:1521/orcl" />
name="username"
value="alvez" />
name="password"
value="123" />
bean>
id="sqlsessionfactory"接下來就是dao bean了,可能我會使用如下這種方式:class="org.mybatis.spring.sqlsessionfactorybean">
name="datasource"
ref="oracledatasource" />
name="configlocation"
value="classpath:mybatis/mybatis-configuration.xml" />
bean>
id="_sqlsessionfactory"
class="org.mybatis.spring.sqlsessionfactorybean">
name="datasource"
ref="mydatasource" />
name="configlocation"
value="classpath:mybatis/mybatis-configuration1.xml" />
bean>
id="mybatisdao"但這樣幾乎沒什麼實際意義,工程中的dao bean可能會很多,而且會繼續擴充套件下去。class="pac.alvez.dao.mybatisdao">
name="sqlsessionfactory"
ref="sqlsessionfactory1">
property>
bean>
於是,通常我們會這樣用,順便帶上另乙個資料來源:
name="basepackage"可能有些人希望不同資料來源的dao bean存在於相同的package下,甚至不同資料來源的sql定義在相同的dao bean中。value="pac.alvez.dao.oracle" />
name="sqlsessionfactorybeanname"
value="sqlsessionfactory" />
bean>
name="basepackage"
value="pac.alvez.dao.mysql" />
name="sqlsessionfactorybeanname"
value="_sqlsessionfactory" />
bean>
我不知道應該如何實現這種效果,而且....用起來難道不混亂嗎?
剩下的就是transaction了,幾乎沒什麼特別的:
id="transactionmanager"class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
name="datasource"
ref="oracledatasource" />
bean>
id="transactionmanager1"
class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
name="datasource"
ref="mydatasource" />
bean>
transaction-manager="transactionmanager" />
transaction-manager="transactionmanager1" />
使用的時候需要注意,由於使用的是自動檢測dao bean的方式,即便不同資料來源的dao放在不同的package中也不能同名。
否則:
spring 多資料來源
之前嘗試的乙個多資料來源切換的功能測試可以實現了,下面進行一下簡單的筆記 testservice 方法通過以下方式進行主動切換 dynamicdatasource 類 package com.utils import org.springframework.jdbc.datasource.looku...
springboot整合多資料來源
多資料來源產生的問題 事物管理 在實際專案中,怎麼樣搭建多資料來源 區分資料來源 舉個例子 2個資料來源 test001 test002 1 分包結構 com.baidu.test001 訪問test001資料庫 daoservice com.baidu.test002 訪問test002資料庫 d...
spring多資料來源配置
前段時間由於公司專案需求,需要多資料來源的支援,苦b折騰了兩天程式猿,話不多說,直接擼碼。classpath jdbc.properties select 1 true select 1 true org.hibernate.dialect.mysqldialect false update tru...