【问题标题】:Is SessionFactory.getCurrentSession() thread safe?SessionFactory.getCurrentSession() 线程安全吗?
【发布时间】:2014-02-26 02:23:59
【问题描述】:

通过SessionFactory.getCurrentSession() 获取 Hibernate 会话是否是线程安全的? 假设我有一个用于整个应用程序的static SessionFactory 对象,并且我的 servlet 有 5 个并发请求。我的 servlet 为每个请求调用方法 Auth.checkLogin(),然后 Auth.checkLogin() 通过静态 factory.getCurrentSession() 获取会话。

在对我的 servlet 的每个请求结束时,transaction.commit() 会在之前获得的 session 上调用。

我的问题是,这是一种线程安全的方法吗?或者我应该做些改变吗?

【问题讨论】:

  • 我点击了赞成标志。

标签: java multithreading hibernate servlets


【解决方案1】:

来自 Hibernate 4.0 SessionFactory

这里的主要合约是创建 Session 实例。 通常 一个应用程序有一个 SessionFactory 实例和线程 服务客户端请求从该工厂获取 Session 实例。

SessionFactory 的内部状态是不可变的。一旦是 创建了这个内部状态设置。这种内部状态包括所有 关于对象/关系映射的元数据。

实现者必须是线程安全的。

那么

通过以下方式获取 Hibernate 会话是否线程安全 SessionFactory.getCurrentSession()?

对于 api 说的话,是的。

【讨论】:

  • 我还将hibernate.current_session_context_class 设置为thread
  • @ClickUpvote 阅读更多here 关于current_session_context_class 和here 的信息
【解决方案2】:

是的。 SessionFactory 是不可变的,因此是线程安全的。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    • 2021-08-03
    • 2010-12-27
    • 2018-06-04
    相关资源
    最近更新 更多