我在使用SQLCacheDependency
的{{1}}应用中使用ASP.NET
。
我跟着this article成功设置了我的数据库。但是每当我试图将数据存储在Query Notifications
对象中时,它只是没有值。它总是cache
。我是没有任何错误或例外。
这是我的代码
Global.asax中
null
代码背后
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
System.Data.SqlClient.SqlDependency.
Start(ConfigurationManager.ConnectionStrings["McdConn"].ToString());
}
void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown
System.Data.SqlClient.SqlDependency.
Stop(ConfigurationManager.ConnectionStrings["McdConn"].ToString());
}
public static class CacheManagement
{
public static DataTable CreateCache(string cacheName, string tableName, string query)
{
DataTable dtResult = new DataTable();
try
{
string connectionString = ConfigurationManager.ConnectionStrings["McdConn"].ToString();
dtResult = HttpContext.Current.Cache[cacheName] as DataTable;
if (dtResult == null)
{
dtResult = new DataTable();
using (var cn = new SqlConnection(connectionString))
{
cn.Open();
var cmd = new SqlCommand(query, cn);
cmd.Notification = null;
cmd.NotificationAutoEnlist = true;
SqlCacheDependencyAdmin.EnableNotifications(connectionString);
if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connectionString).Contains(tableName))
{
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString,tableName);
}
var dependency = new SqlCacheDependency(cmd);
//SqlDataAdapter ad = new SqlDataAdapter(cmd);
//ad.Fill(dsResult);
SqlDataReader reader = cmd.ExecuteReader();
dtResult.Load(reader);
HttpContext.Current.Cache.Insert(cacheName, dtResult, dependency);
}
}
}
catch (Exception ex)
{
Exception_Log.ExceptionMethod("Web", "CacheManagement.cs", "CacheManagement", ex);
}
return dtResult = HttpContext.Current.Cache[cacheName] as DataTable;
}
}
上述内容始终会返回var dtCachedCategories = HttpContext.Current.Cache["tbl_CategoryMaster_Cached"] as DataTable;
if (dtCachedCategories == null)
{
dtCachedCategories = CacheManagement.CreateCache("tbl_CategoryMaster_Cached","dbo.tbl_CategoryMaster_Languages", "Select * from dbo.tbl_CategoryMaster_Languages");
}
。
任何人都可以帮助我指出可能缺少的东西吗?
答案 0 :(得分:3)
您可以做很多事情来调试代码并得出结论。您的缓存项似乎过于频繁删除。
1。)使用CacheItemPriority.NotRemovable
到Cache.Insert()以确保ASP.NET不会删除
只要感觉如此,你的物品。使用解释here的Insert()
方法。检查一下MSDN
文章也是。
2.。)要找出删除缓存项目的原因,请使用以下内容记录此删除操作
CacheItemRemovedCallback
方法的Cache.Insert()
委托选项。请查看此Insert method
overload版本以及此link。
3.确保您的dtresult
和reader
不为空。检查行:
SqlDataReader reader = cmd.ExecuteReader();
& dtResult.Load(reader);
,以及您的日志。
4.。)检查您的应用程序池循环时间。此link包含与应用程序池设置(IIS 7 +)相关的所有内容。
5.这个链接有一个IIS 6 App池的解决方案:http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon
另外,请尝试使用HttpRuntime.Cache方法查看它是否有效。
System.Web.HttpRuntime.Cache.Insert(cacheName, dtResult, dependency);