5

私は頻繁に次の形式でクエリを実行します。

select * from SomeTable where id=12345

ユーザーがその行の値を必要とするため、ページごとに同じクエリを実行している可能性があります。通常、一度フェッチしてキャッシュしますが、ユーザーはいつでも行を変更でき、他のユーザーも同時に SomeTable を変更しているため、テーブル全体に対してキャッシュすることはできません。また、Web サーバー用のクラスターがあるため、キャッシュが無効になったときに Web サーバーで内部的に追跡できないという問題もあります。

この行で変更が発生したことを検出する方法はありますか? SqlDependecyCache クラスは、複数の Web サーバーへの個々の行に対してここで役立ちますか? Web アプリケーションに通知できるトリガーまたはその他のパラダイムはありますか?

私は両方の長所、つまり Web サーバーでのリアルタイムのキャッシュ更新を望んでいますが、行が変更されたかどうかを確認するためにクエリを実行したくありません。

4

2 に答える 2

3

必要なのは、@RenusRusanuが述べたようにSqlCacheDependencyを有効にすることです。

Githubサイトにいくつかの実例があります。LearningProjects (サードパーティの編集でコードを参照 してください。

SqlCacheDependencyを使用するには、最初にデータベースを構成する必要があります。

SQL依存関係を使用するには、データベースで基本的に2つのことを構成する必要があります。

  1. テーブルで構成されるデータベースインフラストラクチャを作成し、プロシージャを格納して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
    
  2. 監視するテーブルと、必要なインフラストラクチャテーブルにデータを入力するためのそのテーブルへのトリガーを指定することで構成されるポーリング情報を作成します。

        /* 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で列の変更を検出するための最も効率的な方法

于 2012-09-14T12:14:32.197 に答える
2

SqlCacheDependency、および はSqlDependency、あなたが説明したことを正確に行うことができます。どちらもQuery Notificationsに基づいています。これは、行が更新されたときにアプリケーションがサーバーから通知を受信できるようにするテクノロジーです。LINQからも活用できます。

ただし、頻繁に変更される値をキャッシュすると、効果よりも害が大きくなる可能性があるため、注意が必要です。これは、かなり安定した値でのみ行う必要があります。

于 2012-09-14T11:57:12.483 に答える