2012-02-16 36 views
1

我目前正在使用Oracle数据库(使用EntitySpaces ORM)处理ASP.NET报告应用程序(C#)。性能/响应对于此应用程序的成功至关重要,因为它将在几天内被1000人使用。我非常想避免往返数据库,因为我知道这将是一个瓶颈。我的第一个想法(因为数据库的物理大小相对较小)只是将所有数据库对象缓存在应用程序缓存中,并根据需要从缓存中查询它们。当ASP.NET开始从缓存中删除项目时,我很快意识到我的逻辑存在缺陷 - 可能是因为正在使用太多的内存。在ASP.NET中存储和访问对象/集合的指导

是否有另一种/更好的方法来做到这一点?当应用程序启动时,是否存在另一种存储静态集合的方法,我可以保证不会被垃圾回收占用?我很了解页面级别的缓存,但这并没有多大帮助,因为我基本上构建了一系列对每个用户都是唯一的特别报告。

编辑:只是为了进一步澄清,缓存的所有数据的大小是< 5 MB。这个想法是缓存所有的对象,然后用linq过滤集合。

+0

你在做任何数据分页?允许人们放置过滤器?我们在说多少行?不管你选择什么方法,都有权衡。有些选择以内存为代价提供性能,其他则以牺牲磁盘空间为代价提供性能。请记住,取决于您的应用程序池设置(在X时间或X内存或X CPU之后回收),整个应用程序池可能会重复使用删除所有缓存项目,导致缓存应用程序内存无用。 – 2012-02-17 04:24:25

+0

您可以使用一些外部缓存服务器,如NOSQL dbs。这是相当容易实现的,它不需要太多的代码改变。他们中的很多是免费和开源的。如果您对这些选项感兴趣,请告诉我,我可以将您指向几个网站。 – ASetty 2012-02-17 07:36:21

+0

我在上面稍微澄清了这个问题。最新的想法是继续使用应用程序缓存,但使用CacheItemPriority.NotRemovable选项。 – 2012-02-17 16:59:22

回答

0

正如我已经确定你知道,索引是一个好主意。之后,服务器的硬件将极大地影响数据库提供数据的能力 - >如果您真的需要一些认真的性能,请切换到RAID磁盘阵列,每晚备份到普通HD。

除此之外,表格的设计会影响其速度。既然你注意到数据库是相当小的(这需要合格,因为甲骨文通常用于更大的东西),那里可能没有太多要做。

如果您确实需要速度,您可能希望使用多宿主网卡,并直接连接到请求数据的服务器。

看到,关于RDBMS,将​​内容保存在内存中并不是一个好主意,因为它支持在性能上将数据提交到磁盘。如果您不介意数据可能丢失的想法(没有做任何真正重要的事情或需要备份),那么您可以使用仅限内存的数据库。而且你建立的任何数据库机器都应该与处理器和内存一起打包(不用拼凑)。

作为一般规则,更多的性能可以通过更紧密/更手动的编码和异国情调的硬件来实现,但问题是,它是否值得这个价格?获得额外10%性能所需的资源类似于保时捷活塞与大众活塞的附加精度所需的资源 - >它将比以前的数量增加10倍,以获得该性能。我知道的唯一一个拥有这种资金并且需要这种表现的人(我的头顶)为国家政府的密码部门或高频交易公司工作。

0

根据数据的大小,你需要存储,你可以把它存储在应用程序状态:

如何:在应用程序状态保存价值http://msdn.microsoft.com/en-us/library/94xkskdf.aspx

如何从应用程序状态http://msdn.microsoft.com/en-us/library/y8hhek39.aspx读取值

最后,您可以设置在Application_Start方法中的变量在应用程序的Global.asax文件:http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+1

使用Application Start查找和存储数据时请认真思考。请记住,在提供第一个请求之前,执行所有这些查找操作时,应用程序将挂起第一个请求。这可以为您的应用程序添加新的应用程序池。更好的方法可能是根据需要将项目添加到缓存中,或者使用HTTP缓存并启用到期日期,以便将项目保留在内存中,并且如果X分钟后尚未使用它们,则将它们过期(滑动到期)。 – 2012-02-17 04:32:48

相关问题