我们遇到了一个问题,我们的 sql server 的 cpu 使用率跳到并保持在 100%,直到站点被关闭并重新启动。我们已经检查了代码并优化了所有可以做的事情,而且这种情况仍在发生。
我们对缓存所做的是运行一个查询,该查询从 sql server 加载整个结构(约 6000 行),将其存储在缓存中,并查询该缓存以执行我们需要在整个应用程序的其余部分执行的各种操作(有需要对数据执行大量递归操作,否则将对 sql server 造成巨大打击)。
我描述上面是因为似乎在使用sql缓存依赖时,我们遇到了sql server上的cpu尖峰。如果它被禁用,即使我们仍在缓存相同数量的数据,我们也不会再遇到峰值(在 sql 服务器或 Web 服务器上)。
有谁知道sql缓存依赖会导致这样的行为吗?使用的 sql server 是 SQL Server 2008 R2。Web 服务器是 IIS 7.5,我们使用 ASP.NET 3.5。此 Web 服务器设置为集群 (x2),它们都指向同一个 sql 服务器。
这是加载/设置缓存的代码:
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
{
cn.Open();
string query =
@"SELECT
id,
parentid,
field1,
field2,
field3,
field4,
field5
FROM
dbo.theTableWithDataInIt";
SqlCommand cmd = new SqlCommand(query, cn);
cmd.Notification = null;
cmd.NotificationAutoEnlist = true;
SqlCacheDependencyAdmin.EnableNotifications(
ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(
ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)
.Contains("dbo.theTableWithDataInIt"))
{
SqlCacheDependencyAdmin.EnableTableForNotifications(
ConfigurationManager.ConnectionStrings["MyConnectionString"].
ConnectionString, "dbo.theTableWithDataInIt");
}
SqlCacheDependency dependency = new SqlCacheDependency(cmd);
cmd.ExecuteNonQuery();
//
// Get Cache Data is a function that returns a DataSet with the data to be added to cache
//
Cache.Insert("mycache", GetCacheData(), dependency);
}