2010-11-05 28 views
5

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); 
    } 
} 

Trả lời

3

Bài đăng của bạn không cung cấp bất kỳ thông tin nào trong đó phạm vi của UoW được tạo.

Nếu nó tạm thời. Nó sẽ không được xử lý ở tất cả và điều này là tùy thuộc vào bạn.

Trong trường hợp InRequestScope, nó sẽ được xử lý sau khi GC đã thu thập HttpContext. Nhưng như tôi đã nói với Bob gần đây trong Ninject Mailing List nó có thể phát hành tất cả các đối tượng trong xử lý sự kiện yêu cầu cuối cùng của HttpApplication. Tôi sẽ thêm hỗ trợ cho điều này trong phiên bản tiếp theo của Ninject.

+0

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(); }; –

0

Ninject không đảm bảo về thời gian và địa IDisposable của bạn sẽ Dispose d.

Đọc này post from the original Ninject man

Tôi cũng muốn đề nghị có một cái nhìn xung quanh đây, điều này đã đưa ra cho cơ chế bền bỉ khác nhau và các container khác nhau - điều quan trọng là bạn cần phải thực hiện kiểm soát và biết khi nào bạn đang hooking trong cam kết của UOW/rollback/dispose ngữ nghĩa và không để nó cho cơ hội hoặc cooincidence (mặc dù Công ước là tuyệt vời).