3

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

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

2010-10-02 07: 36: 03020 DEBUG NHibernate.AdoNet.AbstractBatcher - Закрытой IDbCommand, открытая IDbCommand s: 0 2010-10-02 07: 36: 03382 ERROR NHibernate.Event.Default.AbstractFlushingEventListener - Не удался син chronize состояния базы данных с сессией NHibernate.HibernateException: Произошло исключение при выполнении пакетные запросы ---> System.Data.S qlClient.SqlException: тайм-аут истек. Промежуток времени истекает до завершения операции или сервер не отвечает. в System.Data.SqlClient.SqlConnection.OnError (SqlException исключение, Boolean breakConnection)

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

+0

это веб-приложение, я предполагаю? – hardba11

+0

Извините, не сказал этого. Нет, это обычное настольное приложение. – Alex

+0

Вы используете дозирование ('adonet.batch_size'> 0)? Почему у вас есть конфигурация ActiveRecord * и * отдельная конфигурация NHibernate? Какая инструкция SQL выдает время (обновление/вставка/выбор/удаление)?Какую версию NHibernate и ActiveRecord вы используете? –

ответ

5

Правильно, что значение 0 указывает на отсутствие таймаута (как defined in the MSDN docs), однако в то время как NHibernate's driver passes the config value to the db command when it's >= 0, условие дозатора checks that the value is > 0.

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

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

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

+0

Спасибо, Маурицио! – Alex

+0

Я попытался увеличить время ожидания (от 1000 до 10000) и уменьшить размер партии (от 1000 до 100), теперь я получаю исключение NHibernate.TransactionException: транзакция не подключена или была отключена в довольно случайном месте моих пакетных операций. Зачем? – Alex

+0

Hm ... Я снова получаю исключение тайм-аута, что невозможно для такого значения длинного таймаута. Один из моих друзей сказал мне, что Nhibernate TransactionScope, который я использую, не использует пользовательский тайм-аут. Вам известно какое-либо обходное решение для заполнения таймаута из файла конфигурации в TransactionScope? – Alex

0

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

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

How to set Nhibernate LINQ Command Timeout using Session.Query