【问题标题】:Detect Ecto DB query timeout检测 Ecto DB 查询超时
【发布时间】:2018-03-08 05:48:09
【问题描述】:

当 Ecto(或 postgrex?)遇到数据库查询超时时,我想返回一个特定的错误响应(带有自定义消息的 HTTP 503)。

发生超时时,抛出的异常如下所示:

** (DBConnection.ConnectionError) tcp recv: closed
    (ecto) lib/ecto/adapters/postgres/connection.ex:86: Ecto.Adapters.Postgres.Connection.prepare_execute/5
    (ecto) lib/ecto/adapters/sql.ex:243: Ecto.Adapters.SQL.sql_call/6
    (ecto) lib/ecto/adapters/sql.ex:431: Ecto.Adapters.SQL.execute_and_cache/7
    (ecto) lib/ecto/repo/queryable.ex:130: Ecto.Repo.Queryable.execute/5
    (ecto) lib/ecto/repo/queryable.ex:35: Ecto.Repo.Queryable.all/4
    (stdlib) timer.erl:166: :timer.tc/1

我为Plug.Exception 协议定义了一个实现,以在异常消息为"tcp recv: closed" 时将DBConnection.ConnectionError 映射到状态503,这似乎可行。

defimpl Plug.Exception, for: DBConnection.ConnectionError do
  def status(exception) do
    if exception.message == "tcp recv: closed" do
      503
    else
      500
    end
  end
end

但是,我担心DBConnection.ConnectionError 异常以及"tcp recv: closed" 过于笼统,以至于我无法假设发生了数据库超时。如果关闭的连接是由其他原因(例如网络故障)引起的怎么办?

是否有更具体的方法来检测何时发生数据库查询超时?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    如果您检查 DNS 解析是否有效,以及在发生数据库连接问题时网络连接是否有效,您可以使您的错误消息更加具体。

    检查网络连接示例:

    curl --head http://ipaddress/
    

    ping ipadress
    

    #!/bin/bash
    
    echo -e "GET http://stackoverflow.com HTTP/1.0\n\n" | nc stackoverflow.com 80 > /dev/null 2>&1
    
    if [ $? -eq 0 ]; then
        echo "Online"
    else
        echo "Offline"
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多