Spring多資料來源配置和動態切換

2021-10-17 08:58:55 字數 1773 閱讀 5066

平常我們工作有時會有讀寫分離,或者業務資料在不同的資料庫的情況,如果在乙個專案裡操作,就需要配置多個資料來源,並進行動態的切換了。

服務框架:spring + mybatis + druid

多資料來源的配置有兩種方式:

第一種是基於配置來實現:將資料來源的配置一摸一樣的配置多個,這種情況下,就需要將不同的業務拆分到不同的包下了,資料來源配置中指定掃瞄不同的包。

這種多資料來源配置改動起來很簡單,缺點就是不夠靈活,無法對具體的場景進行資料來源的切換。

第二種是基於切面來實現:自定義註解,在需要切換資料來源的地方加上註解,切換到指定的資料來源。

定義資料源型別列舉類

public enum dbtypeenum
定義資料源型別管理類

public class datasourcetypemanager 

public static void setdatasource(dbtypeenum dbtype)

public static void resetdatasource()

}

threadlocal顧名思義儲存的是每個執行緒自己的變數,執行緒間是彼此隔離的,所以不會有執行緒安全問題。threadlocal會為每個執行緒建立乙個副本,儲存變數,執行緒內任何地方都可以直接使用,所以對效能不會有嚴重影響。

實現抽象類abstractroutingdatasource,實現資料來源的動態路由

public class dynamicdatasource extends abstractroutingdatasource 

}

自定義註解,這裡定義註解可加在類上和方法上

@target()

@retention(retentionpolicy.runtime)

@documented

public @inte***ce datasource

切面實現資料來源動態切換

@aspect

@order(0)

@component

public class datasourceaspect

@around("pointcut()")

public object around(proceedingjoinpoint joinpoint) throws throwable finally

}/**

* 資料來源切換,優先方法上的配置,方法上沒有配置,則取類上的配置

** @param joinpoint

*/private void changedbtype(proceedingjoinpoint joinpoint)

// 獲取類上的註解

datasource = joinpoint.gettarget().getclass().getannotation(datasource.class);

if (datasource == null) else

}}

說明:切點中,@annotation匹配方法上的註解,@within匹配類上的註解

資料來源的xml配置,多個資料來源的基本資訊配置是省不掉的,還有就是在配置中向dynamicdatasource注入多個資料來源

然後我們就可以在需要切換資料來源的方法和類上加上註解了 @datasource(type = dbtypeenum.adb)

spring多資料來源配置

前段時間由於公司專案需求,需要多資料來源的支援,苦b折騰了兩天程式猿,話不多說,直接擼碼。classpath jdbc.properties select 1 true select 1 true org.hibernate.dialect.mysqldialect false update tru...

spring 多資料來源配置

以下是我的xml配置,在配置的過程中涉及到不同的包分配不同的資料來源,在這裡用逗號分割就好 當然萬用字元能結局的那是最好了.xmlns xsi xmlns aop xmlns tx xmlns task xmlns context xmlns rabbit xsi schemalocation sp...

Spring 配置單資料來源和多資料來源

如何配置多資料來源?1.spring直接配置所需的bean 事務相關 可選 操作相關 可選 2.springboot做了哪些配置?符合條件時才進行配置。1 spring boot中預設資料來源的發展 spring boot 1.x 預設使用tomcat的datasource。spring boot ...