Всем привет, столкнулся с такой проблемой.
В проекте используется Hibernate и HikariCP(пул соединений), база данных PostgresSQL.
Вообщем во всех объектах используется ленивая загрузка связных данных, но тут возникает проблема с закрытием сесcии.
Т.е получая данные, я не могу написать session.close(); Так как часть связных данных подтянется позже. И я получу исключение:
"org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.slandshow.models.Train.seats, could not initialize proxy - no Session"
В интернетах пишут, что можно использовать FetchType.EAGER - но мне этот подход не подходит по соображениям производительности.
Т.к сессии не закрываются, единственное, что остается это увеличить пул соединений на несколько тысяч. Но это тоже как-то не айс.
Код web-приложения должен обрабатывать запрос в пределах 500 миллисекунд. Сомневаюсь, что у вас настолько нагруженный сервис, что удержание открытой сессии в течении этого времени приводит к исчерпанию пула соединений с СУБД.
Сергей Горностаев, сервис не нагруженный, но на каждое пользовательское действие по отображению данных, а пользователей чел 30, создается соединение которое висит, за день их под 10000 тыс штук получается.
Смотрю через: select count(*) from pg_stat_activity;
Все соединения в состоянии idle
По пробовал поменять в настройка PostgresSQL : idle_in_transaction_session_timeout = 60000
Но соединения, как висели так и висят
Можно использовать DTO и несколько методов его заполнения: одни для объекта без вложенных данных, другие для объекта с вложенными данными ( или их частью).
Все равно вы будете сериализовать объект - на этом этапе уже должно быть понятно его содержание.