Какой должна быть продолжительность сеанса NHibernate?

Способ иметь отдельную реализацию выглядит следующим образом.

//inner_foo.h

template <typename T>
struct Foo
{
    void doSomething(T param);
};


//foo.tpp
#include "inner_foo.h"
template <typename T>
void Foo<T>::doSomething(T param)
{
    //implementation
}


//foo.h
#include <foo.tpp>

//main.cpp
#include <foo.h>

inner_foo имеет форвардные объявления. foo.tpp имеет реализацию и включает inner_foo.h; и foo.h будет иметь только одну строку, чтобы включить foo.tpp.

Во время компиляции содержимое foo.h копируется в foo.tpp, а затем весь файл копируется в foo.h после который он компилирует. Таким образом, ограничений нет, и именование согласовано в обмен на один дополнительный файл.

Я делаю это, потому что статические анализаторы для кода разбиваются, когда он не видит передовые объявления класса в * .tpp. Это раздражает при написании кода в любой среде IDE или с помощью YouCompleteMe или других.

41
задан harriyott 4 October 2012 в 09:57
поделиться

5 ответов

[

]Вам нужна стратегия управления сеансом, которая позволит Вашему приложению эффективно работать и использовать преимущества того, что дает Вам NHibernate - в частности, кэширование и ленивая загрузка. [

] [

]Создание сеансов - недорогой процесс, требующий небольшого объема оперативной памяти или процессора, поэтому не стоит беспокоиться о сохранении или повторном использовании сеансов (действительно, повторное использование сеансов может привести к каким-то неприятным и непредвиденным побочным эффектам). Фабрика сеансов - дорогая вещь и должна быть построена один раз и только один раз при запуске приложения.[

] [

]Правило таково: время жизни сеанса должно быть достаточно продолжительным, чтобы у вас не осталось объектов, которые остаются в области видимости по окончании сеанса. [

] [

]По окончании сеанса все отслеживания изменений для объектов, которые вы получили из этого сеанса, прекращаются, так что эти изменения не сохраняются, если только вы намеренно не прикрепите этот объект к новому сеансу. Следовательно, сессия должна продолжаться до тех пор, пока объекты, которые Вы извлекли из неё, будут существовать. В веб-приложении это обычно означает сеанс для каждого запроса; в WinForms - сеанс для каждой формы.[

] [

] В вашем случае, когда служба (я предполагаю, что она работает []как [] служба Windows) выполняет работу NHibernate, вы, возможно, захотите рассмотреть возможность создания сеанса для каждого нового запроса от потребляющего настольного приложения, и его утилизации, когда этот запрос был обработан. Не зная точно, как работает ваша служба и какой механизм используется настольным приложением для разговора с ней (удаленное? WCF? Обычный старый SOAP?), я не могу быть более точным. [

] [

](Есть некоторые исключения из этого общего правила - допустим, у вас есть набор сохраняющихся объектов, которые представляют собой общий ресурс, к которому другой код будет обращаться, но не изменится, вы можете загрузить их заранее при запуске приложения и оставить отключенными)[

] [

]Если вы находите производительность вялой при такой стратегии, возможно, вы просто слишком много говорите с базой данных и ваш объектный график сложен; посмотрите на []кэширование второго уровня[] в этом случае.[

].
26
ответ дан 27 November 2019 в 00:53
поделиться
[

] Сессия должна соответствовать единице работы. Сессия должна оставаться живой, пока Вы работаете с объектами, извлеченными или сохраненными с помощью этой сессии.[

].
6
ответ дан 27 November 2019 в 00:53
поделиться
[

] В веб-приложении вы должны иметь по одной сессии на запрос. Это дает Вам полный контроль над временем работы сессии и упрощает обработку ошибок.[

] [

]В настольном приложении я рекомендую использовать сессию для одного докладчика (или формуляр, если Вы предпочитаете). Цитирую Ayende в статье []MSDN Magazine []:[

] [
] [

]Рекомендуемая практика для настольных приложений. приложения должны использовать одну сессию за формировать так, чтобы каждая форма в у приложения есть своя сессия. Каждая заявка форма обычно представляет собой особый произведение, которое понравится пользователю для выполнения, так что подходящий сеанс пожизненные работы довольно хорошо на практике. Добавленный преимущество в том, что у вас больше нет проблема с утечками памяти, потому что когда вы закрываете форму в приложение, вы также утилизируете сеанс. Это сделало бы все объекты, которые были загружены сессия, подлежащая рассмотрению сборщик мусора (GC).[

] [

]Есть дополнительные причины для того. предпочитая один сеанс в одной форме. Вы можете воспользоваться NHibernate's слежение за изменениями, так что он смывает все изменения в базе данных, когда вы совершить сделку. Также создает изоляционный барьер между различные формы, так что вы можете совершить изменения в одной организации без беспокоящийся об изменениях к другому сущности, которые показаны на других формы.[

] [
]
11
ответ дан 27 November 2019 в 00:53
поделиться
[

] Нет ни одного ответа, подходящего для всех ситуаций. Заседание 13 сессии []Лето Ниберната [] представляет собой хороший обзор вопроса. [

].
2
ответ дан 27 November 2019 в 00:53
поделиться
[

]Большая часть фреймворка NHibernate и фреймворка Microsoft ADO.NET Entity Framework похожи друг на друга. Вот очень хорошая статья о том, как Вы должны управлять жизненной линией ObjectContext в ADO.NET EF.[

] [

][]http://blogs.msdn.com/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifetime-for-your-objectcontext.aspx[][

] [

]Она должна применяться и к сеансам NHibernate.[

].
0
ответ дан 27 November 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: