Передача Hibernate-сессии в потоки - PullRequest
0 голосов
/ 26 апреля 2019

Я унаследовал проект 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 (который содержит детали) в исполняющие потоки?

...