如何在一个请求中处理许多jpa实体(OpenSessionInView)

时间:2015-03-05 10:38:26

标签: java spring hibernate spring-data-jpa

我们使用OpenSessionInView模式的经典Spring应用程序。

有时我们希望在一个请求中处理多个(=未知大小)实体。 这是众所周知的OutOfMemory问题。

很久以前,我们创建函数(hack)来切换当前特定方法的hibernate会话。

public void proceedOnePerson(int id) {
    recalculateVAT(id);
}

public void proceedAllPerson(int[] ids) {
    for(int id : ids) {
        switchToAnotherHibernateSesion();
        recalculateVAT(id); //OutOfMemory
        closeAnotherSessionAndSwitchBackToOriginSession();
    }
}

在Spring,Spring Boot或Spring Data中是否有标准解决方案?

  • Session.clear不合适,因为其他方法对其他实体有副作用。
  • Session.evict也不合适,因为方法recalculateVAT的开发者不知道这个函数是否会在批处理中使用。容易出错。
  • 春天批次太重了。我们不想为用户编写一种方法,也不想为批处理编写第二种方法。

1 个答案:

答案 0 :(得分:0)

我认为你在视图模式中尝试使用Open Session,这种模式的性能非常差,而视图层是准备管理hibernate或其他jpa实现异常的。为什么不使用带有服务层的spring数据将pojos对象转换为dto以供视图层使用?

当您使用多个查询获取大量数据信息时,使用此模式时,

OutOfMemory是典型的,如果您不使用此模式,则此问题将会消失。