我目前正在使用ASP.NET数据库(使用EntitySpaces ORM)开发一个EntitySpaces报告应用程序(C#)。性能/响应能力是这个应用程序成功的关键,因为它将在几天内被1000多人使用。我非常希望避免往返于数据库,因为我知道这将是一个瓶颈。我的第一个想法(因为数据库的物理大小相对较小)是简单地缓存应用程序缓存中的所有数据库对象,并根据需要从缓存中查询它们。当ASP.NET开始从缓存中删除项时,我很快意识到了逻辑中的缺陷--大概是因为使用了太多的内存。
还有别的/更好的方法吗?在应用程序启动时,还有另一种存储静态收集的方法吗?我可以保证垃圾收集不会消耗它?我很清楚页面级缓存,但这不会有多大帮助,因为我实际上正在构建一系列针对每个用户的特殊报告。
编辑:只是为了进一步澄清一下,所有正在缓存的数据的大小都是<5MB。其想法是缓存所有对象,然后使用linq过滤集合。
发布于 2012-02-17 04:15:15
我相信你已经知道,索引是个好主意。在此之后,服务器的硬件将极大地影响数据库提供数据->的能力,如果您确实需要一些严重的性能,则切换到RAIDed SSD,每晚备份到常规HDs。
除此之外,表的设计会影响其速度。由于您注意到数据库相当小(这需要限定,因为Oracle通常用于更大的东西),所以可能没有什么可做的了。
如果您确实需要速度,您可能想要使用多主NIC,并直接连接到请求数据的服务器。
对于RDBMS来说,将数据保存在内存中并不是一个好主意,因为它倾向于将数据提交到磁盘而不是性能。如果您不介意数据可能丢失的想法(不做任何真正重要的事情/需要备份),那么您可以使用一个只有内存的数据库。而且,您构建的任何数据库机器都应该被打包到带有处理器和内存的gills中(不需要压缩)。
通常情况下,使用更严格的/更多的手动编码和奇异的硬件可以获得更高的性能,但问题是,它值得付出代价吗?获得额外10%性能所需的资源类似于保时捷活塞相对于大众活塞->的额外精度所需的资源--这将花费10倍的成本,超过先前的数量来获得该性能。我认识的人中,只有那些有钱,需要这样的表现的人,要么为国家政府的密码部门工作,要么为高频贸易公司工作。
发布于 2012-02-17 04:15:50
根据需要存储的数据的大小,可以将其存储在应用程序状态中:
如何:在应用程序状态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
https://stackoverflow.com/questions/9319689
复制相似问题