nhibernate одна сессия тот же idbconnection

У меня есть код, выполняющий 2 раза session.Get(id) на одном и том же ISession. Я вижу, что ISession создает 2 соединения idb. Я предполагаю, что это из-за какой-то конфигурации. Я хотел бы, чтобы он выполнял выборку по тому же idbconnection. Как?


person Stig    schedule 12.03.2011    source источник


Ответы (1)


Если обе операции Get находятся в одной транзакции, они будут использовать один и тот же IDbConnection. В противном случае вы получите неявные транзакции, и NHibernate будет открывать и закрывать IDbConnection для каждого запроса. В общем, вы должны попробовать сделать что-то вроде:

using (var tx = session.BeginTransaction())
{
    var customer = session.Get<Customer>(123);
    var order = session.Get<Order>(456);

    // do stuff

    tx.Commit();
}

Использование неявных транзакций не рекомендуется:

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

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

person Mike Valenty    schedule 12.03.2011
comment
Спасибо, Михаил, все работает. Но разве нельзя иметь долгоживущие idbconnections без транзакций? - person Stig; 12.03.2011
comment
Нашел connection.release_mode = on_close, делай, что хочу. - person Stig; 12.03.2011