專案中要求讀寫分離,在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 這四個屬性是必須配置的。同時還有另外的一些配置...