我目前正在使用Oracle数据库(使用EntitySpaces ORM)开发ASP.NET报告应用程序(C#)。性能/响应性对于此应用程序的成功至关重要,因为它将在几天内由1000名人员使用。我非常想避免往返数据库,因为我知道这将是一个瓶颈。我的第一个想法(因为数据库的物理大小相对较小)是简单地缓存应用程序缓存中的所有数据库对象,并根据需要从缓存中查询它们。当ASP.NET开始从缓存中删除项目时,我很快就意识到了我逻辑中的缺陷 - 可能是因为使用了太多的内存。
还有其他/更好的方法吗?在应用程序启动时是否有另一种存储静态集合的方法,我可以保证垃圾收集不会消耗它?我非常了解页面级缓存,但这对我来说无济于事,因为我基本上构建了一系列每个用户都独有的临时报告。
编辑:为了进一步澄清,缓存的所有数据的大小是< 5 MB。我们的想法是缓存所有对象,然后只使用linq过滤集合。
答案 0 :(得分:0)
我已经确定你知道,索引是一个好主意。之后,服务器的硬件将极大地影响数据库提供数据的能力 - >如果您确实需要一些严肃的性能,请切换到RAIDed SSD,每晚备份到常规HD。
除此之外,表格的设计会影响其速度。既然你注意到数据库相当小(需要合格,因为Oracle通常用于更大的东西),那里可能没什么可做的。
如果您确实需要速度,您可能希望使用多宿主NIC,直接连接到请求数据的服务器。
看看,将内容保留在内存中对于RDBMS来说并不是一个好主意,因为它倾向于将数据提交到磁盘而不是性能。如果您不介意数据可能会丢失(没有做任何真正重要/需要备份的事情),您可以使用仅限内存的数据库。你构建的任何数据库机器都应该用处理器和内存打包到鳃(没有吝啬)。
作为一般规则,使用更紧凑/更多的手动编码和奇特的硬件可以获得更多性能,但问题是,它是否物有所值?获得额外10%性能所需的资源类似于保时捷活塞与VW活塞的额外精度所需的资源 - >它将花费十倍,超过以前的数量来获得该性能。我认识的唯一一个拥有这种资金并且需要这种表现的人(我的头脑中),无论是国家政府的加密机构,还是高频交易公司。
答案 1 :(得分:0)
根据您需要存储的数据大小,您可以将其存储在“应用程序状态”中:
如何:在应用程序状态http://msdn.microsoft.com/en-us/library/94xkskdf.aspx
中保存值如何:从应用程序状态http://msdn.microsoft.com/en-us/library/y8hhek39.aspx
中读取值最后,您可以在应用程序的global.asax文件中的Application_Start方法中设置变量:http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721