C# 缓存LINQ到SQL数据上下文

C# 缓存LINQ到SQL数据上下文,c#,linq-to-sql,C#,Linq To Sql,我们正在为多租户Web应用程序进行性能优化。目前,LinqToSql数据上下文是在每个web请求的开头创建的。该上下文对于web请求有一个生存期,并使用Castle Windsor将其注入任何需要它的对象的构造函数中 我们考虑在会话缓存中缓存上下文(以及附加到上下文的一组对象)最多几分钟,以优化后续web请求的设置成本。这是个好/坏主意吗?需要考虑哪些问题?在我看来,这是个坏主意。最大的问题是并发性。多亏了连接池,只要将数据上下文用作数据管道,而不是数据桶本身,成本就不会那么高 缓存数据;扔掉数

我们正在为多租户Web应用程序进行性能优化。目前,LinqToSql数据上下文是在每个web请求的开头创建的。该上下文对于web请求有一个生存期,并使用Castle Windsor将其注入任何需要它的对象的构造函数中


我们考虑在会话缓存中缓存上下文(以及附加到上下文的一组对象)最多几分钟,以优化后续web请求的设置成本。这是个好/坏主意吗?需要考虑哪些问题?

在我看来,这是个坏主意。最大的问题是并发性。多亏了连接池,只要将数据上下文用作数据管道,而不是数据桶本身,成本就不会那么高

缓存数据;扔掉数据上下文

另外,试图保持数据上下文不会扩展到多个服务器,也不支持除进程内之外的任何缓存实现


您是否测量了安装成本,以便知道这是否值得考虑?我真的不相信这是你的瓶颈。

我们已经测量过了。问题不在于dc的创建,而在于所附的数据。我们最初的想法是按照您的思路,如果是绿地开发方案,我们肯定会重新附加。在我们重构以重新水化上下文之前,我们想了解如果我们只是在短时间内保持dc完好无损,实际上会出现什么问题。@Rob-您不应该在数据上下文中需要数据。它不打算用作数据存储(即使使用identity manager)。就个人而言,我会将这些数据移出数据上下文;使用数据上下文获取它,但在外部缓存它。@标记-同意。在绿地场景中,我们就是这样处理的。现有存储库是这样编写的,它们假定实体在更改集中,因此我们必须从缓存中重新水化上下文。当然不是不可能,我们很可能会这样做,但我们希望在花有限的开发时间之前了解所有问题。您是否检查了通过datacontext运行的每个查询,以确保消耗最少的数据库IO?您是否检查了datacontext的调用者,以确保没有重复获取相同的数据?@David:调整探查器中显示为热点的查询。我们的存储库实现可以防止重复获取。