一遍又一遍地使用相同的Hibernate会话是一个好习惯

时间:2014-10-01 21:18:53

标签: java hibernate session javafx

我正在开发一个JavaFX Hibernate桌面应用程序。我配置了我的应用程序,以便从应用程序运行到关闭时使用相同的会话。 我就这样做了:

public static Session getCurrentSession() {
    if (sessionFactory != null) {
        Session session = sessionFactory.getCurrentSession();
        if (session != null) {
            return sessionFactory.getCurrentSession();
        } else {
            session = sessionFactory.openSession();
            session.beginTransaction();
            return session;
        }
    }
    return null;
}

当用户关闭应用程序时,我运行第二个关闭会话和SessionFactory的方法。

public static void closeConnections() {
    if (sessionFactory != null) {
        if (sessionFactory.getCurrentSession().isOpen()) {
            sessionFactory.getCurrentSession().close();
        }
        sessionFactory.close();
    }
}

我是Hibernate的新人,所以和我一起好心的PEACE

2 个答案:

答案 0 :(得分:4)

Hibernate会话应被视为“单一工作单元”。一个或多个事务可以存在于会话中。在大多数情况下,最佳做法是session-per-request。在处理请求开始时打开一个会话,最后将其关闭。

Hibernate的第一级缓存在“Session”中保留,因此如果你在用户会话中保留它,它将会点击“缓存”对象。

Hibernate具有二级缓存,您必须配置(如果需要)才能利用。第二级基本上支持以下内容:查询,带有加载和获取的对象,以及集合/关联,并在Sessions,SessionFactories和Clusters之间提供缓存对象。

您没有为每个应用程序使用一个会话,您正在使用“当前会话”概念,该概念会打开会话并将其存储在上下文中。如果您不关闭会话,它将保留在那里。

答案 1 :(得分:2)

好的,对于你的基本问题:

一遍又一遍地使用相同的Hibernate会话是一个好习惯吗?

答案是否定的,会话对象不应该长时间保持打开状态,因为它们通常不是线程安全的,应该根据需要创建和销毁它们。

通常在休眠中完成的是:

您打开会话(基本上是数据库连接),执行事务,然后关闭连接(关闭会话)。换句话说,您可以查看其他帖子的类比:

What is the difference between a session and a transaction in JPA 2.0?

希望有所帮助