问题
最近在整合ShardingSphere JDBC和Spring Boot的时候遇到一个问题,当ORM框架使用JPA时,读写分离会失效,查询仍然走主库并不会走从库!同样的配置使用Mybatis就没有任何问题。
在查阅各种资料后,初步确定未JPA事务问题
ShardingSphere负载均衡算法
我当前使用的版本是5.1.2,该版本的负载均衡算法还比较简单,我配置的是ROUND_ROBIN
轮询算法,但负载均衡算法都有一个隐藏逻辑:
开启事务时,查询也会走主库,并不会走从库
这样做很好理解,事务没有提交,事务内的查询能查到未提交数据,符合整体逻辑,如果不走主库,必然查不到
JPA事务
通过Debug可发现,SpringBoot默认的JpaRepository
实现类为SimpleJpaRepository
查看其源码可以发现,默认开启只读事务
当我们调用JpaRepository
内存在的方法时,实际走的是SimpleJpaRepository