2011-08-01 1 views
0

私はこれをしばらくの間稼働させようとしています。私はいくつかのルックアップテーブルからのフェッチを防ぐために第2レベルのキャッシュを有効にしたい。多対1で参照されるテーブルをキャッシュするためのnhibernateの取得方法 - 私の設定は正しいですか?

は、私はキャッシュ属性を追加私のxml構成に

cfg = new Configuration(); 
cfg.Properties[NHibernate.Cfg.Environment.ConnectionProvider] = "NHibernate.Connection.DriverConnectionProvider"; 
string connectionString = connection.ConnectionString; 
cfg.Properties[NHibernate.Cfg.Environment.ConnectionString] = connectionString; 
cfg.Properties[NHibernate.Cfg.Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver"; 
cfg.Properties[NHibernate.Cfg.Environment.Dialect] = "NHibernate.Dialect.MsSql2005Dialect"; 
cfg.Properties[NHibernate.Cfg.Environment.CommandTimeout] = "720"; 
cfg.Properties[NHibernate.Cfg.Environment.CacheProvider] = "NHibernate.Cache.HashtableCacheProvider"; 
cfg.Properties[NHibernate.Cfg.Environment.UseSecondLevelCache] = "true"; 
cfg.Properties[NHibernate.Cfg.Environment.UseQueryCache] = "true"; 
cfg.AddAssembly("APPName.PersistentEntities"); 
factory = cfg.BuildSessionFactory(); 

その後コードで私の構成を設定:

このエンティティは、その後、他の非キャッシュエンティティから参照される
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="APPName.PersistentEntities.LockStatus, APPName.PersistentEntities" table="LockStatus" lazy="false"> 
    <meta attribute="class-description">lockstatus</meta> 
    <cache usage="read-only" /> 
    <id name="Id" column="Id" type="Int32" unsaved-value="0"> 
     <generator class="native"></generator> 
    </id> 
    <property name="Name" column="Name" type="String" length="100" not-null="true"/> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="APPName.PersistentEntities.Entity, APPName.PersistentEntities" table="Entity" lazy="false"> 
     <meta attribute="class-description">entity</meta> 
     <id name="Id" column="Id" type="Int32" unsaved-value="0"> 
      <generator class="native"> 
      </generator> 
     </id> 

     <property name="Name" column="Name" type="String" length="500" not-null="true"> 
      <meta attribute="field-description">name</meta> 
     </property> 

     <many-to-one name="LockStatus" column="LockStatusId" class="APPName.PersistentEntities.LockStatus, APPName.PersistentEntities" not-null="false" lazy="false"> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

>

私のようなもので、この他のエンティティを照会:

session = factory.OpenSession(); 
IList<T> s = session.CreateSQLQuery(query).AddEntity(typeof(T)).SetCacheable(true).List<T>(); 
session.Clear(); 
session.Close(); 

クエリとマッピングはその私は、データベース内の名前を更新しようとキャッシュを使用して確認するために、とても細かい実行されます。アプリケーションでもう一度クリックすると、更新された名前が表示されるので、キャッシュを再クエリしていないと仮定します。

答えて

1

リレーションにもキャッシュ宣言を追加する必要があります(LockStatus)。

  1. also-あなたはすべての呼び出しに送信され、正確にSQLを確認するためにnHibernate's loggingを使用することができます。
  2. あなたのケースでSQLQueryを使用する理由がわかりません。 QueryまたはQueryOverをそのまま使用することができます。
+0

申し訳ありません、申し訳ありませんが、関係にどのようにキャッシュ宣言を指定しますか? - に追加しようとしましたが、エラー –

+0

が表示されます。http://bstansberry.wordpress.com/2009/10/09/collection-caching-in-the-hibernate-second-level-cache/ –

+0

doesn本当に助けになる - そのページ(と私が読んだことのある他のもの)はセットのキャッシュについて話す。 1対多ではありますが、1対多の対話では、このシナリオでキャッシュすることは可能ですか? –

関連する問題