2010-11-05 12 views
5

मुझे लगता है कि निम्नलिखित वास्तुकला पर आधारित है एक MVC वेब एप्लिकेशन हैAsp.Net MVC UNitOfWork और MySQL और स्लीपिंग कनेक्शन

Asp.Net MVC2, Ninject, धाराप्रवाह NHibernate, MySQL जो काम पैटर्न की एक इकाई का उपयोग करता है।

MySQL से प्रत्येक कनेक्शन एक नींद कनेक्शन उत्पन्न करता है जिसे SHOW PROCESSLIST क्वेरी परिणामों में प्रविष्टि के रूप में देखा जा सकता है।

आखिरकार यह ऐप पूल सीमा को समाप्त करने और वेब ऐप को क्रैश करने के लिए पर्याप्त कनेक्शन पैदा करेगा।

मुझे संदेह है कि कनेक्शन सही ढंग से निपटान नहीं किए जा रहे हैं।

यदि यह मामला है और यह कैसे होना चाहिए?

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

उत्तर

3

आपकी पोस्ट कोई जानकारी नहीं देती है जिसमें यूओडब्ल्यू का निर्माण किया गया है।

यदि यह क्षणिक है। यह बिल्कुल निपटान नहीं किया जाएगा और यह आपके ऊपर है।

इनरक्वैस्टस्कोप के मामले में जीसी ने एचटीपी कॉन्टेक्स्ट एकत्र करने के बाद इसका निपटारा किया जाएगा। लेकिन जैसा कि मैंने हाल ही में Ninject Mailing List में बॉब को बताया था, एचटीपीएप्लिकेशन के अंतिम अनुरोध ईवेंट हैंडलर में सभी ऑब्जेक्ट्स को रिलीज़ करना संभव है। मैं निनजेक्ट की अगली रिलीज में इसके लिए समर्थन जोड़ूंगा।

+0

इसे अपने आप को था जो उत्कृष्ट blog.bobcravens.com के बॉब Cravens के साथ संपर्क में था और मैं अब EndRequest + = प्रतिनिधि { IUnitOfWork UOW = Kernel.Get () का उपयोग कर रहा हूँ; uow.Dispose(); }; –

0

Ninject के बारे में कब और कहाँ अपने IDisposable रों हो जाएगा Dispose घ कोई गारंटी नहीं देता:

यहाँ कोड का एक स्नैपशॉट है कि मैं का उपयोग कर रहा है।

पढ़ें इस post from the original Ninject man

मैं भी यहाँ के आसपास एक नज़र होने सुझाव देंगे, इस ऊपर विभिन्न हठ तंत्र और विभिन्न कंटेनरों के लिए आ गया है - मुख्य बात आप जब तुम hooking रहे हैं नियंत्रण लेने के लिए और पता करने की जरूरत है यूओयू की प्रतिबद्धता/रोलबैक/सेमेन्टिक्स का निपटान करें और इसे मौका या संयोग से न छोड़ें (हालांकि सम्मेलन महान है)।

संबंधित मुद्दे