Tôi có một ứng dụng web MVC được dựa trên kiến trúc sauAsp.Net MVC UNitOfWork và MySQL và Ngủ Connections
Asp.Net MVC2, Ninject, thành thạo NHibernate, MySQL trong đó sử dụng một bộ phận của mô hình làm việc.
Mọi kết nối tới MySQL tạo kết nối ngủ có thể được xem như một mục nhập trong kết quả truy vấn SHOW PROCESSLIST.
Cuối cùng, điều này sẽ sinh ra đủ kết nối để thoát khỏi giới hạn của hồ bơi ứng dụng và làm hỏng ứng dụng web.
Tôi nghi ngờ rằng các kết nối không được xử lý chính xác.
Nếu đây là trường hợp và điều này xảy ra như thế nào?
Đây là một bản chụp của mã mà tôi đang sử dụng:
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);
}
}
chính bản thân người đã liên hệ với Bob Cravens của blog.bobcravens.com tuyệt vời và tôi hiện đang sử dụng EndRequest + = delegate { IUnitOfWork uow = Kernel.Get(); uow.Dispose(); }; –