NHibernate: получить все открытые сессии - PullRequest
2 голосов
/ 21 октября 2011

У меня есть приложение ASP.NET с NHibernate, по какой-то причине немногие разработчики забыли закрыть сессии на некоторых страницах (я думаю, что их было 20), я знаю, что лучшее решение - это просмотреть каждую страницу и убедиться, что сессии закрыты правильно, но я не могу сделать такое движение, потому что код уже находится в производстве. Поэтому я пытался найти способ получить все открытые сеансы в фабрике сеансов, а затем закрыть его с помощью главной страницы или с помощью дополнительного процесса, но я не могу найти способ сделать это.

Итак, есть ли способ получить все открытые сессии? или, может быть, установить время ожидания сеанса или что-то, что вы предлагаете? Спасибо за совет.

1 Ответ

1 голос
/ 22 ноября 2011

Насколько я знаю, нет поддержки для получения списка открытых сессий от фабрики сессий. У меня есть свой собственный способ следить за открытыми сессиями, и я использую эту конструкцию:

Создать класс со слабой ссылкой на ISession. Таким образом, вы не будете прерывать сборщик мусора, если сессии будут собирать мусор:

public class SessionInfo
{
    private readonly WeakReference _session;

    public SessionInfo(ISession session)
    {
        _session = new WeakReference(session);
    }

    public ISession Session
    {
        get { return (ISession)_session.Target; }
    }
}

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

List<SessionInfo> OpenSessions = new List<SessionInfo>();

и в DAL (уровень доступа к данным) у меня есть этот метод:

public ISession GetNewSession()
{
    if (_sessionFactory == null)
        _sessionFactory = createSessionFactory();      
    ISession session = _sessionFactory.OpenSession();
    OpenSessions.Add(new SessionInfo(session));
    return session;
}

Таким образом, я веду список открытых сессий, которые я могу запрашивать при необходимости. Возможно, это отвечает вашим потребностям?

...