项目场景:
在工作中很多情况需要跨数据库进行数据操作,自己总结的经验希望对各位有所帮助
问题描述
总结了几个问题
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