【问题标题】:When and how does Hibernate flush its session?Hibernate 何时以及如何刷新其会话?
【发布时间】:2015-02-07 15:23:46
【问题描述】:

我不明白休眠session.flush() 是如何工作的。在 grails 中,如果自动调用它什么时候调用它,它如何决定何时是刷新的最佳时间?如果用户做了一些需要数千次查询才能在会话结束时运行的操作怎么办?将其乘以数千名用户。

您可以分享任何解释 grails 中休眠会话的内容吗?谢谢

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    Grails 遵循“在视图中打开会话”模式来处理 Hibernate 会话和自动刷新。

    在您的示例中,如果您没有在会话上显式调用.flush() 或在修改数据时使用flush: true,它实际上会在启动会话的线程结束时刷新用户会话的所有查询(通常在在基于 Web 的 Grails 应用程序中结束 HTTP 请求)。

    根据您的应用程序,定期刷新会话可能是有意义的。同样,这在很大程度上取决于您的应用程序以及单个用户请求会影响多少数据。刷新过于频繁也会影响性能。

    如果您关心的是性能,那么只有一种方法可以确定最佳方法。使用各种方法分析您的应用程序,看看哪种方法适合您的应用程序。

    Grails documentation 中找到有关此主题的一些附加信息:

    Hibernate 对直接 JDBC 调用甚至其他的一个有用的特性 框架是,当您调用保存或删除时,它不会 必须在该点执行任何 SQL 操作。休眠 批量处理 SQL 语句并尽可能晚地执行它们,通常是 在刷新和关闭会话时请求结束。这 通常由 Grails 自动为您完成,它管理您的 休眠会话。

    Hibernate 在可能的情况下缓存数据库更新,只是实际上 当它知道需要刷新时推送更改,或者当 刷新以编程方式触发。 Hibernate 的一种常见情况 将刷新缓存的更新是在执行查询时,因为缓存 信息可能包含在查询结果中。但只要 你正在做非冲突的保存、更新和删除,它们将是 批处理,直到会话被刷新。这可能是一个重要的 执行大量数据库写入的应用程序的性能提升。

    请注意,刷新与提交事务不同。如果 您的操作是在事务的上下文中执行的,刷新 将执行 SQL 更新,但数据库会将更改保存在其 事务队列,并且仅在事务完成时才完成更新 提交。

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2019-03-12
      • 2019-03-26
      相关资源
      最近更新 更多