我们正在开发一个ASP.NET HR应用程序,它将为每个用户会话拨打数千个调用到相对静态的数据库表(例如税率)。用户无法更改此信息,并且在公司办公室进行的更改最多每天一次(并且不需要立即在应用程序中刷新)。
大约2/3的所有数据库调用都是针对这些静态表的,因此我正在考虑将它们移动到一组静态对象中,这些对象在应用程序初始化期间加载,然后每24小时刷新一次(如果应用程序未重新启动期间)那时)。内存总大小约为5MB。
我犯了错误吗?这种方法有哪些陷阱?
答案 0 :(得分:2)
从您提供的信息来看,您肯定应该缓存此数据 - 很少更改,因此经常访问。但是,“静态”对象可能不合适:为什么不只是在缓存数据超过N小时时访问数据库?
即使你不需要特别的新鲜感,你也可以随意改变N.即使每天4次左右击中DB也会比“每次用户会话的数千[次]”好得多!
最好的方法是将数据库信息与时间戳记或日期时间保持一致,记住上次更新时间。这样,检查“我的缓存仍然是新鲜的”通常非常轻,只需获取“最新更新”信息并使用您重建本地缓存的最新更新进行检查。有点像HTTP“如果修改自”缓存策略,除了你将实现大部分DB-client-side; - )。
答案 1 :(得分:2)
如果决定缓存数据(每次调用数据库),请使用ASP.NET缓存而不是静态。 ASP.NET缓存提供到期功能,处理多个并发请求,甚至可以使用SQL 2005 +的查询通知功能自动使缓存无效。
如果你使用静力学,你可能最终会实现这些东西。
使用ASP.NET缓存没有任何缺点。实际上,它也是为缓存数据而设计的(参见SqlCacheDependency类http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx)。
答案 2 :(得分:1)
思考:过早优化。最终你仍然需要以数据表的形式处理数据,并且你将离开“不寻常的设计模式”。
使用事件默认缓存,无论如何,dbms对静态数据非常有效,特别是只有5M。您描述的dbms分区通常被描述为反模式。一个例子:多个客户端的多个相同数据库。关于这种模式,还有其他问题。我知道存在安全问题,但这样做会产生其他安全问题。我最近在医疗账单数据库中看到了同样的概念(甚至更高度敏感),最终必须重构为一个数据库。
如果你这样做,那么我建议你至少等到你知道它正在解决一个真正的问题,然后进行测试以测量它所产生的差异。非预期后果有很多机会。
答案 3 :(得分:1)
使用缓存,无论如何,dbms对静态数据非常有效,特别是只有5M。
是的,但这里的重点是避免数据库往返。
ASP.NET Cache是这项工作的正确工具。
答案 4 :(得分:1)
您没有说明如何为用户找到匹配的数据。如果它像在缓存集中查找外键一样简单,那么您不必担心。 如果您实现某种过滤/排序/分页或最差搜索,那么您可能会在某些时候错过SQL的排队功能。
ORM经常有自己的quereing和linq使事情变得容易,但它仍然不是SQL。 (尝试按2列分组)
有时,让db返回结果集的键并使用Cache来填充整个集合是一种好方法。