Hibernate何时以及如何刷新其会话?

时间:2015-02-07 15:23:47

标签: hibernate grails

我不明白hibernate session.flush()是如何工作的。在grails中,如果被自动调用则调用它,它如何确定何时是冲洗的最佳时间?如果用户在会话结束时执行了需要数千个查询的操作,该怎么办?乘以数千名用户。

你能分享哪些东西解释了grails中的hibernate会话?感谢

1 个答案:

答案 0 :(得分:2)

Grails遵循处理Hibernate会话和自动刷新的“Open session in view”模式。

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

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

如果您关心的是绩效,那么只有一种真正的方法可以确定最佳方法。使用各种方法描述您的应用程序,并查看适合您的应用程序。

Grails documentation中有关此主题的一些其他信息:

  

Hibernate比直接JDBC调用甚至其他函数更有用的功能   框架是当你调用save或delete时它没有   必须在那时执行任何SQL操作。过冬   批量编写SQL语句并经常执行它们   在刷新和关闭会话时请求结束时。这个   通常由Grails自动为您完成,Grails管理您的   Hibernate会话。

     

Hibernate只在可能的情况下缓存数据库更新   当知道需要刷新时,或者当更改时,推动更改   flush以编程方式触发。 Hibernate的一个常见情况   将自缓存以来执行查询时刷新缓存更新   信息可能包含在查询结果中。但只要   你正在进行非冲突的保存,更新和删除   批量直到会话被刷新。这可能很重要   对执行大量数据库写入的应用程序的性能提升。

     

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