【问题标题】:Hibernate sessions REST performance/securityHibernate 会话 REST 性能/安全性
【发布时间】:2016-06-01 22:53:37
【问题描述】:

简介

我正在构建一个使用 Hibernate 和 Jersey 的 REST Web 服务,以向移动客户端提供 JSON 数据。我有一个关于如何在内部处理 Hibernate 会话的一般性问题。我想讨论两种不同的方法(A,B)。

方法

答。有人告诉我应该为每个用户打开一个新会话,让它为用户的整个网络会话打开,最后在用户停止使用我的网络服务后关闭这个会话。有人告诉我,从安全性和性能的角度来看,这将是一种更好的方法。

虽然我已经读过:

“会话无关紧要”Common REST Mistakes, 6. 

B. 现在我正在使用 SessionFactory 在我的服务类中打开一个会话,并在查询完成后立即关闭这个会话。我的网络服务只使用 GET 和 POST 请求。没有 PUT 或 DELETE。我不需要任何用户身份验证(如 oAuth)来请求数据。因此我认为没有必要使用 Transactions

这是我的服务类的示例:

Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction(); 

Query query = session.createQuery("from RoomEntity");   
@SuppressWarnings("unchecked")
List<RoomEntity> list = (List<RoomEntity>) query.list();

session.close();

问题

很高兴听到您对我以下问题的看法:

  1. 最佳做法是什么?您遵循哪种方法?
  2. 您如何看待性能问题?
  3. 您如何看待安全问题?

【问题讨论】:

    标签: java performance hibernate session rest


    【解决方案1】:

    我不喜欢 A。它让你的服务有状态,你怎么知道用户何时完成了你的服务?

    Hibernate 和网络应用程序的一般规则是每个 http 请求使用一个会话。大多数 REST 服务 GET 请求都非常简单地映射到单个数据库查询,正如您在 B 中演示的那样,所以这是要走的路。

    【讨论】:

      【解决方案2】:

      每个请求应该有一个会话,它称为 Onit of Work 模式。那里有支持这种实现的框架,其中一个是 Spring(我建议使用它,而不是尝试重新发明轮子)。你可以阅读它here

      【讨论】:

        【解决方案3】:

        我也有类似的情况。基于JBOSS documentation,泽西岛内每个请求的会话似乎是有效的。您可以在 Jersey 中使用 ContainerRequestFilter 的实现来打开休眠会话,然后在 ContainerResponseFilter 的实现中通过提交关闭它。

        【讨论】:

          猜你喜欢
          • 2012-10-07
          • 2020-04-16
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-20
          • 1970-01-01
          相关资源
          最近更新 更多