Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring Cloud、Hystrix和JPA-LazyInitializationException_Spring_Jpa_Spring Boot_Spring Cloud_Hystrix - Fatal编程技术网

Spring Cloud、Hystrix和JPA-LazyInitializationException

Spring Cloud、Hystrix和JPA-LazyInitializationException,spring,jpa,spring-boot,spring-cloud,hystrix,Spring,Jpa,Spring Boot,Spring Cloud,Hystrix,我在尝试将Hystrix集成到现有的Spring引导应用程序时遇到以下问题。我正在使用spring数据引导(jpa存储库)。应用程序的结构非常简单, 我们有资源->服务->存储库 我启用了Hystrix支持,并对其中一个返回实体的服务方法进行了注释,如下所示: @HystrixCommand(fallback="getDealsFallback") public Page<Deal> getDeals(...) { // Get the deals from the Index

我在尝试将Hystrix集成到现有的Spring引导应用程序时遇到以下问题。我正在使用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(...);
}
@HystrixCommand(fallback=“getDealsFallback”)
公共页面getDeals(…){
//从索引服务器获取交易。
返回indexServerRepository.FindDelsby(…);
}
公共页getDealsFallback(…){
//如果IndexServer关闭,则查询数据库。
return dealsRepository.findDealsBy(…);
}
因此,这正如预期的那样工作,当我将实体返回给客户机时,真正的问题就出现了。我正在使用OpenEntityManagerInViewFilter,以便可以序列化模型及其关系。 当我在服务方法中使用@HystrixCommand时,当它尝试序列化时,我会得到一个LazyInitializationException

我知道原因(或者至少我怀疑是什么问题),这是因为Hystrix正在另一个线程中执行 因此,这不是交易的一部分。将Hystrix隔离策略从线程更改为信号量是正确的,因为它是同一个线程,但我知道这不是解决问题的正确方法

所以我的问题是,如何使Hystrix执行线程成为事务的一部分。有什么变通办法我可以申请吗


谢谢

这是一个有点旧的线索,但可能有人也遇到了这个问题。关于这一点,github中存在一个漏洞

原因是,hystrix将在单独的线程中运行,这与前一个事务所在的位置不同。因此,lazy的事务和序列化将无法工作


“线程”也是推荐的执行策略。因此,如果您想同时使用hystrix和transaction,那么应该在两个级别的调用中使用它们。例如,在第一级服务函数中使用事务,在第二级服务函数中使用hystrix并调用第一级事务函数。

将实体返回给客户端是指jsp吗?或者在控制器中?是一个Rest API,所以回答您的问题时,是一个JSP。我认为如果您需要线程上下文(这就是它的用途)。Hystrix配置页面()声明“通常,您应该使用信号量隔离(信号量)的唯一时间是在调用量非常大(每秒数百次,每个实例)的情况下……”这让我很紧张,使用这种策略只是为了让事务正常工作。其他人怎么想?