Spring配置動態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法
前言
最近因?yàn)楣ぷ鞯男枰罱ǖ囊粋€項(xiàng)目需要實(shí)現(xiàn)數(shù)據(jù)源的讀寫分離,在這里將代碼進(jìn)行分享,有需要的朋友們可以參考學(xué)習(xí)。
首先是配置數(shù)據(jù)源
<!--讀數(shù)據(jù)源配置--> <bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close"> //配置省略 </bean> <!--寫數(shù)據(jù)源配置--> <bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"destroy-method="close"> //配置省略 </bean> <!-- 動態(tài)數(shù)據(jù)源 --> <bean id = "dataSource" class="com.potato.common.bean.DynamicDataSource" > <!-- 已配置的數(shù)據(jù)源 --> <property name="targetDataSources"> <map> <entry key="READ" value-ref="readDataSource"/> <entry key="WRITE" value-ref="writeDataSource"/> </map> </property> <!-- 默認(rèn)的數(shù)據(jù)源 --> <property name="defaultTargetDataSource" ref="writeDataSource"/> </bean>
數(shù)據(jù)源是如何切換的呢?通過動態(tài)數(shù)據(jù)源的配置我們知道原來是通過key來進(jìn)行切換,這里要使用到org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
,我們可以編寫自己的動態(tài)數(shù)據(jù)源類DynamicDataSource
來繼承它。
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getType(); } }
還需要一個存放key的地方DataSourceContextHolder
為保證切換時線程安全我們使用ThreadLocal
來保存我們的key。
public class DataSourceContextHolder { private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class); public static final String DATA_SOURCE_WRITE = "WRITE"; public static final String DATA_SOURCE_READ = "READ"; // 線程本地環(huán)境 private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); // 設(shè)置數(shù)據(jù)源類型 public static void setType(String type) { if(LOGGER.isDebugEnabled()) LOGGER.debug("==============切換數(shù)據(jù)源,類型:"+type+"================"); contextHolder.set(type); } // 獲取數(shù)據(jù)源類型 public static String getType() { return (contextHolder.get()); } // 清除數(shù)據(jù)源類型 public static void clearType() { contextHolder.remove(); } }
好了,我們可以通過操作DataSourceContextHolder
來實(shí)現(xiàn)數(shù)據(jù)源動態(tài)的切換了。小伙伴們可能會說了,難道每次調(diào)用方法都要手動選擇要切換的數(shù)據(jù)源類型?當(dāng)然不是啦,Spring AOP登場。
@Component @Aspect public class DynamicDataSourceAspect { @Pointcut("execution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ") public void readMethodPointcut() {} @Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))") public void writeMethodPointcut() {} @Before("readMethodPointcut()") public void switchReadDataSource(){ //System.out.println("============切換到讀數(shù)據(jù)源==========="); DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ); } @Before("writeMethodPointcut()") public void switchWriteDataSource(){ //System.out.println("=============切換到寫數(shù)據(jù)源=========="); DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE); } }
總結(jié)
好啦,以上就是這篇文章的全部內(nèi)容了,在訪問Mapper(本項(xiàng)目使用的是MyBatis啦,相當(dāng)于是DAO)中查詢方法時會切換到讀數(shù)據(jù)源,增、刪、改方法會切換到寫數(shù)據(jù)源。希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
spring boot加載freemarker模板路徑的方法
這篇文章主要介紹了spring boot加載freemarker模板路徑的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11解決使用stream將list轉(zhuǎn)map時,key重復(fù)導(dǎo)致報錯的問題
這篇文章主要介紹了解決使用stream將list轉(zhuǎn)map時,key重復(fù)導(dǎo)致報錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06java equals和=,==的區(qū)別詳細(xì)介紹
這篇文章主要介紹了java equals和=,==的區(qū)別,學(xué)習(xí)Java的朋友對equals 和== 這個概念開始使用的時候會有疑問,很難辨別如何正確使用,這里幫大家詳細(xì)講解該知識點(diǎn),希望大家能掌握,有需要的小伙伴可以參考下2016-10-10eclipse/intellij idea 查看java源碼和注釋方法
下面小編就為大家?guī)硪黄猠clipse/intellij idea 查看java源碼和注釋方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05IDEA 中創(chuàng)建并部署 JavaWeb 程序的方法步驟(圖文)
本文主要介紹了IDEA 中創(chuàng)建并部署 JavaWeb 程序的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02SpringBoot整合Redis實(shí)現(xiàn)刷票過濾功能
隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)站或APP的用戶流量增加,也衍生出了一些惡意刷量等問題,給數(shù)據(jù)分析及運(yùn)營帶來極大的困難,所以本文使用SpringBoot和Redis實(shí)現(xiàn)一個刷票過濾功能,需要的可以參考一下2023-06-06