当前位置: 首页 > 面试题库 >

如何防止Hibernate刷新列表?

姜华翰
2023-03-14
问题内容

我有一个简单的hibernate查询,例如:

from MyEntity where name = ?

没什么花哨的,但是它在一个相当大的事务中被多次调用(持续一秒钟,可能会加载数十个或数百个实体)。Profiler显示很多时间花在:

org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1240)
org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)

换句话说-在运行实际查询之前刷新会更改。

我能以某种方式完全阻止Hibernate进行刷新吗?

如果没有,我该怎么做才能使其更快?


问题答案:

默认情况下,hibernate在会话期间发出查询之前刷新(FlushMode.AUTO),并消耗大量CPU时间。如果您有一个会话,其中许多查询和更新交替运行,那将特别痛苦。

如果查询可能选择回退在当前会话期间插入/更新/删除的数据,则需要进行这些刷新。这 可能
也是即使您没有修改在当前事务中任何东西,但使用的事务隔离级别一样读未提交的情况。

假设您不希望进行未提交的读取等,我知道有两种解决方法:

  1. 在进行 任何修改 之前, 请选择会话期间需要的所有内容(例如,重新排序,以便在进行任何修改之前发出所有查询)。
  2. 如果您确定要选择在此会话中未修改的数据,则可以将刷新模式显式设置为不会触发刷新的内容,如下所示:
    Query query = session.getNamedQuery(SOME_QUERY_NAME);
    

    query.setFlushMode(FlushMode.COMMIT);



 类似资料:
  • 问题内容: 保存hibernate对象时,hibernate中是否有设置可以 忽略 属性的 空值 ? 注意 在我的情况下,我正在通过杰克逊将JSON反序列化为Hibernate Pojo。 JSON仅包含Pojo的某些字段。如果保存Pojo,则不在JSON中的字段在Pojo中为null,然后hibernate更新它们。 我遇到了这个问题,但这不是100%的解决方案。 http://docs.jbo

  • 场景是:您有一个有效期较长的刷新令牌和一个有效期限较短的访问令牌。 设置:有一个客户端、应用程序服务器和身份验证服务器。 客户端存储访问令牌。 应用程序服务器存储刷新令牌。 身份验证服务器分发刷新访问令牌。 其中一个优点是被盗的访问令牌只能在其有效的时间内使用。 假设黑客窃取了有效期为30分钟的访问令牌。当黑客在30分钟后用有效但过期的被盗访问令牌发出请求时,应用服务器用刷新令牌刷新它,从而黑客获

  • 问题内容: 我有一个简单的表单,可将​​文本提交到SQL表。问题在于,用户提交文本后,他们可以刷新页面,并且无需再次填写表单即可再次提交数据。提交文本后,我可以将用户重定向到另一个页面,但是我希望用户停留在同一页面上。 我记得读过一些有关为每个用户提供唯一的会话ID并将其与另一个值进行比较的信息,这些值解决了我遇到的问题,但我忘记了它在哪里。 问题答案: 使用发布/重定向/获取模式。 在我的网站上

  • 在我的项目中,我有两页,第一页用于输入数据,第二页用于向用户显示数据。刷新结果页时,数据将被复制。我试图解决这个问题,但我不熟悉PRG模式。如果用户刷新结果页,我希望防止重复。

  • 本文向大家介绍php防止恶意刷新与刷票的方法,包括了php防止恶意刷新与刷票的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php防止恶意刷新与刷票的方法。分享给大家供大家参考。具体实现方法如下: 一般来说,恶意刷新就是不停的去刷新提交页面,导致出现大量无效数据,下面我们来总结一下php 防止恶意刷新页面方法总结。 防止恶意刷页面的原理是: 要求在页面间传递一个验证字符串, 在生成页