当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"
对于我来说太过笼统,因为我认为发生了数据库超时。如果关闭连接是由其他原因引起的,例如网络故障?
是否有更具体的方法来检测数据库查询超时何时发生?
答案 0 :(得分:0)
如果您检查 DNS 解析是否有效以及在发生数据库连接问题时网络连接是否有效,您可以使错误消息更加具体。
检查网络连接的示例:
192.168.1.44
或
curl --head http://ipaddress/
或
ping ipadress