我正在使用 NHibernate 使用每个请求会话模式开发一个 MVC 应用程序。大多数时候用户只是读取数据,因此我尝试通过以下方式使用 NHibernate 的二级缓存:我设置了 SysCache 并使所有持久实体可缓存(缓存使用=“nonstrict-read-write”) )并且在应用程序启动时,我调用从数据库加载所有常用实体,如下所示:
var all = Session.QueryOver<T>().Cacheable().List<T>()
出于评估目的,我跟踪了上述调用的执行时间,对于大约 50000 个结果,第一次大约需要 5 秒,而对缓存查询的任何后续调用大约需要 2.5 秒......NHibernate Profiler 表示对数据库的查询需要更少的时间不到100ms,那么什么需要这么长时间呢?我尝试更换提供商,但使用 Velocity 和 Memcached 得到了类似(如果不是更差)的结果...我几乎阅读了所有我能找到的关于 NHibernate 及其对二级缓存的使用的内容,我认为,尽管我可能不完全正确,但在上面的语句中,发生的情况是:构造了 50000 个对象,它们的数据存储在实体和查询缓存中,会话时间戳保存在时间戳缓存中。在 i5 机器上怎么可能需要 5 秒?即使这是正常现象,在后续调用中如何仅读取缓存数据就需要 2.5 秒,而中间没有任何更改?由于我对 NHibernate 比较陌生,你们中的任何人都可以帮我找出我做错了什么吗?任何帮助将不胜感激...我已经用头撞墙一周了...
您不应该将 50000 个实体放入缓存中,这会否定数据库的意义,尤其是当您的数据来自 SELECT * FROM TABLE 时。如果它来自一个非常昂贵的查询,那么缓存成本小于查询成本,并且应该将其放入缓存中。
使用查询来获取特定数据。然后,查找进行大多数查询的页面,并优化它们,必要时使用缓存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)