在springboot+dynamic-datasource+mybatis项目中多数据源常见问题及解决办法

检查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(“”)如果发现注解并不生效,此时可能性有以下几种:

  1. @DS注解使用的接口中,一步一步查找是不是使用了@Transactional(rollbackFor = Exception.class)注解,此时注意,应该使用@DSTransactional注解来回滚事务
  2. 检查配置的数据源值是否和@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;
    }

}

这样就会自动根据数据库类型进行分页查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值