【发布时间】:2011-09-21 13:02:55
【问题描述】:
我对通过休眠缓存教程时发现的语句有疑问。
Statement1:-一级缓存始终与Session对象关联。 Hibernate 默认使用这个缓存。
问题1:-
由于此缓存默认保存来自会话方法(如加载、获取等)的所有结果。由于保存所有对象,这不会是主要的内存问题吗?
问题2:-
我们是否需要默认启用此缓存或其那里?如果需要,我可以禁用一级缓存吗?如果是怎么办?
以下问题适用于一级和二级缓存
问题3:-
如果我从缓存中获取相同的对象(例如,我在同一个会话中两次使用 customerid 1 加载对象客户)从缓存返回的两个对象将具有来自缓存中对象的不同引用。 对吗?因为如果我更新客户对象中的某些字段,它不应该反映在缓存中,除非调用 save/update 方法。
问题4:-
根据我的理解,如果我们尝试从 id 1 第二次从该缓存中获取客户对象,即使在两者之间进行了更新,它也会返回相同的旧对象。 我们如何确保它是否已更新它从数据库中读取,否则从缓存中读取? 我想我们可以使用像 EHCache 之类的类的读写缓存策略
问题 5:- 关于查询缓存
我读了这个声明:-查询中的更新经常发生。因此,对于查询缓存,需要两个缓存区域。
用于存储结果。(仅缓存标识符值和值类型的结果)。 用于存储最新的更新。
我认为“查询中的更新经常发生”意味着在这里我们通常会更改一些参数值,例如 select * from customer where custid=? 所以id 将针对不同的客户 ID 进行更改。因此查询缓存将保留每个查询(连同参数)和每个查询返回的结果。
对吗?但不确定为什么我们需要两个缓存区域来进行查询缓存?
【问题讨论】:
标签: hibernate