Hibernate不关闭空闲会话

svdrlsy4  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(176)

我不能杀死会话在空闲状态下的postgres 10这导致了一个非常大的问题,在一些测试和填充postgres连接拉。关闭连接后,会话处于空闲状态,不会关闭x1c 0d1x
我在本地和生产数据库中遇到了同样的问题。我试图在本地环境中解决它(这就是为什么我附上了本地截图),但没有任何效果。
我将idle_in_transaction_session_timeout设置为1 s,但会话处于空闲状态,事务中为非空闲状态我将hibernate配置中的connection.pool_size设置为2,但连接不是池的一部分
如何有效地销毁空闲会话,避免锁定数据库?
这是我的 hibernate 配置

<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>
dgiusagp

dgiusagp1#

应使用此选项

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

相关问题