Исключение тайм-аута, когда тайм-аут установлен на бесконечное время - PullRequest
3 голосов
/ 02 октября 2010

В моем приложении C # .NET 3.5 я использую CastleProject ActiveRecord поверх NHibernate. Это настольное приложение, использующее MS SQL Server 2008. Я установил тайм-аут команды ADO на 0, чтобы предотвратить исключение тайм-аута во время массовых операций:

  <activerecord>
    <config>
      ...
      <add key="hibernate.command_timeout" value="0" />
    </config>
  </activerecord>

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

Однако я все еще получаю исключение тайм-аута! Журнал NHibernate показывает что-то вроде этого:

Где-то в начале:

2010-10-02 06: 29: 47,746 ИНФОРМАЦИЯ NHibernate.Driver.DriverBase - установка времени ожидания команды ADO.NET на 0 секунд

Где-то в конце:

2010-10-02 07: 36: 03,020 ОТЛАДКА NHibernate.AdoNet.AbstractBatcher - Закрытый IDbCommand, открытый IDbCommand s: 0 2010-10-02 07: 36: 03,382 ОШИБКА NHibernate.Event.Default.AbstractFlushingEventListener - Не удалось синхронизировать состояние базы данных с сеансом NHibernate.HibernateException: An возникла исключительная ситуация при выполнении Пакетные запросы ---> System.Data.S qlClient.SqlException: время ожидания истекший. Истек срок ожидания до завершения операции или сервер не отвечает. в System.Data.SqlClient.SqlConnection.OnError (SqlException исключение, Boolean breakConnection)

Как получилось? Как это исправить?

Ответы [ 2 ]

5 голосов
/ 03 октября 2010

Правильно, что значение 0 указывает на отсутствие времени ожидания (как , определенное в документах MSDN ), однако, в то время как драйвер NHibernate передает значение конфигурации команде db, когда оно> = 0 , условие дозатора проверяет, что значение> 0 .

Поэтому, когда вы устанавливаете пакетирование со значением времени ожидания 0, значение не переносится в команду db, поэтому оно остается по умолчанию.

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

Пожалуйста, подтвердите это с помощью разработчиков NHibernate.

0 голосов
/ 26 марта 2014

Возможно, вы пытаетесь установить время ожидания для определенных запросов, а не на уровне web.config (в противном случае вам действительно нужно настроить приложение :)).

Недавно я нашел ответ, который мне помог:

Как установить время ожидания команды Nhibernate LINQ с помощью Session.Query

...