Управление сессиями с использованием Hibernate в * многопоточном * Swing-приложении

В настоящее время я работаю над (довольно крупным) моим любимым проектом, приложением Swing, которое по своей природе должно быть многопоточным. Почти все пользовательские взаимодействия могут получать данные с некоторых удаленных серверов через Интернет, поскольку я не контролирую ни эти серверы, ни сам Интернет, поэтому большое время отклика неизбежно. Очевидно, что пользовательский интерфейс Swing не может перерисовывать себя, пока EDT занят, поэтому все вызовы удаленного сервера должны выполняться фоновыми потоками.

Моя проблема:

Данные, извлекаемые фоновыми потоками, «обогащаются» данными из локальной (в памяти) базы данных (удаленный сервер возвращает идентификаторы / ссылки на данные в локальной базе данных). Эти данные позже в конечном итоге передаются в EDT, где они становятся частью модели представления. Некоторые объекты не полностью инициализируются в этот момент (ленивая выборка включена), поэтому пользователь может запустить ленивую выборку, например, прокрутка в JTable. Поскольку сеанс гибернации уже закрыт, это вызовет исключение LazyInitializationException. Я не могу знать, когда пользователь может инициировать отложенную выборку, поэтому создание сеанса по требованию / присоединение отсоединенного объекта здесь не будет работать.

Я «решил» эту проблему:

использование одного (синхронизированного, поскольку экземпляры сеанса не поточно-ориентированного) сеанса для всего приложенияотключение ленивого извлечения полностью

Хотя это работает, производительность приложения сильно пострадала (иногда она была почти непригодна для использования). Замедление в основном вызвано большим количеством объектов, которые теперь выбираются каждым запросом.

В настоящее время я думаю об изменении дизайна приложения на «Session-per-thread» и переносе всех сущностей, извлекаемых не-EDT-потоками, в Session-поток EDT (аналогичноэта публикация на форумах Hibernate).

Примечание: любые проблемы, связанные с обновлениями базы данных, не применяются, поскольку все объекты базы данных доступны только для чтения (справочные данные).

Любые другие идеи о том, как использовать Hibernateс участием ленивая загрузка в этом сценарии?

Ответы на вопрос(3)

Ваш ответ на вопрос