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