Очень сложная проблема — «Не удалось открыть сеанс гибернации для транзакции; вложенное исключение org.hibernate .Исключение SessionException: сессия закрыта!»

#spring #hibernate

#весна #спящий режим

Вопрос:

У нас уже несколько месяцев возникает проблема, которая нас убивает, и нам приходится отказываться от tomcat — первоначально это происходило каждые пару месяцев, но с увеличением числа пользователей это происходит почти ежедневно. Несколько человек просмотрели его и до сих пор не смогли понять, почему мы получаем это после того, как приложение работает в течение нескольких часов. Мы используем шаблон просмотра открытого сеанса гибернации, в котором у нас открыт сеанс гибернации для жизненного цикла запроса / ответа. В настоящее время, примерно после нескольких часов загрузки в рабочей среде, мы начинаем получать эту ошибку, и пользователи начинают видеть проблемы, и нам приходится отказываться от tomcat:

«Не удалось открыть сеанс гибернации для транзакции; вложенным исключением является org.hibernate.Исключение SessionException: сессия закрыта!»

 We're using hibernate 4.3.11.final, spring 4.3.7.RELEASE, and HikariCP version 3.1.0
  

Вот параметры, которые мы передаем в пул Hikari.

     <property name="minimumIdle" value="${database.pool.minIdle}" />
    <property name="maximumPoolSize" value="50" />
    <property name="maxLifetime" value="180000" />                              
    <property name="leakDetectionThreshold" value="180000" />           
  

К сожалению, это приложение довольно старое и использует несколько разных «методов» для доступа к данным — часть кода использует jdbctemplate, некоторые используют hibernate с объектами.

Моя последняя мысль заключается в том, что, возможно, Hikari закрывает соединение между моментом, когда hibernate открывает его в начале цикла запроса / ответа, и концом, когда он закрывается, но это все равно, что найти иголку в стоге сена.

Любая помощь, даже указывающая направление, будет оценена, спасибо

Комментарии:

1. возможно ли, что подключения к БД превышают maximumPoolSize, и поэтому Hickari вообще не может открыть новое соединение или закрыть существующий сеанс?

2. Как вы получаете сеанс?

3. Мы используем OpenSessionInViewFilter: <filter> <filter-name>configOpenSessionFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support . OpenSessionInViewFilter</filter-class> <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>SessionFactory</param-value> </init-param> </filter> <сопоставление фильтров> <filter-name>configOpenSessionFilter-name> <url-шаблон> /*</url-шаблон> <диспетчер> ЗАПРОС </ диспетчер> </ filter-mapping>

4. Также я добавлю, что когда это происходит, мы всегда проверяем память и процессор, и они обычно действительно хороши, например, объем памяти составляет около 1/2, а объем процессора очень низкий.