代码之家  ›  专栏  ›  技术社区  ›  Poul K. Sørensen

SqlConnections与EF的寿命是长还是短

  •  1
  • Poul K. Sørensen  · 技术社区  · 11 年前

    我有几个连接到同一应用程序中同一数据库的DbContexts。

    我注意到EF6有一个新的构造函数: https://msdn.microsoft.com/en-us/library/gg696604(v=vs.113).aspx

    我的问题是,假设我连接我的DI框架为每个请求创建一个SqlConnection,并使用这个新构造函数将其传递给每个DbContext,这是正确的方法吗?或者Sql连接应该是长寿命的,而不是每个请求?

        public async Task<SqlConnection> GetOpenedConnectionAsync()
        {
            _connection = new SqlConnection(_config.AscendDataBaseConnectionString);
            await _connection.OpenAsync(_cancel.Token);
    
            return _connection;
        }
    

    是否在每个应用程序生存期或每个请求生存期以上注册?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Michal Ciechan    11 年前

    取决于您的用例,但总的来说,我强烈反对Singleton范围。

    通常,除非在服务器和Db(例如移动)之间存在长的分组延迟,否则创建新连接并将其拆除的成本很低,但是如果服务器接近,则这是<5毫秒。

    如果假设您有一个数据库,供一千台服务器使用(负载平衡或其他),如果所有这些服务器始终保持开放连接,您可能会遇到问题,但如果您在需要时分别打开和关闭连接,这可能会起作用。

    如果您有1个数据库和1个或2个服务器,您可以使用单个连接(以节省每个请求的少量时间),但存在陷阱,我强烈建议您这样做,因为:

    • 如果您打开一个事务,在该事务完成之前,将无法运行其他查询,因为每个连接在任何时候只能有一个事务。E、 g.用户A尝试列出所有客户(需要5秒),这意味着在您取回所有客户之前,无法运行其他查询。

    • 如果一个事务被打开,并且由于任何原因它没有提交,那么在该事务被回滚/提交(这可能发生也可能不会发生)之前,您基本上将失去与数据库的完整连接。