В .NET 1.1 Cache может создавать зависимости Cache только на основе файловых систем, объектов и т. д., но .NET 2.0 предоставляет новую зависимость SqlCacheDependency, которая позволяет нашему Cache зависеть от изменений в базе данных. Хотя этот подход похож на обходной путь в версии 1.1, между ними есть существенное различие (предоставление объекта SqlCacheDependency). (Обходным решением для версии 1.1 является создание триггера для таблицы данных, а затем триггер будет изменять локальный файл при срабатывании. Зависимостью определенного кэша в системе является этот локальный файл, чтобы уведомить кэш о кэшированных данные изменились)
SqlCacheDependency .NET 2.0 можно использовать в версиях после SqlServer2000. В этой статье рассказывается, как использовать его в Sql Server 2000. Sql Server 2005 немного отличается.
Во-первых, вам необходимо установить платформу .NET 2.0. Разумеется, должен быть доступен Sql Server 2000. В .NET 2.0 Microsoft предоставляет служебную программу: aspnet_regsql (в том же каталоге, что и aspnet_regiis). Это инструмент командной строки. Параметры командной строки можно получить с помощью aspnet_regsql -?. Здесь нас интересуют следующие параметры: -ed запускает базу данных для зависимостей кэша SQL, -E использует текущие учетные данные Windows для аутентификации, -d используется для имени базы данных сервера приложений, если имя базы данных не указано, используется значение по умолчанию используется база данных «aspnetdb». В этой статье будут использоваться примеры пабов баз данных Microsoft. Затем нам нужно использовать следующую командную строку для создания базы данных, зависящей от кэша:
aspnet_regsql -ed -E -d pubs
(Примечание. Параметры командной строки здесь чувствительны к регистру.)
После выполнения этой команды мы можем открыть базу данных pubs, чтобы увидеть, какие изменения произошли. Во-первых, есть дополнительная таблица: AspNet_SqlCacheTablesForChangeNotification. Эта таблица имеет 3 поля tableName: мониторинг. имя таблицы, NotificationCreated: время создания. ChangeId: номер изменения (накопительное поле). Вы также можете видеть, что в базе данных есть еще несколько хранимых процедур:
AspNet_SqlCacheRegisterTableStoredProcedure,
AspNet_SqlCacheUnRegisterTableStoredProcedure,
AspNet_SqlCacheUpdateChangeIdStoredProcedure,
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,
AspNet_SqlCachePollingStoredProcedure
Эти хранимые процедуры легко понять буквально. Подробности хранимой процедуры можно просмотреть после ее открытия в анализаторе запросов. Чтобы отслеживать изменения в таблице, нам нужно указать таблицу, которую необходимо отслеживать, выполнив хранимую процедуру AspNet_SqlCacheRegisterTableStoredProcedure. Конечно, ее также можно указать с помощью служебной программы aspnet_regsql. Командная строка выглядит следующим образом:
aspnet_regsql -et -E -d pubs -t авторы
После выполнения указанной выше команды aspnet_regsql создаст триггер для авторов. Ниже приведен триггер, который я создал после выполнения команды:
ВКЛЮЧИТЬ QUOTED_IDENTIFIER
ИДТИ
УСТАНОВИТЕ ANSI_NULLS ВКЛ.
ИДТИ
ALTER TRIGGER dbo.[authors_AspNet_SqlCacheNotification_Trigger] ON [авторы]
ДЛЯ ВСТАВКИ, ОБНОВЛЕНИЯ, УДАЛЕНИЯ КАК НАЧАТЬ
УСТАНОВИТЬ NOCOUNT ON
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'authors'
КОНЕЦ
ИДТИ
ВЫКЛЮЧИТЬ QUOTED_IDENTIFIER
ИДТИ
УСТАНОВИТЕ ANSI_NULLS ВКЛ.
ИДТИ
Как видно из триггера, хранимая процедура AspNet_SqlCacheUpdateChangeIdStoredProcedure будет выполняться при вставке, удалении и обновлении таблицы авторов. Эта хранимая процедура добавит запись в таблицу AspNet_SqlCacheTablesForChangeNotification. Запись следующая:
tableName NotificationCreated ChangeId
авторы 20.06.2006 09:38:26.267 1
При внесении каких-либо изменений в данные авторов, ChangeId будет накапливаться, а остальные поля не изменятся.
Затем вам нужно добавить некоторый контент в web.config, и вы сможете его использовать.
Сначала добавьте строку подключения к базе данных:
<строки подключения>
<add name="pubsConString" ConnectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
</connectionStrings>
Во-вторых, добавьте раздел кеша:
<система.веб>
<кэширование>
<sqlCacheDependency Enabled="true">
<базы данных>
<add name="pubs" ConnectionStringName="pubsConString" pollTime="900"/>
</базы данных>
</sqlCacheDependency>
</кэширование>
</система.веб>
Ниже приведен тестовый код. Когда страница загружается, выполняется следующий код:
protected void Page_Load(object sender, EventArgs e) {
if (HttpContext.Current.Cache["xxx"] == null) {
SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs — это пабы, указанные в разделе баз данных, за которыми следует имя таблицы.
HttpContext.Current.Cache.Insert("xxx", "xxx", d);
Response.Write("Создать новое значение кэша — xxx.");
}
еще{
Response.Write("Загрузить данные из кэша, значение равно "+HttpContext.Current.Cache["xxx"].ToString());
}
}
При первом открытии на этой странице будет отображаться:
Создать новое значение кэша — xxx.
После обновления страницы отображается:
Загрузить данные из кэша, значение — xxx.
При использовании анализатора запросов для изменения данных авторов и повторного обновления страницы отобразится:
Создать новое значение кэша — xxx.
Это показывает, что кэш работает нормально. Когда таблица авторов изменится, содержимое кэша автоматически станет недействительным, и мое приложение также заново создаст объект кэша.
Примечание. SqlCacheDependency состоит из двух конструкторов: SqlServer2000 поддерживает только два параметра, а один параметр поддерживает SqlServer2005.