1

在此项目中,我使用了MVC-3,其中包含输出缓存属性以及web.config中的相应引用,以及希望的global.asax(如下所示)。我从共享主机运行生产,并且无法运行aspnet_regsql作为管理员来创建适当的对象,因此我复制了AspNet_SqlCacheTablesForChangeNotification表SP,并从我的开发箱中触发以设置数据库。已删除或未创建SQLServer OutputCache对象

一般来说,一切都很好,但我发现大约每2或3天一次所有的缓存数据库对象都被删除,并且不会在应用程序启动时重新创建。 (没有托管co脚本正在删除它们)。

为了让网站再次运行,我最终手动复制了数据库对象。

如何删除对象,或者让它们自动创建?

在Global.asax我的应用程序开始看起来是这样的:

protected void Application_Start() 
{ 
    RegisterGlobalFilters(GlobalFilters.Filters); 

    SqlCacheDependencyAdmin.EnableNotifications(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString); 
    SqlCacheDependencyAdmin.EnableTableForNotifications(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString, "be_Posts"); 
    SqlCacheDependencyAdmin.EnableTableForNotifications(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString, "be_PostTag"); 

    SiteMap.Provider.SiteMapResolve += new SiteMapResolveEventHandler(SiteMapPathExpansionResolver.OnSiteMapResolve); 
    RegisterRoutes(RouteTable.Routes); 
} 

和我的应用程序结束看起来是这样的:

protected void Application_End() 
    { 
     SqlCacheDependencyAdmin.DisableTableForNotifications(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString, "be_Posts"); 
     SqlCacheDependencyAdmin.DisableTableForNotifications(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString, "be_PostTag"); 
     SqlCacheDependencyAdmin.DisableNotifications(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString); 
    } 

的web.config条目看起来是这样的:

<caching> 
    <sqlCacheDependency enabled="true" pollTime="10000" > 
    <databases> 
     <add name=" db" 
     connectionStringName="ApplicationServices" 
     pollTime="10000" 
     /> 
    </databases> 
    </sqlCacheDependency> 
</caching> 

回答

0

所以我通过评论/去除Application_End中的禁用来有效地解决了这个问题。我读过,这使得sql服务器打开句柄,但我没有找到任何其他解决方案的工作。我尝试添加创建触发器和启动事件来重新创建表等等以及其他一些方法,但只是删除禁用似乎工作。

我希望我所在的共享和数据库服务器没有问题,但托管公司没有向我抱怨,我真的没有办法知道这种方法是否会导致并发症,因为他们不授予对这种监控的访问权限。