Gerenciamento de sessão usando o Hibernate em um aplicativo * multi-thread * Swing

Atualmente estou trabalhando em um projeto de estimação meu (bastante grande), um aplicativo Swing que por sua própria natureza precisa ser multi-threaded. Quase todas as interações de usuários podem buscar dados de alguns servidores remotos pela internet, já que eu não controle esses servidores nem a própria internet, tempos de resposta longos são inevitáveis. Uma UI Swing obviamente não pode repintar a si mesma enquanto o EDT está ocupado, então todas as chamadas do servidor remoto precisam ser executadas por thread (s) de segundo plano.

Meu problema:

Os dados buscados pelos encadeamentos em segundo plano são "enriquecidos" com dados de um banco de dados local (na memória) (o servidor remoto retorna IDs / referências a dados no banco de dados local). Esses dados posteriormente são passados ​​para o EDT, onde ele se torna parte do modelo de exibição. Algumas entidades não são completamente inicializadas neste momento (com a busca tardia ativada), portanto, o usuário pode acionar a busca tardia, por exemplo, rolando em um JTable. Como a sessão de hibernação já está fechada, isso acionará uma LazyInitializationException. Não sei quando a busca tardia pode ser acionada pelo usuário, portanto, criar uma sessão sob demanda / anexar o objeto desanexado não funcionará aqui.

Eu resolvi este problema:

usando uma única sessão (sincronizada, já que as instâncias da sessão não são seguras para threads) para todo o aplicativodesabilitando a busca preguiçosa completamente

Enquanto isso funciona, o desempenho do aplicativo sofreu muito (às vezes, quase inutilizável). A lentidão é causada principalmente pelo grande número de objetos que agora são buscados por cada consulta.

No momento, estou pensando em alterar o design do aplicativo para 'Session-per-thread' e migrar todas as entidades buscadas por threads não-EDT para a sessão do segmento EDT (semelhante aesta postagem nos fóruns do Hibernate).

Nota: Qualquer problema relacionado às atualizações do banco de dados não se aplica, pois todas as entidades do banco de dados são somente leitura (dados de referência).

Quaisquer outras idéias sobre como usar o Hibernatecom carregamento lento neste cenário?

questionAnswers(3)

yourAnswerToTheQuestion