2009-06-14 65 views
0

我们正在开发一个ASP.NET HR应用程序,该应用程序将使每个用户会话的数千个呼叫到相对静态的数据库表(例如税率)。用户不能更改此信息,并且在公司办公室所做的更改最多只会发生一次(并且不需要立即在应用程序中刷新)。在ASP.NET中使用静态数据还是数据库调用?

大约2/3的数据库调用都是针对这些静态表,因此我正在考虑将它们移动到一组静态对象中,这些静态对象在应用程序初始化期间加载,然后每24小时刷新一次(如果应用程序未重新启动在那段时间内)。内存总大小约为5MB。

我犯了错误吗?这种方法有什么缺陷?

+0

为什么你需要为每个用户会话进行数千次呼叫? – tuinstoel 2009-06-14 06:06:06

+0

@tuinstoel - 用户正在输入工资支票和类似信息。一个用户可能会导入1,000个支票,这很容易导致对数据库的50,000个调用(对于每种联邦/州/地方税类型,验证步骤,最低工资评估等)。 – 2009-06-14 06:16:41

+1

这么多电话,看起来非常过分。您的ORM可能会阻止您以基于集合的方式而不是基于行的方式工作。 – tuinstoel 2009-06-14 08:40:29

回答

1

认为:过早优化。你仍然需要最终处理数据表,并且你会留下一个“不寻常的设计模式”。

使用事件默认缓存,无论如何,dbms对于静态数据来说是非常有效的,尤其是只有5M。而你所描述的dbms分区通常被描述为反模式。一个例子:多个客户端的多个相同的数据库。关于这种模式,还有其他一些关于SO的问题。我明白有安全问题,但这样做会产生其他安全问题。我最近在一个医疗账单数据库(甚至更高度敏感)中看到了这个相同的概念,最终必须将其重构为单个数据库。

如果你这样做,那么我建议你至少等到你知道它解决了一个真正的问题,然后测试它来测量它的差异。意外后果有很多机会。

2

从您提供的信息看,您肯定应该缓存此数据 - 很少更改,因此经常访问。但是,“静态”对象可能不合适:每当缓存数据超过N个小时时,为什么不只访问数据库呢?

即使您不需要特殊的新鲜度,您也可以随意改变N值 - 即使每天击中数据库4次会比每次用户会话的数千次更好!

最好的做法可能是在数据库信息中保留一个时间戳记或日期时间记录上次更新时间。这样,“我的缓存仍然新鲜”的检查通常非常轻量级,只需获取“最新更新”信息并使用重建本地缓存的最新更新进行检查即可。有点像HTTP“如果自从”缓存策略以来被修改过,除了你会实现大部分DB-client端;-)。

2

如果决定缓存数据(与每次进行数据库调用相比),请使用ASP.NET缓存而不是静态方法。 ASP.NET缓存提供过期功能,处理多个并发请求,甚至可以使用SQL 2005+的查询通知功能自动使缓存失效。

如果你使用静态,你可能会最终实现这些东西。

对此使用ASP.NET缓存没有缺点。实际上,它也用于缓存数据(请参见SqlCacheDependency类http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx)。

1

使用缓存,数据库管理系统是足够有效的静态数据,无论如何,尤其是只有它的5M。

是的,但这里的要点是避免数据库往返。

ASP.NET高速缓存是此作业的正确工具。

1

您没有说明您将如何能够找到用户的匹配数据。如果它像在缓存集合中找到外键一样简单,那么你不必担心。 如果你实现某种过滤/排序/分页或者最糟糕的搜索,那么你可能会在某些时候错过SQL的排队功能。

ORM经常有自己的quereing和LINQ使事情变得容易,但它仍然不是SQL。 (尝试按2列分组)

有时候,让db仅返回结果集的键并使用Cache来填充整个集合是一种好方法。

相关问题