必要なのは、@RenusRusanuが述べたようにSqlCacheDependencyを有効にすることです。
Githubサイトにいくつかの実例があります。LearningProjects (サードパーティの編集)でコードを参照
してください。
SqlCacheDependencyを使用するには、最初にデータベースを構成する必要があります。
SQL依存関係を使用するには、データベースで基本的に2つのことを構成する必要があります。
テーブルで構成されるデータベースインフラストラクチャを作成し、プロシージャを格納してaspnet_regsql.exe
、次のように構成します。
/* For SQL Server authentication... */
aspnet_regsql.exe -S server -U user -P password -d database -ed
/* For Windows Authentication... */
aspnet_regsql.exe -S server -E -d database -ed
監視するテーブルと、必要なインフラストラクチャテーブルにデータを入力するためのそのテーブルへのトリガーを指定することで構成されるポーリング情報を作成します。
/* For SQL Server authentication... */
aspnet_regsql.exe -S server
-U user -P password -d database -t tableName -et
/* For Windows Authentication... */
aspnet_regsql.exe -S server
-E -d database -t tableName -et
コード構成
var s = new SqlCacheDependency("AdventureWorks", "Product");
HttpContext.Current.Cache.Insert(
"products",
h,
s,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration);
AdventureWorks
名前は、web.configファイルで構成されたSQL依存関係の名前です。
<caching>
<sqlCacheDependency enabled="true" pollTime="30000" >
<databases>
<add
name="AdventureWorks"
connectionStringName="AdventureWorksPolling" />
</databases>
</sqlCacheDependency>
</caching>
は要素pollTime
で構成でき<add ...
、グローバルをオーバーライドしますpolltime
または、SqlDataSourceコントロールに依存することもできます
このコントロールを使用するときにキャッシュを有効にするには、DataSourceMode
プロパティをに設定する必要がありますDataSet
。この場合、前に説明したようにデータベースを構成する必要はありません。
この例をアップロードしました(完全に機能する例)
ASPX
<asp:SqlDataSource runat="server" ID="sds"
ConnectionString="<%$ConnectionStrings:pubsConnectionString %>"
CacheDuration="30"
EnableCaching="true"
SelectCommand="select * from jobs"
DataSourceMode="DataSet"
OnSelecting="sds_Selecting">
</asp:SqlDataSource>
<div>
<asp:Literal runat="server" ID="msg" Mode="Encode"></asp:Literal>
</div>
<asp:GridView runat="server" DataSourceID="sds"></asp:GridView>
編集1
SqlCacheDependencyを使用するときにトリガーを選択的に起動するには、手動で生成されたトリガーを更新する必要があります。
コマンドを使用してテーブルを構成するaspnet_regsql -t -et...
と、指定したテーブルにトリガーが追加されます。このトリガーはAspNet_SqlCacheTablesForChangeNotification
、データベースからデータをポーリングするためにSqlCacheDependencyオブジェクトによって使用されるテーブルにデータを取り込むために使用されます。
トリガーは次のようになります。
ALTER TRIGGER [dbo].[jobs_AspNet_SqlCacheNotification_Trigger] ON [dbo].[jobs]
FOR INSERT, UPDATE, DELETE AS BEGIN
SET NOCOUNT ON
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'jobs'
END
dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedureN'jobs'
関心のある行が更新されたときにストアドプロシージャを呼び出すようにトリガーを更新できます
私はSQLの専門家ではありませんが、変更された行を検出するためのクリーンな方法を見つけるのは簡単だと思います。たとえば、グーグルでこのリンクを見つけました。
MSSQLServerで列の変更を検出するための最も効率的な方法