2

我有一些类具有该对象独有的属性,例如对于 User 类,属性 Username 永远不应重复。

NHibernate 似乎不支持通过唯一键加载对象,然后以与 Load() 或 Get() 相同的方式缓存该对象。我这样说对吗?

如果我是,那么我将不得不通过可能沿着 LoadByUniqueIndex(lambda property, object key) 行的扩展方法来扮演我自己的角色。

4

1 回答 1

1

是的,你是对的,除了 id 之外,NH 不会直接从缓存中获取实体。请注意,除了 id 之外的所有内容都可能发生变化,需要在数据库中查找。

缓存时要小心。“过早的缓存是万恶之源”之类的。说真的,如果您不确定是否会遇到明显的性能问题,请不要编写自己的缓存。

  • 编写将实体作为参数传递的代码,以避免多次加载同一实体。
  • 避免使用比会话更长的缓存。如果您不通知所有更改,您将拥有过时的数据。
  • 避免使用静态缓存,而是使用线程静态。这避免了会话之间共享数据,这会破坏事务隔离。
  • 如果您确实需要,请使用二级缓存。

如果您考虑拥有一个与应用程序运行一样长的静态缓存,我可以告诉您,您最好完全避免它。如果付出合理的努力,它将无法正常工作。

于 2009-05-27T09:25:07.510 回答