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

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


为了评估起见,我跟踪了上述调用的执行时间,大约有50000个结果,这是第一次〜5秒,而对缓存查询的任何后续调用都是〜2.5秒...。NHibernate Profiler说,对数据库的查询花费的时间更少超过100毫秒,那么需要那么多时间?我尝试了切换提供程序,但使用Velocity和Memcached获得了类似的结果(即使不是更糟)……我读到了几乎所有有关NHibernate及其对二级缓存的使用的信息,尽管我可能并不完全正确,但我认为在上面的语句中,发生的事情是:构造了50000个对象,并将它们的数据存储在实体和查询缓存中,并将会话时间戳保存在时间戳缓存中。在i5机器上怎么可能需要5秒钟?即使那是正常的情况,在随后的调用中如何仅读取缓存的数据又花费2.5秒而之间没有变化?由于我是NHibernate的新手,所以你们中的任何人都可以帮助我弄清楚我做错了什么吗?任何帮助将不胜感激...我已经将头撞墙了一周了...

最佳答案

您不应该在缓存中放入50000个实体,这否定了拥有数据库的意义,特别是如果您的数据来自SELECT * FROM TABLE。如果来自真正昂贵的查询,则缓存成本小于查询成本,因此应将其放入缓存中。

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

08-06 02:07