【问题标题】:EF Core Connection Timeout ? but no exceptionsEF Core 连接超时?但没有例外
【发布时间】:2019-11-16 04:40:47
【问题描述】:

我在运行状况检查控制器中有以下代码来确认 EF Core 数据库连接是否正常:

      using (var con = _dbContext.Database.GetDbConnection())
      {
        _logger.LogInformation($"Connecting to {con.ConnectionString}");
        try
        {
          await con.OpenAsync();
          con.Close();

          return true;
        }
        catch (Exception ex) 
        {
          _logger.LogError(ex, "Connection failed"); 
        }
        finally
        {
          _logger.LogInformation("Connection test done");
        }

      }

执行时,我在日志中看到带有正确连接字符串的条目“Connecting to ...”。 它永远不会完成,我在日志中也没有看到异常。 api 以 504 超时结束。我的连接字符串有“...;Connection Timeout=10”,但它似乎需要更长的时间。

我完全被难住了。我在 AWS 支持上花了 4 个小时,他们认为这是我的代码。我们证明了网络连接有效,所以我猜它们是正确的,但我不知道还能做什么。我已经打开了详细日志记录,也可以从 EF Core 或 SQL 客户端明显看出什么。

有人有想法吗?

【问题讨论】:

  • 不。没有。超时大约需要一分钟。
  • 那我觉得你没等多久。 API 超时不同于 SQL 连接超时。为什么不重试并等待 30 分钟左右(即使 API 已经超时)...您最终应该会看到 Connection test done...
  • 我的请求有 10 分钟的超时时间,但浏览器仍然给我 504 的时间要短得多。也许 ALB 正在削减是短的?

标签: .net asp.net-core ef-core-3.0


【解决方案1】:

我知道过去 using 语句和 EF GetDbConnection() 的组合有一些 issues

尝试不使用using 块。

        var con  = _dbContext.Database.GetDbConnection();
        _logger.LogInformation($"Connecting to {con.ConnectionString}");

        try
        {
          await con.OpenAsync();
          con.Close();
          return true;
        }
        catch (Exception ex) 
        {
          _logger.LogError(ex, "Connection failed"); 
        }
        finally
        {
          _logger.LogInformation("Connection test done");
        }

【讨论】:

  • 这似乎是一个合理的解释......但抱歉,我仍然什么也没得到。没有异常或最终记录。
  • 我删除了异步,现在我看到了错误:超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。
猜你喜欢
  • 2020-06-29
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2017-12-21
相关资源
最近更新 更多