0

NHibernate の第 2 レベルのキャッシュ プロバイダー SysCache2 と SqlCacheDependency を使用して、ルックアップ テーブルのキャッシュを構成しようとしています。

単一の Country テーブルでフレームワークをテストしていますが、NHibernate のログを読むと、キャッシュが機能しないことがわかります..そして、その理由がわかりません。

私は無知です:/

SqlCacheDependency は、データベースとテーブル LUT_Countries で有効になっています。

Web.Config:

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <caching>
        <sqlCacheDependency enabled="true" pollTime="30000"> <!--  -->
            <databases>
                <clear />
                <add name="Default" connectionStringName="Test" />
            </databases>
        </sqlCacheDependency>
    </caching>
</system.web> 

<syscache2>
    <cacheRegion name="CountriesRegion" relativeExpiration="604800">
        <dependencies>
            <tables>
                <add name="Countries" databaseEntryName="Default" tableName="LUT_Countries" />
            </tables>
        </dependencies>
    </cacheRegion>
</syscache2>

流暢な構成:

        _baseConfiguration = Fluently.Configure()
                                     .ExposeConfiguration(c =>
                                     {
                                         c.SetProperty("connection.isolation", "ReadCommitted");
                                         c.SetProperty("show_sql", "true");
                                         c.SetProperty("format_sql", "true");
                                     })
                                     .Database(MsSqlConfiguration.MsSql2008.ConnectionString(_connectionString))
                                     .Cache(c => c.ProviderClass<SysCacheProvider>()
                                                                .UseSecondLevelCache()
                                                                .UseQueryCache());

NHibernate の Country Fluent マッピング:

public class CountryMap : ClassMap<Country>
{
    public CountryMap()
    {
        Cache.IncludeAll().ReadOnly().Region("CountriesRegion");

        Table("LUT_Countries");

        Id(c => c.Code);

        Map(c => c.Name);
        Map(c => c.Alpha3IsoCode).Column("Alpha3_IsoCode");
        Map(c => c.NumericCode);
    }
}

Hibernate のログ:

...

14:20:53.544 : DEBUG : キャッシュ対象: CountryRegion 使用方法: 読み取り専用

14:20:53.546 : WARN : 変更可能な読み取り専用キャッシュが構成されています: CountryRegion

14:20:53.551 : DEBUG : 構成からキャッシュ領域「CountriesRegion」を構築しています

14:20:53.559 : DEBUG : キャッシュ領域の構成

14:20:53.559 : DEBUG : 優先度を使用: デフォルト

14:20:53.559 : DEBUG : 相対有効期限 :7.00:00:00 を使用

14:20:53.571 : DEBUG: SQL テーブルの依存関係、テーブルを使用した「Countries」、「LUT_Countries」、およびデータベース エントリを構成しています。'デフォルト'

...

14:20:53.811 : DEBUG : クラス SessionFactoryObjectFactory を初期化しています

14:20:53.813: デバッグ: 登録済み: 311e0b6b7e7a41b289b4347267f963f9 (名前なし)

14:20:53.813: 情報: 名前が構成されていません

14:20:53.813 : DEBUG : インスタンス化されたセッション ファクトリ

14:20:53.817 : 情報: リージョンで更新タイムスタンプ キャッシュを開始しています: UpdateTimestampsCache

14:20:53.817 : DEBUG : 構成されていないキャッシュ領域を構築しています : UpdateTimestampsCache

14:20:53.817 : DEBUG : キャッシュ領域の構成

14:20:53.817 : DEBUG : デフォルトを使用して優先順位が指定されていません : デフォルト

14:20:53.817: DEBUG: デフォルトを使用して有効期限が指定されていません: 00:05:00

14:20:53.819 : 情報: リージョンでクエリ キャッシュを開始しています: NHibernate.Cache.StandardQueryCache

14:20:53.819 : DEBUG : 構成されていないキャッシュ領域を構築しています : NHibernate.Cache.StandardQueryCache

14:20:53.819 : DEBUG : キャッシュ領域の構成

14:20:53.819 : DEBUG : デフォルトを使用して優先順位が指定されていません : デフォルト

14:20:53.819 : DEBUG : デフォルトを使用して有効期限が指定されていません: 00:05:00

14:20:53.825 : DEBUG : 0 個の名前付き HQL クエリをチェックしています

14:20:53.825 : DEBUG : 0 個の名前付き SQL クエリをチェックしています

14:20:53.868 : DEBUG : [session-id=76cd9097-abc6-49f4-9fcb-2f5a0ca446ae] がタイムスタンプでセッションを開きました: 5622576143695872、セッション ファクトリの場合: [/311e0b6b7e7a41b289b4347267f963f9]

14:20:54.169 : DEBUG : 式 (部分的に評価): 値 (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])

14:20:54.191 : DEBUG : HQL クエリ プランがキャッシュにありません。生成 (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])

14:20:54.922 : DEBUG : 選択 << 開始 [レベル = 1、ステートメント = 選択]

14:20:54.957: DEBUG: FromClause{level=1}: Web.DataAccess.ORM.Models.Country ( 0) -> country0

14:20:54.992: デバッグ: 解決済み: 0 -> country0 .Code

14:20:55.000 : DEBUG : 選択 : 仕上げ中 [レベル=1、ステートメント=選択]

14:20:55.004 : DEBUG : processQuery() : ( SELECT ( {select 句} country0_.Code ) ( FromClause{level=1} LUT_Countries country0_ ) )

14:20:55.065 : DEBUG : FROM フラグメントの使用 [LUT_Countries country0_]

14:20:55.070 : DEBUG : 選択 >> 終了 [レベル = 1、ステートメント = 選択]

14:20:55.073: デバッグ: throwQueryException(): エラーなし

14:20:55.199 : DEBUG : SQL: country0_.Code を Code1_ として、country0_.Name を Name1_ として、country0_.Alpha3_IsoCode を Alpha3_1_ として、country0_.NumericCode を NumericC4_1_ として LUT_Countries country0_ から選択します

14:20:55.199: デバッグ: throwQueryException(): エラーなし

14:20:55.255 : DEBUG : HQL クエリ プランがキャッシュにありました (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])

14:20:55.263: デバッグ: 検索: NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]

...

14:20:55.639 : DEBUG : 結果セット行: 11

14:20:55.639 : DEBUG : 「AP」を列として返す: Code1_

14:20:55.639 : DEBUG : 結果行: EntityKey[Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639 : DEBUG : DataReader からオブジェクトを初期化しています: [Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639 : DEBUG : ハイドレーティング エンティティ: [Web.DataAccess.ORM.Models.Country#AP]

14:20:55.639 : DEBUG: 「アジア/太平洋地域」を列として返す: Name1_

14:20:55.639 : DEBUG : 「AP」を列として返す: Alpha3_1_

14:20:55.639 : DEBUG: 列として '0' を返す: NumericC4_1_

14:20:55.639 : DEBUG : 結果セット行: 12

...

14:20:55.701: デバッグ: IDataReader を閉じて、IDataReaders を開きます:0

14:20:55.702 : DEBUG : DataReader は 290 ミリ秒後に閉じられました

14:20:55.704: DEBUG: IDbCommand を閉じ、IDbCommands を開きます: 0

14:20:55.707 : DEBUG : データベース接続を積極的に解放しています

14:20:55.707 : DEBUG : 接続を閉じています

14:20:55.713 : DEBUG : ハイドレートされたオブジェクトの合計: 251

14:20:55.722 : DEBUG : [Web.DataAccess.ORM.Models.Country#A1] の関連付けを解決しています

14:20:55.730 : DEBUG : 第 2 レベルのキャッシュにエンティティを追加します: [Web.DataAccess.ORM.Models.Country#A1]

14:20:55.736: デバッグ: キャッシュ: Web.DataAccess.ORM.Models.Country#A1

14:20:55.740 : DEBUG : リージョンのルート キャッシュ アイテムが見つかりません。

14:20:55.744 : DEBUG : キャッシュ リージョンのルート キャッシュ エントリを作成しています: CountryRegion

14:20:55.745 : DEBUG : 変更通知のキャッシュ依存関係を登録しています

14:20:56.042 : DEBUG : キャッシュの依存関係をルート キャッシュ エントリにアタッチしています。変更が検出されると、キャッシュ エントリは削除されます。

14:20:56.045 : DEBUG : 新しいデータの追加: key=NHibernate-Cache:CountriesRegion:Web.DataAccess.ORM.Models.Country#A1@-1467239096 & value=NHibernate.Cache.Entry.CacheEntry

14:20:56.047 : DEBUG : アイテムの有効期限: 2013 年 7 月 8 日 17:20:56

14:20:56.058 : DEBUG : 実体化完了 [Web.DataAccess.ORM.Models.Country#A1]

14:20:56.061 : DEBUG : [Web.DataAccess.ORM.Models.Country#A2] の関連付けを解決しています

14:20:56.061 : DEBUG : 第 2 レベルのキャッシュにエンティティを追加します: [Web.DataAccess.ORM.Models.Country#A2]

14:20:56.061: デバッグ: キャッシュ: Web.DataAccess.ORM.Models.Country#A2

... ... .


5 秒後に 2 回目の実行を行うと、最初と同じように新しい SQL クエリが生成され、次のログの多くが出力されます (戻り値とキャッシュへの登録:


15:17:34.076 : DEBUG : [session-id=e1feb78d-6c3e-40a4-8b46-6d5742bd0f85] タイムスタンプでセッションを開きました: 5622590071095296、セッション ファクトリの場合: [/0ee3e73fbf6741d28adcff632c68b671]

15:17:34.077 : DEBUG : 式 (部分的に評価): 値 (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])

15:17:34.077 : DEBUG : HQL クエリ プランがキャッシュにありました (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])

15:17:34.077 : DEBUG : HQL クエリ プランがキャッシュにありました (NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country])

15:17:34.077: デバッグ: 検索: NHibernate.Linq.NhQueryable`1[Web.DataAccess.ORM.Models.Country]

15:17:34.077 : DEBUG : 名前付きパラメータ: {}

15:17:34.077: DEBUG: 新しい IDbCommand を開き、IDbCommands を開きます: 1

15:17:34.077 : DEBUG : SqlString の IDbCommand オブジェクトの作成: country0_.Code を Code1_ として、country0_.Name を Name1_ として、country0_.Alpha3_IsoCode を Alpha3_1_ として、country0_.NumericCode を NumericC4_1_ として LUT_Countries country0_ から選択します

15:17:34.077 : 情報 : country0_.Code を Code1_ として、country0_.Name を Name1_ として、country0_.Alpha3_IsoCode を Alpha3_1_ として、country0_.NumericCode を NumericC4_1_ として LUT_Countries country0_ から選択します

15:17:34.078 : DEBUG : ドライバーから IDbConnection を取得しています

15:17:34.079 : DEBUG : ExecuteReader に 1 ミリ秒かかりました

15:17:34.079 : デバッグ: IDataReader を開き、IDataReaders を開きます: 1

15:17:34.079 : DEBUG : 結果セットの処理

15:17:34.079 : DEBUG : 結果セットの行: 0

15:17:34.080 : DEBUG : 'A1' を列として返す: Code1_

15:17:34.080 : DEBUG : 結果行: EntityKey[Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080 : DEBUG : DataReader からオブジェクトを初期化しています: [Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080 : DEBUG : ハイドレーティング エンティティ: [Web.DataAccess.ORM.Models.Country#A1]

15:17:34.080 : DEBUG : 「匿名プロキシ」を列として返す: Name1_

15:17:34.080 : DEBUG : 'A1' を列として返す: Alpha3_1_

15:17:34.080 : DEBUG : 列として '0' を返す: NumericC4_1_

15:17:34.080 : DEBUG : 結果セットの行: 1

...

4

1 に答える 1

0

これをトランザクションで実行し、最後にトランザクションをコミットする必要があります。

NHibernate は、トランザクションが正常にコミットされた場合にのみ、第 2 レベルのキャッシュを更新します。NHibernate トランザクションを開始しない場合、NHibernate は、結果がキャッシュされるのに十分であるかどうかを認識できません。

于 2013-11-26T15:15:36.840 に答える