spring 動態資料來源配置以及相關問題

2021-07-02 14:09:24 字數 1710 閱讀 5169

專案中要求讀寫分離,在spring中做到讀寫分離,很簡單的想到在配置檔案中設定兩個資料來源,乙個datesource(只寫),乙個datesourceread(唯讀)。但是要根據上下文動態切換資料來源,還需要增加兩個幫助類。

類1 contextholder

主要功能是幫助切換資料來源,其中threadlocal保證執行緒中的一致性,不受其他執行緒影響。

public class contextholder 

public static string getcustomertype()

public static void clearcustomertype()

}

類2 mydatasource

自定義資料來源,繼承abstractroutingdatasource,實現determinecurrentlookupkey()方法。

public class mydatasource extends abstractroutingdatasource 

}

配置檔案中這樣配置:

classpath*:mybatis/sqlmap/manual/*.xml

這樣在做資料庫操作的時候,讀的時候只需要設定,寫的時候還是預設資料來源就ok了。

contextholder.setcustomertype(contextholder.data_source_read);

1、一直有乙個疑問,既然xml配置中bean是啟動的時候就載入到記憶體當中,且全域性只有乙個物件,那麼在執行時設定contextholder引數可以修改資料來源呢?

2、為什麼在配置了事務的時候(@transaction),是改變不了資料來源的呢?

對於第乙個問題,在設定了contextholder之後,再開始使用sqlsessionfactory進行資料庫相關操作,這時候sqlsessionfactory會找到真正的datasource

public void setdatasource(datasource datasource)  else 

}

而mydatesource繼承自abstractroutingdatasource,類中精華部分在這裡

/**

* retrieve the current target datasource. determines the

* , performs

* a lookup in the map,

* falls back to the specified

* if necessary.

* @see #determinecurrentlookupkey()

*/protected datasource determinetargetdatasource()

if (datasource == null)

return datasource;

}

他會呼叫determinecurrentlookupkey()方法選擇合適的資料來源的key,而這個方法在我們的mydatasource類中已經實現,且將向下文需要的

contextholder設定了進去。

這樣就實現了執行時的動態資料庫的選擇。

spring 動態資料來源

spring 可以設定動態資料來源,這樣可以對程式來透明的支援切換操作不同的資料庫。這篇文章寫得非常不錯。測試通過,並準備在專案中使用這個方法。還有幾個問題希望大家給點意見 首先說一下我的需求 資料庫結構都是一樣,但具體有多少個資料庫不確定 視具體使用者而定 使用者操作那個資料庫要根據登入的時候進行...

spring動態資料來源

在實際的業務場景中,我們經常會遇到需要動態配置資料來源的情況,只需要修改配置,就能增加新的資料來源的接入,而不需要修改程式 通過動態資料來源技術可以實現這個目標。具體的 參照 示例專案 通常在用springboot開發資料庫應用時,我們會在配置檔案中配置好資料來源,程式中指定資料來源進行資料庫操作。...

spring 配置資料來源

spring配置資料來源包括 1.由jdbc驅動程式定義的資料來源 2.由jndi查詢的資料來源 3.連線池的資料來源 我們這裡介紹資料來源連線池的配置 xmlns xsi xsi schemalocation spring beans 2.5.xsd 這四個屬性是必須配置的。同時還有另外的一些配置...