Я унаследовал проект Spring / Hibernate, который слишком медленный.Я выделил его некоторым декораторам, которые любил использовать предыдущий разработчик.
Клиент хочет, чтобы это исправление было быстрым, поэтому о переписывании не может быть и речи.Я пытался использовать CompletableFuture на украшенных объектах, но я продолжаю получать сообщение «Невозможно лениво загрузить коллекцию - без сеанса»
Ниже приведен псевдокод, с которым я работаю (это на работе, и я не могу работать дома)
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
(который содержит детали) в исполняющие потоки?