NHibernate - Как сопоставить класс, у которого нет таблицы (для пользовательских запросов sql)

Обновление - Конфигурация отредактирована для удобства чтения в 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»).

Идея состоит в том, что это сопоставление регулярных выражений (а их много из них) вызывается очень часто (несколько тысяч в секунду), и мы обнаружили, что операции с подстроками убивают производительность памяти.

Спасибо за вашу помощь!

22
задан Vincent de Lagabbe 4 May 2011 в 14:23
поделиться