我继承了一个缓慢的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
(包含详细信息)传递到执行线程的好方法?