項目場景:
在工作中很多情況需要跨數據庫進行數據操作,自己總結的經驗希望對各位有所幫助
問題描述
總結了幾個問題
1.識別不到mapper
2.識別不到xml
3.找不到數據源
原因分析:
1.配置文件編寫導致識別mapper
2.配置類編寫建的格式有問題
3.命名問題大小寫
解決方案:
1.檢查application配置文件的掃描是否開啟路徑是否正確
2.檢查配置文件的拼寫縮進,application的拼寫縮進特別嚴格建議自己寫不要粘貼復制
3.命名大小寫或者多字母少字母導致找不到
配置相關代碼:
在config新建幾個數據配置文件用于訪問和切換數據源
DatasourceConfig類
這里是通過
ConfigurationProperties注解獲取映射你application的數據源名稱這里不要寫錯一定注意
然后交給bean管理;
下面的
dynamicDataSource是調用spring自帶的一個的抽象類用于切換數據源使用的
@Bean("db1") @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource dataSourceOne(){return DataSourceBuilder.create().build(); } @Bean("db2") @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource dataSourceTwo(){return DataSourceBuilder.create().build(); } @Bean(name = "dynamicDataSource") @Primary public DataSource dynamicDataSource(@Qualifier("db1") DataSource db1,@Qualifier("db2") DataSource db2){DynamicDataSource dynamicDataSource = new DynamicDataSource();dynamicDataSource.setDefaultTargetDataSource(db1);HashMap<Object, Object> dsMap = new HashMap<>();dsMap.put("db1",db1);dsMap.put("db2",db2);dynamicDataSource.setTargetDataSources(dsMap);return dynamicDataSource; } @Bean public PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource){return new DataSourceTransactionManager(dynamicDataSource); }
DynamicDataSource類
determineCurrentLookupKey用來指定數據源這里獲取到傳過來的名稱聯合DataSourceUtil進行指定使用哪個數據源
@Slf4j public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {log.info("動態數據源獲取--{}", DataSourceUtil.getDB());return DataSourceUtil.getDB();} }
public class DataSourceUtil {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDB(String dbType){contextHolder.set(dbType);}public static String getDB(){return contextHolder.get();}public static void clearDB(){contextHolder.remove();} }
最后的 這里定義一個事務管理器PlatformTransactionManager 通過
@Qualifier注解將切換數據源的配置類進行注入
然后是調用?DataSourceUtil
DataSourceUtil
類是基于 ThreadLocal
實現的,用于動態管理數據源的標識,整體代碼簡潔且符合常見的動態數據源切換需求,使用?ThreadLocal
?實現線程上下文綁定,用于存儲和管理當前線程的數據源標識,setDB就是寫入設置綁定數據源標識,這里的名字必須和配置文件的名字對應上基本就可以實現切換數據原了
這里是配置文件的寫法注意縮寫和依賴包導入這里我就不多贅述了
spring:datasource:db1:driver-class-name: dm.jdbc.driver.DmDriverjdbc-url: jdbc:dm://123456789:5524/CCS_HBusername: CCSpassword: CCS.db2:enabled: truedriver-class-name: oracle.jdbc.OracleDriverjdbc-url: jdbc:oracle:thin:@//123456789:1521/hbfspdbusername: userpassword: user