Spring 整合多資料來源的mybatis

2021-06-29 16:01:10 字數 3902 閱讀 9771

其實乙個工程多資料來源比較常見。

比如我們將所有工程中使用到的定時任務都持久化到同乙個資料庫,或者我們為工作流框架單獨提供乙個資料來源。

其實這些都好說,畢竟這些情況都是框架替我們做一些工作,我們幾乎沒有必要去訪問這些資料;或者框架已經提供了方便的api去訪問持久化資料,我們不用去考慮這方面的事情。

比較煩的情況是,乙個工程必須有多個資料來源,而且我們經常通過api訪問。

無論是使用orm框架還是jdbc或者sqltemplate,對於多個資料來源盡量保證相同的訪問方式,畢竟這些**到處都是,開發時誰都不想考慮對於哪個資料來源應該使用哪種訪問方式。

正好我本地的工程是用的mybatis,連線池使用dbcp,那就以這些為例,記錄一下多資料來源的配置。

(對於mybatis本身的配置就直接無視了,不同的org.mybatis.spring.sqlsessionfactorybean物件可以使用各自的mybatis配置也可以共享同乙個配置,看自己的需要了。)

先從配置資料來源開始,鑑於我用的是dbcp...算了,隨便配置乙個吧,具體引數看  。

下面是簡單配置:

id="mydatasource"

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>

接下來再弄個oracle的,太麻煩了,主要是bean id和一部分屬性不同,剩下的我們不需要關心:

id="oracledatasource"

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>

兩種資料來源則兩種會話,我們需要兩個sqlsessionfactory,即:

id="sqlsessionfactory"

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>

接下來就是dao bean了,可能我會使用如下這種方式:

id="mybatisdao"

class="pac.alvez.dao.mybatisdao">

name="sqlsessionfactory"

ref="sqlsessionfactory1">

property>

bean>

但這樣幾乎沒什麼實際意義,工程中的dao bean可能會很多,而且會繼續擴充套件下去。

於是,通常我們會這樣用,順便帶上另乙個資料來源:

name="basepackage"

value="pac.alvez.dao.oracle" />

name="sqlsessionfactorybeanname"

value="sqlsessionfactory" />

bean>

name="basepackage"

value="pac.alvez.dao.mysql" />

name="sqlsessionfactorybeanname"

value="_sqlsessionfactory" />

bean>

可能有些人希望不同資料來源的dao bean存在於相同的package下,甚至不同資料來源的sql定義在相同的dao 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...