NHibernate二级缓存性能问题

NHibernate二级缓存性能问题,nhibernate,model-view-controller,Nhibernate,Model View Controller,我正在用NHibernate开发一个MVC应用程序,使用每请求会话模式。大多数情况下,用户只是读取数据,因此我尝试以以下方式使用NHibernate的二级缓存:我已经设置了SysCache,并使所有持久实体都可缓存(cache usage=“nonstrict read write”),在应用程序启动时,我调用从数据库加载所有常用实体,如下所示: var all = Session.QueryOver<T>().Cacheable().List<T>() var all

我正在用NHibernate开发一个MVC应用程序,使用每请求会话模式。大多数情况下,用户只是读取数据,因此我尝试以以下方式使用NHibernate的二级缓存:我已经设置了SysCache,并使所有持久实体都可缓存(cache usage=“nonstrict read write”),在应用程序启动时,我调用从数据库加载所有常用实体,如下所示:

var all = Session.QueryOver<T>().Cacheable().List<T>()
var all=Session.QueryOver().Cacheable().List()

出于评估目的,我跟踪上述调用的执行时间,对于大约50000个结果,第一次调用约为5秒,后续调用缓存查询约为2.5秒。。。。NHibernate Profiler说对数据库的查询只需要不到100毫秒,那么什么需要这么多时间呢?我尝试过切换提供者,但在Velocity和Memcached上得到了类似的结果(如果不是更糟的话)。。。我阅读了几乎所有关于NHibernate及其二级缓存使用的内容,我认为,尽管我可能不完全正确,但在上面的陈述中,发生的是:50000个对象被构造,它们的数据存储在实体和查询缓存中,会话时间戳保存在时间戳缓存中。在i5机器上怎么可能需要5秒钟?即使这是正常的,如何在随后的调用中读取缓存数据需要2.5秒,其间没有任何更改?因为我对NHibernate比较陌生,你们中有谁能帮我找出我做错了什么?任何帮助都将不胜感激…我已经用头撞墙一周了…

你不应该在缓存中放入50000个实体,这否定了拥有数据库的意义,特别是如果你的数据来自SELECT*from表。如果它来自一个非常昂贵的查询,那么缓存成本低于查询成本,并且应该将其放入缓存中


使用查询获取特定数据。然后,查找产生最多查询的页面,并在必要时使用缓存对其进行优化。

感谢您的快速回复。虽然我最近意识到,您所说的确实是使用NH的方式(而且像上面我这样的非特定查询甚至会在NH profiler中触发警报),但如果数据库中的数据很少更改,是否应该只缓存昂贵的查询?此外,我正在努力设计数据访问层,以便只发布特定的查询或具有绑定结果集的查询,但尽管如此,我还是对我引用的语句的巨大成本的原因感兴趣,以便发现我可能遇到的任何缓存问题…对频繁调用的查询使用缓存,并根据更改频率设置过期日期。请扩展@mathieu非常正确的答案-我相信您的假设是正确的:较长的执行时间源于nHib缓存实际上只保存缓存对象的属性及其值,而不是整个对象。对象本身是在每次读取时构造的。这是你的2.5秒。