将Hibernate会话传递给线程

时间:2019-04-25 23:18:05

标签: spring hibernate hibernate-session

我继承了一个缓慢的Spring / Hibernate项目。我将其隔离为以前的开发人员喜欢使用的一些装饰器。

客户希望此修复程序很快,因此重写是不可能的。我尝试在装饰的实体上使用CompletableFuture,但是我一直收到“无法延迟加载Collection-No Session”

下面是我正在使用的伪代码(正在工作,但是我不能在家工作)

Class TaskDao {
   private String description;
   private Long<TaskDetails> details; //Lazily loaded
   // mutators
}

执行代码

// TaskModel is what gets passed back to the UI.  Generally it's a 1:1 to TaskDao, only serializable
Long<TaskModel> tasks = taskService.getAllTasks();
for(TaskModel task : tasks){
    decorateDetails1(task);  // these are SLOW
    decorateDetails2(task);  // these are SLOW
    decorateDetails3(task);  // these are SLOW
}

我试图通过将其更新为以下内容来加快速度:

for(TaskModel task : tasks){
   CompletableFuture.allOf(
    CompletableFuture.runAsync(()->decorateDetails1(task)),
    CompletableFuture.runAsync(()->decorateDetails2(task)),
    CompletableFuture.runAsync(()->decorateDetails3(task))
   );
}

但是,一旦在主线程之外执行会话,会话就会丢失。我知道这个问题,但我不确定如何解决。

我尝试使用Springs OpenEntityManagerInView类,但是仍然遇到问题。

是否存在将原始Session(包含详细信息)传递到执行线程的好方法?

0 个答案:

没有答案