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;
}
Таким образом, я поддерживаю список открытых сессий, которые я могу запрашивать при необходимости. Возможно, это отвечает вашим потребностям?