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

StackOverflow https://stackoverflow.com/questions/3844327

Вопрос

В моем приложении C # .NET 3.5 Я использую CastleProject Activerecord над Nibernate. Это настольное приложение с использованием 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 nibernate.driver.driverbase - Установка timeout команд ado.net до 0 секунд

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

2010-10-02 07: 36: 03 020 Отладка Nibernate.adonet.abstractBatcher - Закрыто idbcommand, Открыть idbcommand s: 0 2010-10-02 07: 36: 03,382 Ошибка nhibernate.event.default.abstractflushingeventListener - не может синхронизировать состояние базы данных С Session Nhibernate.hibernateException: исключение произошло при выполнении пакетных запросов ---> System.data.S QLClient.SQLException: Explay Timeout истек. Период тайм-аута, прошедший до завершения операции или сервера не отвечает. На System.data.sqlclient.sqlconnection.oneRror (исключение SQLException, Boolean Breaknection)

Почему? Как это исправить?

Это было полезно?

Решение

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

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

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

Пожалуйста, подтвердите это с помощью Nibernate Devs.

Другие советы

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

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

Как установить Timeout команд Nhibernate LINQ с помощью Session.Query

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top