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

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

25
задан ALEXintlsos 26 May 2011 в 14:09
поделиться