【问题标题】:Is it a good practice to use the same Hibernate Session over and over一遍又一遍地使用相同的 Hibernate Session 是一种好习惯吗
【发布时间】:2014-11-26 20:28:27
【问题描述】:

我正在开发一个 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 的新手,所以请和平对待我

【问题讨论】:

    标签: java hibernate session javafx


    【解决方案1】:

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

    Hibernate 的一级缓存保存在“会话”中,因此如果您将其保留在用户会话中,它将命中“缓存”对象。

    Hibernate 有二级缓存,你必须配置(如果你想的话)来利用它。第 2 级基本支持以下内容:查询、带有加载和获取的对象、集合/关联,并提供跨 Session、SessionFactories 和 Clusters 的缓存对象。

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

    【讨论】:

    • 在 JavaFX 桌面应用程序中,除了代码本身定义的请求之外,没有真正的请求概念。 (与 Web 应用程序不同,您专门编写代码来为请求提供服务。)那么,关于倒数第二句话,在桌面应用程序中存储会话的上下文是什么?
    【解决方案2】:

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

    反复使用同一个 Hibernate Session 是一种好习惯吗?

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

    在hibernate中通常做的是:

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

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-01
      • 2017-02-15
      • 2016-12-20
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多