NHibernate: получить все открытые сессии

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

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

1 ответ

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

Создайте класс со слабой ссылкой на 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;
}

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

Другие вопросы по тегам