seata 求助:mybatisplus多数据源TCC模式 useTCCFence = true时调用服务时出现空指针异常

mv1qrgav  于 3个月前  发布在  其他
关注(0)|答案(9)|浏览(40)
  • I have searched the issues of this repository and believe that this is not a duplicate.

Ⅰ.java.lang.NullPointerException: null

private static DataSource dataSource;
private static TransactionTemplate transactionTemplate; 断点这两个属性都是为null

Ⅱ. Describe what happened

If there is an exception, please attach the exception trace:

Just paste your stack trace here!

Ⅲ. Describe what you expected to happen

Ⅳ. How to reproduce it (as minimally and precisely as possible)

  1. xxx
  2. xxx
  3. xxx

Minimal yet complete reproducer code (or URL to code):

Ⅴ. Anything else we need to know?

Ⅵ. Environment:

  • JDK version(e.g. java -version ):
  • Seata client/server version:
  • Database version:
  • OS(e.g. uname -a ):
  • Others:
rhfm7lfc

rhfm7lfc1#

environment信息补充一下?
另外,不使用TCCfence的时候没问题吗?

ct2axkht

ct2axkht2#

tcc不支持多数据源

xdyibdwo

xdyibdwo3#

是啊,tcc不支持多数据源。 不过可以自己修改源码实现,我们已经实现了该功能

n8ghc7c1

n8ghc7c14#

这个问题也是困扰了我们很久,希望对楼主有帮助

eivgtgni

eivgtgni5#

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

vjhs03f7

vjhs03f76#

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

堆栈发一下吧,我自己在我们内部是实现了对接sharding且用上这个功能的,没有你说的问题。
现在你们的问题是已经解决了?还是和楼主说的一样npe?

sxpgvts3

sxpgvts37#

@YokenLiao It is not recommended to operate multiple data sources in one branch transaction based on TCC best practices, but it is possible to implement dynamic switching of dataSources.

mklgxw1f

mklgxw1f8#

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

堆栈发一下吧,我自己在我们内部是实现了对接sharding且用上这个功能的,没有你说的问题。 现在你们的问题是已经解决了?还是和楼主说的一样npe?

我们没用使用shardingjdbc,而是跟楼主一样的使用了mybatisplus多数据源。 因为shardingjdbc 对外来说只有一个数据源的,通过内部的分片规则去路由的。而mybatisplus对外本身就是多数据源的,是需要通过程序手动去路由数据源,如果不设置就会使用primary的数据源。 若try时指定使用的是ds1(非primary)的数据源, commit或者rollback的时候默认就调用primary数据源,这时程序无法感觉是哪个数据源发起的try,即使知道也是无法手动切换的 因为commit跟rollback都在seata发起的事务里执行的

xmakbtuz

xmakbtuz9#

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

堆栈发一下吧,我自己在我们内部是实现了对接sharding且用上这个功能的,没有你说的问题。 现在你们的问题是已经解决了?还是和楼主说的一样npe?

我们没用使用shardingjdbc,而是跟楼主一样的使用了mybatisplus多数据源。 因为shardingjdbc 对外来说只有一个数据源的,通过内部的分片规则去路由的。而mybatisplus对外本身就是多数据源的,是需要通过程序手动去路由数据源,如果不设置就会使用primary的数据源。 若try时指定使用的是ds1(非primary)的数据源, commit或者rollback的时候默认就调用primary数据源,这时程序无法感觉是哪个数据源发起的try,即使知道也是无法手动切换的 因为commit跟rollback都在seata发起的事务里执行的

二阶段方法切面拦截,将切换的数据源作为参数传递到server,二阶段下发后进切面读取入参切换数据源行不行试试

相关问题