mysql - Asp.Net MVC UNitOfWork 和 MySQL 以及休眠连接

标签 mysql asp.net-mvc fluent-nhibernate ninject unit-of-work

我有一个基于以下架构的 MVC 网络应用

Asp.Net MVC2、Ninject、Fluent NHibernate、使用工作单元模式的 MySQL。

每个与 MySQL 的连接都会生成一个 sleep 连接,可以将其视为 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);
    }
}

最佳答案

您的帖子没有提供任何创建 UoW 范围的信息。

如果它是短暂的。它根本不会被处置,这取决于您。

在 InRequestScope 的情况下,它将在 GC 收集 HttpContext 后被释放。但正如我最近在 Ninject Mailing List 中告诉鲍勃的那样可以释放 HttpApplication 的结束请求事件处理程序中的所有对象。我将在 Ninject 的下一个版本中添加对此的支持。

关于mysql - Asp.Net MVC UNitOfWork 和 MySQL 以及休眠连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4105157/

相关文章:

Mysql:创建具有多个自联接的 View ,结果不重复

mysql - ASP.NET MVC 显示数据库表

javascript - knockout 添加到数组的数组

fluent-nhibernate - 使用web.config流利的nhibernate配置错误

NHibernate 在二级更新中设置外键,而不是在初始插入时违反键列上的 Not-Null 约束

mysql - 无法从 PHP 和 MySQL 获取印地语的 Unicode 数据

java - Android - ListView未显示并且无法从数据库php mysql捕获数据

c# - 我正在尝试在 MVC 5 中使用 Session 来传递最近注册用户的 Id

c# - MVC 使用 CSHTML href

c# - MemberExpression,从类构建 Expression.Property