是否有必要回收应用程序池以刷新缓存的查询计划?

时间:2018-05-30 07:13:34

标签: asp.net sql-server-2012

我不确定我是否正确地提出了正确的问题,但如果你知道答案,那么你可能会明白我在问什么。

我更新了存储过程并在dev中测试没有问题。所以我在生产中更新了proc并导致了错误。我想了解一下发生了什么,因为我所做的更改是从i.PricePrice = coalesce(r.Price, i.Price)的选择列表中的一个字段。最终我认为唯一的区别可能是r.Price是一个十进制值,而i.Price是一个货币值,所以该字段的返回类型已经改变。

通常这对c#代码无关紧要。无论如何,DataReader值都会被转换为十进制。但是我必须做的就是修复错误,重置应用程序池,然后才能正常工作。我相信我也可以更新我的查询以转换为金钱类型,这可能也会有效。

我知道我之前已经遇到过这种问题,足以知道在asp.net和/或sql程序集中引发了某种缓存。

我的问题是,如何在不回收应用程序池的情况下刷新此缓存。或者这是唯一的方法吗?

1 个答案:

答案 0 :(得分:1)

部署时会发生什么:

ASP.NET具有一个称为卷影复制的功能,可以在不卸载AppDomain的情况下更新应用程序域中使用的程序集。通常,这是必需的,因为公共语言运行库(CLR)将锁定程序集,因此您不能只是在其上复制新程序集。阴影复制意味着将原始程序集复制到临时位置。复制的程序集已锁定,原始程序集可以使用新版本进行更新。

What is assembly interning?

来自:

来自MSDN:

ASP.NET卷影复制功能使应用程序域中使用的程序集能够在不卸载该AppDomain的情况下进行更新(这是必需的,因为CLR会锁定正在使用的程序集)。这是通过将应用程序程序集复制到单独的位置(默认的CLR确定的位置或用户指定的位置)并从该位置加载程序集来完成的。这允许在锁定卷影副本时更新原始程序集。默认情况下,ASP.NET为Bin文件夹程序集打开此功能,以便在站点启动并运行时可以继续更新DLL。

https://msdn.microsoft.com/en-us/magazine/hh882452.aspx

以下情况会自动回收应用程序池:

应用程序的BIN目录中的任何修改

在任何配置文件中进行更改,例如Web.config或其他配置文件(如果您的应用程序中有任何特定的配置文件,请在名为App_Config的目录中说明。)

在APP_CODE目录中的源代码文件中进行修改。这可能会更改任何源代码文件,或添加或删除此目录中的文件。

在Global.asax文件中进行更改

在Machine.config文件中进行更改。

在Web应用程序的根目录中进行任何修改。这意味着即时创建文件/子目录可能会导致应用程序池回收。

对App_WebReferences目录的Web服务引用的修改。

修改根目录中任何目录的安全设置。 (例如为每个人或任何其他特定用户或用户组指定读取安全权限。)

了解更多详情: Does any change in any file inside bin folder cause application recycle in ASP.NET web application?