【发布时间】:2011-05-16 04:16:59
【问题描述】:
我们在 Web 应用程序中使用 Linq-to-SQL DataContext,它向应用程序提供只读数据并且永远不会更新(已设置 ObjectTrackingEnabled = false 以强制执行此操作。
由于数据永远不会改变(除了偶尔的配置更新),从 SQL Server 重新加载它并为每个 Web 请求使用新的 DataContext 似乎很浪费。
我们尝试在 Application 对象中缓存 DataContext 以供所有请求使用,但它会产生很多错误,我们的研究表明这是一个坏主意,DataContext 应该在同一个工作单元中处理,不是线程安全的,等等。
因此,由于 DataContext 是一种数据访问机制,而不是数据存储,因此我们需要考虑缓存我们从中获取的数据,而不是上下文本身。
希望对实体和集合本身执行此操作,这样代码就可以不知道它是在处理缓存数据还是“新”数据。
如何安全地做到这一点?
首先,我需要确保在处理 DataContext 之前已完全加载实体和集合。有没有办法方便地从数据库中强制加载所有内容?
其次,我很确定存储对实体和集合的引用是个坏主意,因为它要么
(a) 当 DataContext 超出范围时导致实体损坏或
(b) 防止 DataContext 超出范围
那么我应该克隆实体集并存储它们吗?如果是这样,怎么做?或者这是怎么回事?
【问题讨论】:
-
似乎很浪费!= 性能瓶颈。 measuring 和 profiling 在哪里显示您的应用程序很慢?那是你应该集中精力的地方。这是直觉大多是错误的软件领域之一。
-
嗨 mellamokb,感谢您的评论。这是真的,我们没有尝试测量。但是,当您知道每个 Web 请求只会每周更改一次时,通过连接/SQL 请求/磁盘访问重新加载静态数据怎么可能不浪费呢?您是说其他一些缓存本质上会在数据管道的下游发生吗?
-
不,我是说当你不知道你的性能问题是什么时,你不应该随意添加缓存代码。你要缓存什么?每一个查询?具体表?缓存内存和数据库速度之间存在权衡,如果你用完所有内存,你的应用程序会更慢。你不能凭直觉回答所有这些问题。你怎么知道你添加的缓存层是否完成了这项工作?因为应用程序的某些部分感觉更快?这不是客观提高性能的方法。
-
我不是说这不是浪费。我不是说这样做不能提高性能。无论如何,如果你能做某事,那就去做吧!但是,如果你真的不知道你要解决的问题,而且你没有一个数字来衡量你的表现,那么你的目标是什么,你将如何到达那里?凭直觉和直觉来解决性能问题是完全错误的方法。
-
感谢您的 cmets,mellamokb。我接受你的观点,我接受你的责骂。你仍然没有在这里添加任何建设性的东西。为了争论,我们假设我确实有一个定量分析方法。从 DataContext 缓存数据的最佳方法是什么?它不是一个大数据集(~5MB),所以缓存对内存的影响很小,特别是因为我将通过每个请求减轻服务器重复 DataContext 生命周期的负担。
标签: asp.net linq-to-sql