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
...