NHibernate二级缓存性能问题

我正在使用NHibernate使用每个请求模式的会话开发一个MVC应用程序.大多数时候用户只是读取数据,因此我试图以下列方式使用NHibernate的二级缓存:我设置了SysCache并使所有持久性实体都可以缓存(缓存使用率=“非严格读写”) )并且在应用程序启动时,我调用从数据库加载所有常用实体,如下所示:

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.如果它来自一个非常昂贵的查询,那么缓存成本低于查询成本,它应该放在缓存中.

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

转载注明原文:NHibernate二级缓存性能问题 - 代码日志