У нас возникла проблема, когда наш сервер sql, на котором использование ЦП переходит на 100%, остается до тех пор, пока сайт не будет отключен и перезапущен. Мы просмотрели код и оптимизировали все, что могли, и это все еще происходит.
Что мы делаем с кешем, так это запускаем запрос, который загружает всю структуру (~ 6000 строк) с сервера sql, сохраняет ее в кеше и запрашивает этот кеш для выполнения различных операций, которые нам нужно выполнить в остальной части приложения. (существует множество рекурсивных операций, которые необходимо выполнить с данными, и в противном случае это сильно ударит по серверу sql).
Я описываю вышеизложенное, потому что кажется, что при использовании зависимости кэша sql мы сталкиваемся с выбросом процессора на сервере sql. Если он отключен, мы больше не встречаем всплеск (на сервере sql или веб-сервере), хотя мы все еще кэшируем тот же объем данных.
Кто-нибудь знает, что из-за зависимости кэша sql может вызвать подобное поведение?
Используемый сервер sql - SQL Server 2008 R2. Веб-сервер IIS 7.5, и мы использовали ASP.NET 3.5. Эти веб-серверы настроены как кластер (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);
}