Spring-Cloud,Hystrix和JPA - LazyInitializationException

时间:2015-03-26 22:58:36

标签: 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执行线程成为事务的一部分。我可以申请任何解决方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个有点旧的线索,但也许有人遇到这个问题。 github中有一个issue

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

'THREAD'也是推荐的执行策略。因此,如果您想同时使用hystrix和事务,则应在2级调用中使用它们。比如,在第一级服务功能中,使用事务,在二级服务功能中,使用hystrix并调用第一级事务功能。