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

В моем приложении 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 INFO NHibernate.Driver.DriverBase - установка времени ожидания команды ADO.NET на 0 секунд

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам