Изменение тайм-аута команды NHibernate Session.Save - PullRequest
12 голосов
/ 25 февраля 2010

У нас есть несколько длительных внутренних процессов, которые занимают больше времени, чем 30 секунд по умолчанию.

Наша версия NHibernate - 2.0.1.4000, а Spring.NET - 1.2.0.20313. NHibernate настраивается через Spring.NET следующим образом:

<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20">
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="MappingAssemblies">
        <list>
            <value>SomeKindOfAnItem</value>
        </list> 
    </property>
    <property name="HibernateProperties">
        <dictionary>
            <entry key="expiration" value="120"/>
            <entry key="adonet.batch_size" value="10"/>
            <entry key="cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache"/>
            <entry key="cache.use_query_cache" value="true"/>
            <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
            <entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
            <entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
            <entry key="current_session_context_class" value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate20"/>
            <entry key="show_sql" value="false"/>
        </dictionary>
    </property>
</object>

Чтобы обойти это, я пытаюсь установить для параметра command_timeout NHibernate значение 60 в файле Web.config. Это из Web.config:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="command_timeout">60</property>
  </session-factory>
</hibernate-configuration>

К сожалению, это не работает, команда истекает через 30 секунд.

Я создал консольное приложение, которое вызывает DAO точно так же, как это делает веб-приложение. У меня точно такой же параметр конфигурации NHibernate в его файле конфигурации. Время ожидания IDbCommand истекает через 60 секунд, а не через 30, при успешном использовании настройки из файла конфигурации.

Я попытался отладить приложение и проверить, был ли установлен параметр commandTimeout при вызове сборки DAO с веб-сайта. Это было.

Это из часов Visual Studio:

((NHibernate.Driver.DriverBase) (((NHibernate.Connection.DriverConnectionProvider) ((NHibernate.Impl.SessionFactoryImpl) session.SessionFactory) .ConnectionProvider) .Driver)). CommandTimeout: 60

Сессия создается так:

ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);

У меня такой вопрос: если в тайм-ауте команды было успешно установлено значение 60 из моего файла Web.config, то почему оно истекает через 30 секунд? Любые идеи, которые я мог бы попробовать?

1 Ответ

11 голосов
/ 25 февраля 2010

Вы можете установить время ожидания как часть свойства hibernate.connection.connection_string. Я не использовал Spring.Net, поэтому я не уверен, как он настраивает фабрику сессий NHibernate. Если вы можете добавить «Connect Timeout = 120» в строку подключения. Это должно увеличить время с 30 секунд по умолчанию до 120 секунд.

Следующая строка будет идти в web.config:

<property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=; Connect Timeout=120;</property>

РЕДАКТИРОВАТЬ

Оказывается, на самом деле есть два тайм-аута. Спасибо Adomokos за указание на это. Один для фактического открытия соединения, а другой для запросов, которые выполняются.

Один для подключения показан выше, однако для установки времени ожидания для запроса с NHibernate используется интерфейс ICriteria.

ICriteria crit = session.CreateCriteria(typeof(Foo)); 
crit.SetTimeout(120); 
List<Foo> fooList = crit.List();

Значение времени ожидания указывается в секундах.

Надеюсь, это поможет

...