检测Ecto数据库查询超时

时间:2017-09-26 21:19:57

标签: elixir phoenix-framework ecto

当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协议的实现,以便在异常消息为DBConnection.ConnectionError时将"tcp recv: closed"映射到状态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"对于我来说太过笼统,因为我认为发生了数据库超时。如果关闭连接是由其他原因引起的,例如网络故障?

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

1 个答案:

答案 0 :(得分:0)

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

检查网络连接的示例:

192.168.1.44

curl --head http://ipaddress/

ping ipadress