如果一個數據庫數據量過大,考慮到分庫分表和讀寫分離需要動態的切換到相應的數據庫進行相關操作,這樣就會有多個數據源。對於一個數據源的配置在Spring Boot數據訪問之數據源自動配置 - 池塘里洗澡的鴨子 - 博客園 (cnblogs.com)和Spring Boot數據訪問之Druid連接池的配置 - 池塘里洗澡的鴨子 - 博客園 (cnblogs.com)中均有涉及,不同之處在於數據庫連接池不一樣:前者有Spring Boot提供,后者使用第三方提供的數據庫連接池。
那么對於多數據源的數據庫應該如何配置呢?首先看最簡單的多數據源配置:
測試案例:pojo之類的就不截圖了,僅截圖測試類如下:
測試結果:
實際上兩個數據庫中的數據並不一樣:
但是測試時訪問的都是master數據庫。那slave數據庫根本無法訪問到,實際生產中肯定在某些時候一定訪問slave,這么解決呢?動態切換數據源。
Spring內置了一個AbstractRoutingDataSource幫助完成動態數據源切換。下面先看這個抽象類:
閱讀源碼可知其中一個核心的方法setTargetDataSourcese,它需要一個Map。這個Map存儲的就是我們配置的多個數據源的鍵值對。其切換數據源的運作方式就是在連接數據庫之前執行determineCurrentLookupKey方法返回的數據作為key去targetDataSources中查找相應的值,找到就用此DataSource獲取數據庫鏈接。
此類是抽象類,如果使用話,最有效的方式就是創建其的一個子類並實現獲取key的方法determineCurrentLookupKey——即寫我們自己的規則獲取相應數據源。
以上面的測試案例示例:
重寫determineCurrentLookupKey:
配置類中增加主數據源配置:
修改測試案例:
測試結果:
實現了數據源的動態切換。