【问题标题】:Is Hibernate's session thread safe?Hibernate 的会话线程安全吗?
【发布时间】:2010-09-23 11:24:07
【问题描述】:

我需要知道,Hibernate 的会话是否是线程安全的。但很明显,每个线程都附加了一个新会话以供执行。但我的问题是,如果在一个线程中我更新了某个实体的某些值,那么在同一时间执行期间会反映在其他线程中吗?

我的问题是,当我从两个线程依次触发更新时,值会正确更新,但是当我几乎完全触发更新时,它会失败。

例如。 表的当前阶段。

  ID      NAME      MARKS
------- --------- --------
  1       John       54

我正在尝试做以下事情:

Student student = session.load(Student.class, 1);
student.setMarks(student.getMarks() + 1);
session.update(student);
session.close();

当我尝试在循环 10 中运行上述代码时,表“student”中的“marks”值会正确更新,即该值会更新为正确的 64。

但是当我尝试在线程环境中运行相同的代码时,结果很糟糕。

【问题讨论】:

    标签: java hibernate session thread-safety hibernate-session


    【解决方案1】:

    实现者并不是线程安全的。相反,每个线程/事务都应该从 SessionFactory 获取自己的实例。

    即使考虑到这一点,您的行为可能仍然不是您所期望的,因为交易开始发挥作用。您必须设置正确的transaction isolation level。请参阅configuration guidehibernate.connection.isolation 属性。

    【讨论】:

    • 。你能告诉我如何在休眠中实现隔离级别,在上面添加我正在使用事务将数据提交到数据库中。
    • 此 JavaDoc 在您链接到的 Hibernate 文档中被引用但未链接到:docs.oracle.com/javase/8/docs/api/java/sql/Connection.html 可能对其他人有所帮助
    【解决方案2】:

    休眠会话和线程不混合。

    您不应该同时使用来自多个线程的会话,我建议您只使用来自单个线程的会话。数据库会话实现甚至不需要是安全的。

    当您开始在多个线程中执行操作时,您还必须考虑事务会发生什么。事务与当前线程相关联。这很快变得令人兴奋,您进入了实施者尚未测试其产品的领域。

    到头来,生命太短暂,不能迷失在那片沼泽中。

    【讨论】:

      【解决方案3】:

      Hibernate 会话不是线程安全的。使用 TheadLocal 类为每个线程创建会话:-

       private static ThreadLocal<Session> threadSafeSession = new ThreadLocal<Session>() {
          protected Session initialValue(){
          return sf.openSession();
            }
          };
      

      在您的方法中为每个线程获取会话:-

      Session session = threadSafeSession.get();
      

      【讨论】:

        【解决方案4】:

        这取决于您如何创建会话。

        在休眠中可以通过两种方式创建会话。

        1. getCurrentSession()

        是的。它提供线程安全性,因为如果会话不存在,它将确保为每个线程创建一个会话。事务和自动会话关闭附加于此。

        1. openSession()

        它不是线程安全的。开发者需要手动管理事务和会话刷新和关闭操作。

        【讨论】:

          猜你喜欢
          • 2011-10-14
          • 1970-01-01
          • 2012-05-29
          • 2013-12-07
          • 1970-01-01
          • 2015-04-11
          • 1970-01-01
          • 2011-11-06
          • 1970-01-01
          相关资源
          最近更新 更多