2017-11-20 2 views
1

特定の地域のレベル2キャッシュを手動でクリアしようとしています。投稿されたメソッドがin answer to this questionであることがわかりました。これはエンティティをクリアするために働いていますが、何らかの理由でクエリキャッシュがクリアされていません。これにより、次回にエンティティがデータベースから取得されるときに、各エンティティに対する個別のクエリが生成されます。何もパラメータなしでsessionFactory.EvictQueries()を呼び出すと、ifが動作します。私が特定の地域名を渡しているときには機能しません。どのような問題が起こっているかについての任意のアイデア?Nhibernate特定の地域のキャッシュをクリアする

コードは、上記のリンクからです:

private void ClearRegion(string regionName) 
    { 
     _sessionFactory.EvictQueries(regionName); 

     foreach (var collectionMetaData in _sessionFactory.GetAllCollectionMetadata().Values) 
     { 
      var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister; 
      if (collectionPersister != null) 
      { 
       if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName)) 
       { 
        _sessionFactory.EvictCollection(collectionPersister.Role); 
       } 
      } 
     } 

     foreach (var classMetaData in _sessionFactory.GetAllClassMetadata().Values) 
     { 
      var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister; 
      if (entityPersister != null) 
      { 
       if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName)) 
       { 
        _sessionFactory.EvictEntity(entityPersister.EntityName); 
       } 
      } 
     } 
    } 

キャッシングは、作業やNHProfilerを使用して検証されます。

+0

nhusersグループ(https://groups.google.com/forum/#!forum/nhusers)で聞いてみましたか? –

+0

問題があるかどうかを確認するには、コードと設定を共有する必要があります。 – Najera

答えて

0

私は問題を把握しました。エンティティマッピングで指定するのではなく、データを照会するときにキャッシュ領域を指定する必要があることはわかりませんでした。クエリに.CacheRegion("regionName")を追加した後、すべてが機能します。クエリを実行するときに領域を追加しないことで、領域名なしでクエリキャッシュに移動していました。そのため、地域名パラメータなしで.EvictQueries()と呼んだときに機能しました。

エンティティをマッピングするときに領域名(Fluentを使用する場合は.Region("regionName"))を追加する場合と、.CacheRegion("regionName")を使用してセッションを使用してクエリを行う場合は、領域名を追加する必要があります。

ありがとうございます。

関連する問題