我有一个基于以下架构的MVC网络应用
Asp.Net MVC2,Ninject,Fluent NHibernate,MySQL,它使用一种工作模式。
与MySQL的每个连接都会生成一个睡眠连接,可以将其视为SHOW PROCESSLIST查询结果中的一个条目。
最终,这将产生足够的连接来执行应用程序池限制并使Web应用程序崩溃。
我怀疑连接没有正确处理。
如果是这种情况,应该如何发生?
以下是我正在使用的代码的快照:
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);
}
}
答案 0 :(得分:3)
您的帖子未提供有关创建范围UoW的任何信息。
如果是短暂的。它根本不会被处理掉,这取决于你。
在InRequestScope的情况下,它将在GC收集HttpContext后处理。但正如我最近在Ninject Mailing List中告诉Bob的那样,可以在HttpApplication的结束请求事件处理程序中释放所有对象。我将在Ninject的下一个版本中添加对此的支持。
答案 1 :(得分:2)
我对这个问题的根本原因进行了一些调查。以下是更多信息和可能的解决方案:
http://blog.bobcravens.com/2010/11/using-ninject-to-manage-critical-resources/
享受。
答案 2 :(得分:0)
Ninject不保证IDisposable
的时间和地点为Dispose
d。
阅读此post from the original Ninject man
我还建议你在这里看看,这已经出现了各种持久性机制和各种容器 - 关键是你需要控制并知道你何时在UOW的提交/回滚/配置中挂钩语义学并没有让它成为机会或巧合(尽管公约很棒)。