Обновление - Конфигурация отредактирована для удобства чтения в 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, чтобы указать на какие-либо проблемы. (Я не строка fooBarString = @ "foo bar"; Match match1 = re.Match (fooBarString, 4); Console.WriteLine (String ....
Кто-нибудь знает, почему вывод этого кода:
Regex re = new Regex("^bar", RegexOptions.Compiled); string fooBarString = @"foo bar"; Match match1 = re.Match(fooBarString, 4); Console.WriteLine(String.Format("Match 1 sucess: {0}", match1.Success)); Match match2 = re.Match(fooBarString.Substring(4)); Console.WriteLine(String.Format("Match 2 sucess: {0}", match2.Success));
:
Успешное совпадение 1: Ложь
Успешное совпадение 2: Истина
?
Ожидаемое поведение, конечно, «Истина» и «Истина» (иначе я действительно не знаю, для чего должен быть полезен параметр «startat»).
Идея состоит в том, что это сопоставление регулярных выражений (а их много из них) вызывается очень часто (несколько тысяч в секунду), и мы обнаружили, что операции с подстроками убивают производительность памяти.
Спасибо за вашу помощь!