Session.list()方法在hibernate中使用会话缓存吗?

问题描述:

Hibernate缓存从Session.list()获得的结果吗? 我相信session.get()或session.load()方法将结果缓存在内存中,但session.list()不会产生大量可能导致内存问题的记录,但在获取和加载它只会生成单个对象。Session.list()方法在hibernate中使用会话缓存吗?

事实上,如果你不小心,它确实会产生内存问题。
但你会在之前达到另一个限制:性能...

所有Hibernate在事务内部加载的内容都存储在上下文中。每次尝试加载对象时,如果它尚不存在,则首先检查上下文。在上下文中存储大量实体会带来巨大的性能下降(由于复杂的原因,我在这里不会详述)。

如果Hibernate没有这样做,它会返回同一个实体的许多实例,并带有重复的数据。如果您更新了它们,它将无法知道要将哪些数据保存到数据库中。

拇指规则:如果您不再需要它们,尽可能快地保持您的交易空间不变,或者evict()上下文中的实体尽快通过。


PS:这不叫“缓存”;该会话是正确执行其ORM任务所必需的上下文。有二级缓存库,但它是完全不同的事情。

+0

谢谢纪尧姆。其实我指的是一级缓存。现在可以请你解释我的缓存从db返回对象。 – Rohit

+0

是的,这个“第一级缓存”被称为“上下文”以避免与简单缓存混淆。上下文做了很多事情。当你说“缓存从数据库返回对象”时,你想知道什么?我不明白这个问题。 –