Исключение тайм-аута, когда тайм-аут установлен в бесконечное время
-
27-09-2019 - |
Вопрос
В моем приложении 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