搜索
toc
Latest Post

记一次 Redis OOM

解决 Clash 开启后 Google Play 无法更新下载软件

树莓派4b从 SD 卡迁移至 SSD

网站记录

230513-顾村公园

Spring Data Jpa 多数据源选择无效

❤ Jun Xie

有个项目用的 Spring Data Jpa ,里面需要多数据源来做分库,正常流程是拦截器拿出用户信息,然后把分库信息设置到 ThreadLocal 里,后面使用就没问题了。但最近遇到个问题,在 Service 层重新分库信息居然没用,依然会使用首次获取到的数据库连接。

项目里其实有类似的用发,同一个线程重新设置了分库信息也依然可以正确选中,直接使用 JdbcTemplate 查询也没问题,So,到底什么问题呢?

还是对这套东西不熟悉,OpenEntityManagerInViewInterceptor 已经将 Hibernate Session 绑定到线程里了,怎么选都在这个事务里,Spring Boot 在启动的时候会给一个关于 spring.jpa.open-in-view 配置的警告,可以把这个功能关掉。

解决方法

  1. 关掉 spring.jpa.open-in-view 配置,但会影响懒加载功能。
  2. 比较粗暴,在一个新线程里执行,比如 Spring 的 @Async。
  3. 参考这里的方法,解绑然后重新绑定 EntityManager。

这个问题其实搞了几天,对 Spring Data Jpa 不熟,不知道 Spring 有这个东西,就想着在哪里保存了数据库连接信息,怎么把它解绑掉,自己实现了上面的方法3,后面再搜搜资料发现这是一个还算普遍的问题,前面搜索的关键信息不对。还有就是要注意 Spring 启动时候的日志,查查那些警告是什么意思。

http://www.kailing.pub/article/index/arcid/266.html
Relate Post

Eureka常用操作

Maven项目配置了repository未生效

Rust 开发环境配置

spring transaction不生效的一些原因

Xshell双击选中单词会中断tail -f持续跟踪日志