Как получить nhibernate для кэширования таблиц, на которые ссылаются многие-к-одному - мой конфиг правильный? - PullRequest
0 голосов
/ 01 августа 2011

Я пытался заставить это работать некоторое время безуспешно.Я хочу включить кэш 2-го уровня, чтобы предотвратить выборку из некоторых справочных таблиц.

Я настроил свою конфигурацию в коде

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 я добавил атрибут кеша:

<?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 Ответ

1 голос
/ 01 августа 2011

Вам также необходимо добавить объявление кэша для отношения (LockStatus).

также-

  1. вы можете использовать протоколирование nHibernate , чтобы точно увидеть sql, отправляемый при каждом вызове.
  2. Я не понимаю, почему вы хотите использовать SQLQuery в вашем случае; Вы можете просто использовать Query или QueryOver.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...