@ShardingDS 注解使用有那些限制

Blade 未结 1 62
tongyi
tongyi 剑侠 2025-07-04 16:50

我们有个业务逻辑比较复杂,既要读取主库的数据又要读取分库分表的数据,在控制器类方法中加这个注解导致数据库无法正确访问?我加到Service类中,访问数据库报 Unknown exception: class java.lang.Long cannot be cast to class java.lang.String (java.lang.Long and java.lang.String are in module java.base of loader 'bootstrap')

1条回答
  • 2025-07-04 16:54

    多种数据库调用放到一个接口里,如果切换sharding,要按照这种形式来,就不能再用注解了

    //业务内部方法
    
    try {
        DynamicDataSourceContextHolder.push("sharding");
    
        //这里写你的逻辑
    
    } catch (Exception exception) {
        throw new Exception(exception.getMessage());
    } finally {
        DynamicDataSourceContextHolder.poll();
    }


    作者追问:2025-07-04 18:27

    用这个方式可以处理,但是主方法加了注解事务@Transactional后,这个方法就不生效了

    回答: 2025-07-04 22:14

    开启了事务后,spring事务管理器会保证在事务下整个线程后续拿到的都是同一个connection。所以就会失效了。

    如果你要这种情况下支持事务,需要接入seata使用,但是建议你去重新设计业务模型,避免这种情况发生。

    0 讨论(0)
提交回复