在實際開發(fā)中秘遏,我們一個項目可能會用到多個數(shù)據(jù)庫邦危,通常一個數(shù)據(jù)庫對應(yīng)一個數(shù)據(jù)源倦蚪。在springboot中配置多個數(shù)據(jù)源陵且,推薦dynamic-datasource-spring-boot-starter依賴組件慕购,它適用于讀寫分離沪悲,一主多從的環(huán)境殿如。如果是更復(fù)雜的多數(shù)據(jù)源環(huán)境涉馁,建議使用sharding-jdbc?烤送。
首先介紹pom依賴:
可以看到帮坚,除了原來的ssm配置叶沛,只增加了一個dynamic-datasource-spring-boot-starter依賴灰署。
然后介紹項目配置溉箕,配置過程分為以下五步:
1 禁止默認的druid數(shù)據(jù)源配置
2 在配置文件中配置多個數(shù)據(jù)源
3 寫業(yè)務(wù)代碼肴茄。
4 測試
5 查看druid監(jiān)控工具
第一步
springboot有很多默認的自動化配置寡痰,數(shù)據(jù)源就是其中一個拦坠。要配置多數(shù)據(jù)源需要把默認的單數(shù)據(jù)源配置禁止掉springboot自帶的DataSourceAutoConfiguration入热。加入druid依賴后勺良,使用的是DruidDataSourceAutoConfigure尚困,因為它會默認會讀取application.properties文件的spring.datasource.*屬性并自動配置單數(shù)據(jù)源尾组。
需要在啟動類上加個注解就可以禁止掉:
@SpringBootApplication(exclude= {DruidDataSourceAutoConfigure.class})
第二步
在配置文件中配置多個數(shù)據(jù)庫的數(shù)據(jù)源讳侨,此處簡單配置一主三從四個數(shù)據(jù)庫的數(shù)據(jù)源跨跨。
第三步
開始寫業(yè)務(wù)代碼勇婴,首先在啟動類配置mapper接口的掃描:
@MapperScan("many.datasource.mp.mapper")
然后是實體類:
mapper接口:
service類:
注意,@DS("slave")注解放在類上面础米,說明整個類的方法默認使用三個從庫數(shù)據(jù)源操作數(shù)據(jù)庫屁桑,第一個insertUser方法在方法上面加了@DS("master")注解蘑斧,表示此方法使用主庫數(shù)據(jù)源竖瘾,凡是在方法上注明的會覆蓋默認的准浴,第四個方法selectUser3上面并沒有注明,會隨機使用三個從庫中的默認一個今野。
注意条霜,@DS注解建議使用在service層宰睡,不建議使用在mapper層拆内!
接下來是controller類:
可以看到控制器并沒有什么特別之處。只是單純的調(diào)用。
第四步
接下來進行測試抹沪,首先啟動項目刻肄,可以看到數(shù)據(jù)源加載:
打開postman,測試幾個接口融欧,首先測試新增:
控制臺:
數(shù)據(jù)庫:
接下來在三個從庫分別加入一條數(shù)據(jù):
執(zhí)行selectUser3接口會發(fā)現(xiàn)查詢結(jié)果會在三個從庫之間輪訓(xùn)敏弃,這也是實現(xiàn)了負載均衡。
第五步
查看druid監(jiān)控工具
上面就是springboot整合多數(shù)據(jù)源的一個簡單版本麦到。
讀寫分離
上面的例子中,每個對數(shù)據(jù)庫的操作方法可以任意選擇數(shù)據(jù)源逝薪,下面看一個實現(xiàn)讀寫分離的例子隅要,首先創(chuàng)建項目:
上面的依賴中,前面都是熟悉的董济,項目使用mybatisplus和sharding-jdbc-core這兩個第三方starter實現(xiàn)讀寫分離步清,關(guān)于mybatis plus,可以查看本系列教程的第045篇虏肾。
接下來看配置廓啊,
上面簡單配置了一主二從三個數(shù)據(jù)源,其中?round_robin 表示負載均衡使用循環(huán)的策略封豪。
接下來看一下啟動類:
啟動類要取消默認數(shù)據(jù)源的配置谴轮,并加上mapper的掃描注解。其它基本沒變吹埠。
這樣配置就基本完成了第步,使用starter就是這么簡單,接下來看業(yè)務(wù)代碼缘琅,首先是實體類:
然后是mapper:
mapper實現(xiàn)了一個新增和查詢功能粘都,測試讀寫分離足夠了。接下來看service代碼:
可以看到讀寫分離的service與上面多數(shù)據(jù)源的不同刷袍,這只是個普通的service翩隧,沒有多余的配置和注解,這是因為讀和寫的操作已經(jīng)自動實現(xiàn)了呻纹,只往主庫寫堆生,在讀庫讀。
最后看一下controller類:
可以看到也沒有什么不同雷酪。
接下來啟動項目測試:
可以看到只往主庫中寫數(shù)據(jù)了淑仆,從庫中并沒有。
注意:客戶端實現(xiàn)的讀寫分離太闺,都沒有實現(xiàn)主從同步糯景,需要配置數(shù)據(jù)庫本身的主從同步使用!!s盎础W钭 !
接下來往從庫中手動加一條數(shù)據(jù):
然后調(diào)用查詢接口:
自己手動多執(zhí)行幾次怠惶,可以發(fā)現(xiàn)實現(xiàn)了負載均衡涨缚,策略是輪訓(xùn)。
代碼地址:?https://gitee.com/blueses/spring-boot-demo