Hibernate не закрывает бездействующий сеанс - PullRequest
1 голос
/ 21 марта 2019

Я не могу убить сессию в состоянии ожидания на postgres 10 Это вызвало очень большую проблему во время некоторого теста и заполнения соединения postgres. После закрытия соединения сеанс находится в состоянии ожидания и не закрывается enter image description here

У меня одна и та же проблема в локальной и производственной базе данных. Я пытался разрешить его в локальной среде (именно поэтому я прикрепил местный скриншот), но ничего не работает.

Я установил для idle_in_transaction_session_timeout значение 1 с, но сеанс в режиме ожидания, а не в транзакции Я установил connection.pool_size в конфигурации hibernate на 2, но соединение не является частью пула

Как эффективно уничтожить бездействующий сеанс, избегая блокировки базы данных.

Это моя конфигурация гибернации

    <property name="hibernate.enable_lazy_load_no_trans">true</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="show_sql">false</property>
    <property name="format_sql">false</property>
    <property name="use_sql_comments">false</property>
    <property name="hibernate.generate_statistics">false</property>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="current_session_context_class">thread</property>

это пример открытия и закрытия сессии

    public UserEntity getUserById(String id) {
    Session session = null;
    UserEntity user = null;
    try {
        session =  Connection.getInstance().openSession();
        String s = id.toLowerCase();
        user = session.get(UserEntity.class, s);
    } catch (Exception e) {
        Logging.log(e);
    } finally {
        session.close();
    }
    return user;
}

И это метод getIstance

public static SessionFactory sessionFactory = null;

private static AppConfig appConfig =  (AppConfig) ContextLoader.getCurrentWebApplicationContext().getBean("app");

private Connection(){ }

public static SessionFactory getInstance() {
    try {
        if (sessionFactory == null) {
            sessionFactory = new Configuration().configure(appConfig.getDb().getFile()).buildSessionFactory();
        }
        return sessionFactory;
    }catch (Throwable ex) {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

Версия БД: postgresql 10.5 Hibernate версия: 5.3.7 Версия Tomcat: 8.0.33

ОБНОВЛЕНИЕ - РАЗРЕШЕНО

<property name="hibernate.dbcp.maxIdle">4</property>
...