Spring-Cloud、Hystrix 和 JPA - LazyInitializationException

标签 spring jpa spring-boot spring-cloud hystrix

我在尝试将 Hystrix 集成到现有的 Spring Boot 应用程序中时遇到以下问题。我正在使用带有 Spring 数据的引导(jpa 存储库)。该应用程序的结构非常简单,
我们有资源 -> 服务 -> 存储库。

我启用了 Hystrix 支持并注释了返回实体的服务方法之一,如下所示:

@HystrixCommand(fallback="getDealsFallback")
public Page<Deal> getDeals(...) {
  // Get the deals from the Index Server.
  return indexServerRepository.findDealsBy(...);
}

public Page<Deal> getDealsFallback(...) {
  // If IndexServer is down, query the DB.
  return dealsRepository.findDealsBy(...);
}

所以这按预期工作,当我将实体返回给客户端时,真正的问题实际上存在。我正在使用 OpenEntityManagerInViewFilter 所以我可以用它的关系序列化我的模型。
当我在我的服务方法中使用 @HystrixCommand 时,当它尝试序列化时我得到一个 LazyInitializatioException。

我知道原因(或者至少我怀疑是什么问题),并且是因为 Hystrix 在另一个线程中执行
所以不是交易的一部分。将 Hystrix 隔离策略从 THREAD 更改为 SEMAPHORE,因为它是同一个线程,所以可以正常工作,但我知道这不是解决问题的正确方法。

所以我的问题是,如何让 Hystrix 执行线程成为事务的一部分。有什么我可以申请的解决方法吗?

谢谢!

最佳答案

这是一个有点旧的线程,但也许有人也遇到了这个问题。有一个issue在github上关于这个。

原因是,hystrix 会在单独的线程中运行,这与之前的事务所在的位置不同。所以懒惰的事务和序列化将不起作用。

“线程”也是推荐的执行策略。所以如果你想同时使用 hystrix 和事务,你应该在 2 级调用中使用它们。比如,在一级服务函数中,使用事务,在二级服务函数中,使用 hystrix 并调用一级事务函数。

关于Spring-Cloud、Hystrix 和 JPA - LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29290382/

相关文章:

java - Spring Boot 和 Mockito 验证始终为 true

java - Hibernate ORM 提供程序、Netbeans 7、Glassfish(视频)

java - Hibernate:Criteria Query child objects (associations) by Entity (not Id)

java - 添加项目 A (Spring 4.2.x) 作为项目 B (Spring Boot 2、Spring 5) 的依赖项

java - Log4j 不会将所有日志保存到文件中

java - 无需测试和 ng 服务的 angular-cli 简单配置

java - 为什么 spring task scheduler 等待上一个任务完成?

spring - 如何使用 spring 集成在电子邮件正文中附加文件

java - @Primary 与带有 @Qualifier 注释的 @Autowired 之间的区别

java - 如何使用JPA为Hashmap的值设置列名?