Обновление - Конфигурация отредактирована для удобства чтения in SO
Привет,
Я изучаю NHibernate день или два, но застрял на одном этапе.
Мне нужно иметь возможность выполнять пользовательские хранимые процедуры и использовать NHibernate для их сопоставления с доменом классы.
У меня это работает для сценария, когда пользовательский запрос сопоставляется с объектом, который сопоставляется с таблицей базы данных, как показано во многих примерах nhibernate (см. первый раздел ниже).
Однако в конфигурации для во втором разделе ниже запрос извлекает только 2 столбца из целевой таблицы. По этой причине я создал специальный объект, чтобы NHibernate было что сопоставить с возвращаемыми значениями. Свойства настраиваемого объекта имеют то же имя, что и столбцы, возвращаемые настраиваемой процедурой.
Когда я запускаю свои тесты, я получаю исключение вроде:
NHibernate.MappingException: Нет настаивать на: каждый получает данные с медленного сервера через Интернет, а затем использует локальную базу данных для записи этих данных (так что процесс привязан к Интернету, а не к локальной сети или процессору).
С некоторой регулярностью я получаю наводнение / шквал / пакет следующей ошибки из нескольких потоков одновременно:
System.Data.SqlClient.SqlException (0x80131904): Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает.
Стек вызовов для этой ошибки обычно:
в System.Data.ProviderBase.DbConnectionPool.GetConnection (DbConnection owningObject)
в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection)
в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory connectionFactory)
в System.Data. SqlClient.SqlConnection.Open ()
Я не указываю тайм-аут соединения в строке соединения, и в этой базе данных работают другие приложения и процессы. Кто-нибудь сталкивался с таким поведением, и если да, то что было сделано для его предотвращения?
Наиболее часто вызываемый метод на моем уровне доступа к данным выглядит так, и все мои другие методы DAL используют тот же подход:
using (SqlConnection con = new SqlConnection(GetConnectionString())) using (SqlCommand cmd = new SqlCommand("AddGdsMonitorLogEntry", con)) { cmd.CommandType = CommandType.StoredProcedure; /* setting cmd.Parameters [snipped] */ // We have been getting some timeouts writing to the log; wait a little longer than the default. cmd.CommandTimeout *= 4; con.Open(); cmd.ExecuteNonQuery(); }
Большое спасибо!
РЕДАКТИРОВАТЬ
Учитывая комментарии об этом, происходящем в зеркальных средах, я действительно должен упомянуть, что данная база данных является зеркальной. В SSMS он помечен как «Основной, синхронизированный» в режиме «Высокая безопасность без автоматического переключения при отказе (синхронный)».
РЕДАКТИРОВАТЬ 26.05.11
Я не вижу ничего в журналах SQL Server, чтобы указать на какие-либо проблемы. (Я не у меня нет доступа к средству просмотра событий Windows на этом сервере, но я попросил кого-нибудь меня найти.)