Mybatis 动态切换数据源

本文介绍当数据库采用分库策略时,MyBatis查询必须切换数据库的原因及解决方法。通过自定义DBContextHolder类实现数据库类型的动态切换,避免查询时出现无法确定目标数据源的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当数据库中采用了分库的策略(即数据库中有多个数据库),Mybatis查询时,一定要切换数据库,否则就会报Cannot determine target DataSource for lookup key [null] 错误,即找不到对应的数据库

附上切换数据库的类
public class DBContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

public static void setDBType(String dbType) {
contextHolder.set(dbType);
}

public static String getDBType() {
return contextHolder.get();
}

public static void clearDBType() {
contextHolder.remove();
}
}

使用时,DBContextHolder.setDBType(target_db);
Spring MVC 结合 MyBatis 动态切换数据源时,如果遇到`databaseId`无效的情况,通常是因为以下几个原因: 1. **配置文件问题**:检查`applicationContext.xml`或Spring Boot的配置文件中`DataSource`和`SqlSessionFactoryBean`的配置是否正确。确保每个数据库的数据源都有对应的`databaseId`,并且该ID与`dataSource-ref`属性匹配。 ```xml <bean id="dynamicDataSource" class="com.baomidou.mybatisplus.datasource.DynamicDataSource"> <property name="dataSources"> <!-- 数据源配置 --> <map key-type="java.lang.String"> <entry value-ref="dataSource1" key="db1"/> <entry value-ref="dataSource2" key="db2"/> <!-- 添加更多数据源配置 --> </map> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="${databaseId}_dataSource" /> <!-- ${databaseId} 应替换为实际的数据库ID --> ... </bean> ``` 2. **环境变量或配置占位符**:如果你正在使用配置占位符`${databaseId}`,请确认它已经被正确的值所替换。例如,在Spring Boot应用中,可以使用`@Value`注解从环境变量读取: ```java @Configuration public class AppConfig { @Value("${spring.datasource.db1.url}") private String db1Url; // 其他数据库配置... } ``` 3. **MyBatis XML映射文件**:确保Mapper接口中的SQL语句使用的`@Select`, `@Insert`, `@Update`或`@Delete`等注解有正确的`databaseId`前缀,例如`#{databaseId}.your_sql_here`。 4. **异常处理**:检查日志记录,看看是否有关于`databaseId`未找到的具体错误信息,这有助于定位问题所在。 如果以上步骤都正确,还是无法解决问题,可能需要检查数据源的实际连接状态、`databaseId`的命名规范以及是否有多余的配置冲突。另外,确认你是否在使用MyBatis分片查询或多租户模式,因为这些场景对`databaseId`的管理会更复杂一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值