2017-02-14 16 views
1

Я работаю над проектом, в который каждый месяц нужно вставлять новый столбец в таблицу. В EntityFramework есть что-то вроде объединения соединений, что делает его лучшим выбором, чтобы максимально сократить время жизни контекста. Мы располагаем контекстом. Это относится к сеансу Nhibernate?Nhibernate и сеансовый пул

ISessionFactory sf = cfg.BuildSessionFactory(); 
ISession session = sf.OpenSession(); 
While(true) 
{ 
//....... 
    using (var tran = session.BeginTransaction()) 
    { 
     session.SaveOrUpdate(msg); 
     tran.Commit();       
    } 
    Thread.Sleep(1000); 
} 

Или

ISessionFactory sf = cfg.BuildSessionFactory(); 
While(true) 
{ 
//....... 
    using(var session = sf.OpenSession()) 
    { 
    using (var tran = session.BeginTransaction()) 
    { 
     session.SaveOrUpdate(msg); 
     tran.Commit();       
    } 
    Thread.Sleep(1000); 
    } 
} 

И, кажется, работают, но один я должен использовать?

+0

Возможный дубликат [Как долго может/должна быть открыта сессия NHibernate?] (Http://stackoverflow.com/questions/1243835/how-long-can-should-an-nhibernate-session-be-kept -open) – Fran

+0

Стоит взглянуть на метод OpenStatelessSession на интерфейсе 'SessionFactory'. Концепция сеанса без состояния кажется подходящей для того, что вы делаете. –

ответ

1

Ну, если я решу только ответить на ваш вопрос:

второй блок кода является более подходящим. Собственно, объединение соединений не имеет ничего общего с NHibernate. Это поведение базовой РСУБД.

В NHibernate создание SessionFactory является дорогостоящим и должно выполняться только один раз (при идеальном запуске) в течение срока службы приложения. Создание ISession не является дорогостоящим вызовом. Рекомендуется, чтобы ваш сеанс был максимально коротким.

Больше, чем просто ответить:

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

Кэш первого уровня предназначен для каждого сеанса. Если вы запускаете каждый вызов БД на новый сеанс, вы фактически не получаете преимущества кэширования.

То же самое верно для дозирования. Пакетирование выполняется на основе того, как вы обрабатываете транзакции. Звонок на tran.Commit(); играет важную роль наряду с некоторыми другими свойствами, такими как nhSession.FlushMode, nhSession.SetBatchSize. См. Статью this.
Для осуществления дозирования я рекомендую вам улучшить свой код и вместо того, чтобы совершать транзакцию в блоке using, вы делаете это на 100 (или 10 или 500, что вам подходит) итерации вашего цикла.

Refer this и this вопрос.

См. this ответ, как сказал @Fran в комментариях.

+0

Спасибо! Это очень помогает мне. Но в моем случае исходные данные приобретаются с физического устройства, которое генерирует одну штуку в секунду. Поэтому, если я делаю так, как вы сказали, сеанс должен жить в течение 500 секунд, прежде чем он совершит и удалит, что может нарушить первое правило. – joe

+0

Согласен; в любом случае, пакетная обработка не поможет вам. –