最近公司一個項目需要連接多個數據庫(A和B)操作,根據不同的業務模塊查詢不同的數據庫,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,項目后台用的是SpringMVC+Mybatis+MySQL架構,折騰了一兩天算是搞定了,在這里記錄過改造過程。
使用場景
多數據源的使用的場景一般有:
- 主從數據庫切換
- 讀寫分離
- 兼容舊庫
實現原理
Spring2.x的版本中采用Proxy模式,就是在方案中實現一個虛擬的數據源,並且用它來封裝數據源選擇邏輯,這樣就可以有效地將數據源選擇邏輯從Client中分離出來。Client提供選擇所需的上下文,由虛擬的DynamicDataSource根據Client提供的上下文來實現數據源的選擇。
具體的實現是虛擬的DynamicDataSource僅需繼承AbstractRoutingDataSource實現determineCurrentLookupKey(),該方法返回需要使用的DataSource的key值,然后根據這個key從resolvedDataSources這個map里取出對應的DataSource,如果找不到則用默認的resolvedDefaultDataSource。
詳細實現過程
1:修改jdbc.properties的配置文件
#A 數據源A庫
jdbc.a.driverClassName=com.mysql.jdbc.Driver
jdbc.a.url=jdbc:mysql://localhost:3306/exam_zhaosq?useUnicode=true&characterEncoding=utf-8
jdbc.a.username=root
jdbc.a.password=root
#B 數據源B庫
jdbc.b.driverClassName=com.mysql.jdbc.Driver
jdbc.b.url=jdbc:mysql://localhost:3306/myshop?useUnicode=true&characterEncoding=utf-8
jdbc.b.username=root
jdbc.b.password=root
2:修改spring-mybatis.xml的配置文件 配置文件里需要配置多個數據源,改造后主要配置如
2.添加動態數據源管理類
DynamicDataSource類繼承AbstractRoutingDataSource,實現determineCurrentLookupKey()方法。
3. 數據源切換類
CustomerContextHolder類可以實現數據源A和B的切換,數據源標識保存在線程變量中,避免多線程操作數據源時互相干擾。
4. 使用多數據源代碼
下面是Controller層代碼,需要查詢B數據源,查詢完成后切換為默認數據源A,具體代碼如下:
當進入customer方法的時候,會先從數據庫B中的表進行查詢數據,查詢完成后,會切換到默認的數據庫A,然后再從數據庫A中的表查詢數據,這樣就達到了在一個Web項目中,根據不用的模塊和業務需求,實現多個數據庫存儲數據和它們之間的切換了。
上述四步操作完成后即可實現SpringMVC+Mybatis配置多個數據源(庫)並切換,有問題歡迎留言指教!