【问题标题】:Am I handling Hibernate Sessions correctly?我是否正确处理休眠会话?
【发布时间】:2021-10-29 07:41:23
【问题描述】:

我正在努力将使用单个Session 实例变量的代码库转换为线程安全环境,该变量最初是使用getCurrentSession() 获得的,用于所有数据库通信。我理解为什么这是一个线程安全的风险。为了使代码库线程安全,我删除了实例变量,并为每个“工作单元”打开和关闭了一个会话。示例:

private void updateEntity(DataEntity dataEntity)
{
    Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
    Transaction transaction = session.beginTransaction();
    try
    {
        session.update(dataEntity);
        transaction.commit();
    }
    catch (RuntimeException e)
    {
        transaction.rollback();
    }
    finally
    {
        session.close();
    }
}

我的理解是getCurrentSession()获取的一个session在事务提交后会自动关闭。我也通过调试证明了这一点。这是使用getCurrentSession() 的正确方法吗?这个线程安全吗?

【问题讨论】:

    标签: java hibernate session


    【解决方案1】:

    您需要会话以及与该会话关联的每个实体的线程安全。

    例如,如果您使用线程 X 中的会话来加载实体并在线程 Y 中使用该实体,那么它将不是线程安全的。 原因是实体可能具有对会话的引用。例如,它可能有一个惰性集合,需要点击会话进行初始化。由于初始化可能发生在线程 Y 中,因此您有效地使用了来自两个线程的会话。

    【讨论】:

    • 让每个实体“线程安全”是一种设计实现还是您可以利用 hibernate 为您做的事情?
    • 如果实体 A 和 B 与会话相关联,则您无法从不同的线程访问它们。因此,即使它们是线程安全的,限制也存在于与 Session 关联的整个实体图上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2013-04-30
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多