У нас есть несколько длительных процессов бэкенда, которые занимают больше времени, чем значение по умолчанию 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>
Для обхождения этого я пытаюсь установить NHibernate command_timeout на 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 секунд.
Я создал консольное приложение, которое называет ДАО точно так же, как веб-приложение делает это. У меня есть тот же самый параметр конфигурации NHibernate в его конфигурационном файле. IDbCommand испытывает таймаут после 60 секунд а не 30, с помощью установки успешно из файла конфигурации.
Я пытался отладить приложение и проверку, если commandTimeout был установлен, когда блок ДАО называют с веб-сайта. Это было.
Это от часов Visual Studio:
((NHibernate. Драйвер. DriverBase) (((NHibernate. Соединение. DriverConnectionProvider) ((NHibernate. Impl. SessionFactoryImpl) сессия. SessionFactory).ConnectionProvider).Driver)) .commandTimeout: 60
Сессия создается как это:
ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);
Мой вопрос: если поле тайм-аута команды было успешно установлено на 60 от моего Web.config, почему это испытывает таймаут после 30 секунд? Какие-либо идеи я мог попробовать?
Это практически невозможно из-за плохой поддержки браузера. Вы можете упаковывать их в tar или застежку -молнию файл на стороне сервера и обслуживать архивный файл, хотя.
-121--4561319-Это метка порядка байтов. http://en.wikipedia.org/wiki/Byte_order_mark
-121--3941893-Меткой порядка байтов (BOM) является Юникод символ, используемый для сигнализации endianness (порядок байтов) текстового файла или поток.
Тайм-аут можно установить как часть свойства 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>
EDIT
Оказалось, что фактически имеется два тайм-аута. Спасибо адомокосу, что указал на это. Один - для фактического открытия соединения, а другой - для выполняемых запросов.
Выше отображается сообщение для подключения, однако для установки тайм-аута для запроса с NHibernate используется интерфейс ICriteria
.
ICriteria crit = session.CreateCriteria(typeof(Foo));
crit.SetTimeout(120);
List<Foo> fooList = crit.List();
Время ожидания в секундах.
Надежда, что поможет