在springboot+dynamic-datasource+mybatis项目中多数据源常见问题及解决办法
摘要:针对多数据源配置中的常见问题提供了解决方案:(1)Oracle字符集问题,需添加orai18n.jar依赖;(2)@DS注解失效原因,包括事务注解冲突和数据源名称不一致;(3)分页失效问题,需移除PaginationInnerInterceptor中的DbType设置。修改后的MyBatisPlus配置应自动适应不同数据库类型的分页查询。这些解决方案针对MySQL和Oracle双数据源场景,
·
检查pom.xml是否正常引入依赖,当前以存在mysql及oracle库的场景为例:
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--oracle驱动-->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
一:提示错误:java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
org.springframework.jdbc.UncategorizedSQLException:
Error attempting to get column 'NAME' from result set. Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK ;
uncategorized SQLException; SQL state [99999]; error code [17056]; 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK;
nested exception is java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar):
问题原因:其实异常信息里面已经提示了缺少orai18n.jar
解决办法:在pom.xml增加依赖
<dependency>
<groupId>cn.easyproject</groupId>
<artifactId>orai18n</artifactId>
<version>12.1.0.2.0</version>
</dependency>
2:mybatisPlus中,提供了切换数据源的注解@DS(“”)如果发现注解并不生效,此时可能性有以下几种:
- @DS注解使用的接口中,一步一步查找是不是使用了@Transactional(rollbackFor = Exception.class)注解,此时注意,应该使用@DSTransactional注解来回滚事务
- 检查配置的数据源值是否和@DS(“value”)的value一致,如果不一致也是没办法切换的。
3:分页不生效
原因:MySQL的limit再Oracle中不能使用,Oracle中使用的是ROWNUM,所以分页会提示sql错误。
此时找到mybatisplus中分页配置,找到一下代码,这两个同时配置也不会生效,此时需要把数据库类型参数去掉:
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.ORACLE));
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
修改后:
@Configuration
@MapperScan(value = "com.demo.mapper")
public class MyBatisConfig {
/**
* 来源官网:https://baomidou.com/pages/2976a3/#spring
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//引入分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
//注释掉这项
// paginationInnerInterceptor.setDbType(DbType.ORACLE);
paginationInnerInterceptor.setMaxLimit(-1L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
这样就会自动根据数据库类型进行分页查询

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)