Asp.net mvc unsofwork and mysql и сонные соединения
-
29-09-2019 - |
Вопрос
У меня есть веб-приложение MVC, которое основано на следующей архитектуре
Asp.net mvc2, ninject, беглый nhibernate, mysql, который использует единицу работы шаблона.
Каждое соединение с MySQL генерирует соединение сна, которое можно рассматривать как запись в результатах запроса Proplist PlaceList.
В конце концов это будет достаточно создавать достаточно подключений к вешению пределе пула приложения и схватить веб-приложение.
Я подозреваю, что соединения не расположены правильно.
Если это так, куда это должно случиться?
Вот снимка кода, который я использую:
public class UnitOfWork : IUnitOfWork
{
private readonly ISessionFactory _sessionFactory;
private readonly ITransaction _transaction;
public ISession Session { get; private set; }
public UnitOfWork(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
Session = _sessionFactory.OpenSession();
Session.FlushMode = FlushMode.Auto;
_transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public void Dispose()
{
if (Session != null)
{
if (Session.IsOpen)
{
Session.Close();
Session = null;
}
}
}
public void Commit()
{
if (!_transaction.IsActive)
{
throw new InvalidOperationException("No active transation");
}
_transaction.Commit();
Dispose();
}
public void Rollback()
{
if (_transaction.IsActive)
{
_transaction.Rollback();
}
}
}
public interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
public class DataService
{
int WebsiteId = Convert.ToInt32(ConfigurationManager.AppSettings["Id"]);
private readonly IKeyedRepository<int, Page> pageRepository;
private readonly IUnitOfWork unitOfWork;
public PageService Pages { get; private set; }
public DataService(IKeyedRepository<int, Page> pageRepository,
IUnitOfWork unitOfWork)
{
this.pageRepository = pageRepository;
this.unitOfWork = unitOfWork;
Pages = new PageService(pageRepository);
}
public void Commit()
{
unitOfWork.Commit();
}
}
public class PageService
{
private readonly IKeyedRepository<int, Page> _pageRepository;
private readonly PageValidator _pageValidation;
public PageService(IKeyedRepository<int, Page> pageRepository)
{
_pageRepository = pageRepository;
_pageValidation = new PageValidator(pageRepository);
}
public IList<Page> All()
{
return _pageRepository.All().ToList();
}
public Page FindBy(int id)
{
return _pageRepository.FindBy(id);
}
}
Решение
Ваш пост не дает никакой информации, в которой создаются масштабы UOW.
Если это преходящий. Это не будет расположено вообще, и это зависит от вас.
В случае INREQUESTSCOPE он будет располагаться после того, как GC собирал httpcontext. Но как я сказал Бобу в последнее время в Список рассылки Ninject Можно выпустить все объекты в обработке события конечного запроса Htthapplication. Я добавлю поддержку для этого в следующем выпуске Ninject.
Другие советы
Я выполнил некоторое расследование по причиненной причине этой проблемы. Вот немного больше информации и возможных решений:
http://blog.bobcravens.com/2010/11/using-ninject-tom-manage-criitic-rusources/
Наслаждаться.
Ninject не делает никаких гарантий о том, когда и где ваш IDisposable
S будет Dispose
др.
Прочитайте это Пост от оригинального Ninject Man
Я также предложил осмотреть здесь, это пришло к различным механизмам настойчивости и различные контейнеры - ключевое, что вам нужно взять под контроль и знать, когда вы подключаетесь к семантике UOW Commit / Rollback / Dispose, а не Оставьте это в шанс или совместно (хотя конвенция велика).