NHibernate缓存唯一索引?
问题描述:
我有几个类有一个属性是唯一的对象,例如用户类的属性用户名永远不应该重复。NHibernate缓存唯一索引?
NHibernate似乎不支持通过唯一键加载对象,然后以与Load()或Get()相同的方式对其进行高速缓存。我说得对吗?
如果我那么我只需要通过LoadByUniqueIndex(lambda属性,对象键)行的扩展方法来扮演我自己的角色。
答
是的,你是对的,NH不直接从缓存中获取实体,除了id之外的任何东西。请注意,除id之外的所有内容都可能会发生变化,需要在数据库中查找。
缓存时要小心。 “过早缓存是所有邪恶的根源”或其他。严重的是,如果您不确定是否存在明显的性能问题,请不要编写自己的缓存。
- 编写将实体作为参数传递的代码,以避免多次加载同一个实体。
- 避免寿命长于会话的高速缓存。如果您没有通知所有更改,您将会有陈旧的数据。
- 避免静态缓存,而是使用线程静态。这避免了在会话之间共享数据,这会破坏事务隔离。
- 如果您真的需要它,请使用二级缓存。
如果您考虑拥有一个静态缓存,只要应用程序运行,我就可以告诉您,您最好避免它。它不会以合理的努力正常工作。
好的,谢谢Stefan,我现在暂缓。至少我肯定知道高速缓存现在如何工作。 – 2009-05-27 09:57:42