Hibernate 命名查询数据库或缓存?

Posted

技术标签:

【中文标题】Hibernate 命名查询数据库或缓存?【英文标题】:Hibernate named query DB or cache? 【发布时间】:2012-03-18 01:04:40 【问题描述】:

我们在项目中使用 Hibernate。我的问题是关于命名查询。有人可以指导我如何通过 Hibernate 处理命名查询。如果 Hibernate 被配置为使用 1 级缓存,它是否也会从缓存中返回命名查询的结果,还是总是访问数据库?

【问题讨论】:

【参考方案1】:

一级缓存是休眠会话。除非在极少数情况下使用无状态会话,否则默认情况下会有一级缓存。查询结果从不缓存在一级缓存中。我认为您的意思是“二级缓存”。

命名查询的处理方式与关于缓存的未命名查询完全相同。

查询可以缓存也可以不缓存。如果它们被缓存,则可以避免到数据库的往返。无论是否缓存,如果返回二级缓存中实体的实例,查询将返回ID,然后实体本身将从二级缓存中加载。

请参阅Hibernate 2nd level cache in a Grails app 和the reference documentation 了解更多信息。

【讨论】:

感谢尼泽特。抱歉,是的,我的意思是二级缓存。我将尝试解释更多。我有一个实体,我的命名查询基于两个参数选择实体。那么这种情况下hibernate会从缓存中选择还是从数据库中选择呢? 它从不从缓存中选择。它进入数据库,如果查询是可缓存的,它会将其结果存储在查询缓存中。如果您再次使用相同的参数执行相同的查询,结果将从查询缓存中加载。 感谢您的帮助尼泽。 query_cache 应该设置为 true 以便为查询实现缓存,否则它每次都会进入数据库。

以上是关于Hibernate 命名查询数据库或缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate之二级缓存

Hibernate一级缓存二级缓存以及查询缓存的关系

hibernate 一级缓存,二级缓存,查询缓存

NHibernate 命名查询和二级缓存

Hibernate查询连接池二级缓存

Hibernate缓存