Closed zhangke199338 closed 3 years ago
关闭seata自动代理,手动代理DynamicDataSource内部的多个Datasource并放入DynamicDataSource,DynamicDataSource无需代理,只需要暴露成一个bean即可
关闭seata自动代理,手动代理DynamicDataSource内部的多个Datasource并放入DynamicDataSource,DynamicDataSource无需代理,只需要暴露成一个bean即可
@a364176773 可能我描述的不够清晰 ,数据源由请求头决定,然后会传递到各个微服务,用HandlerInterceptorAdapter拦截并调用DynamicDataSourceContextHolder.push(dbkey) 来指定数据源,dao层接口都不会有@DS注解,全靠请求头信息来路由,所以当发生回滚时,会一直报Branch session rollback failed and try again later xid = 192.168.104.26:8091:18147060501060324 branchId = 18147060501060326 dynamic-datasource can not find primary datasource,因为DynamicDataSourceContextHolder.peek()为空就直接拿配置文件指定的spring.datasource.dynamic.primary,由于目前这个没有配置所以默认拿了mater,而这个ds是不存在的,即使存在也有可能拿到与请求头不一致的datasource,因为请求头告诉的数据源不一定和spring.datasource.dynamic.primary相等
老哥,这问题现在解决了没有啊?我也遇到了
我这边项目目前是拦截HttpServletRequest获取header的dbkey 后通过DynamicDataSourceContextHolder.push(dbkey)来指定数据源。异常触发回滚消息是否能设置自定义参数,然后rm client 收到此自定义参数后 往DynamicDataSourceContextHolder存入dbkey 以找到指定数据源