首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测Ecto DB查询超时

检测Ecto DB查询超时
EN

Stack Overflow用户
提问于 2017-09-27 05:19:57
回答 1查看 577关注 0票数 5

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

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

代码语言:javascript
复制
** (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,这似乎是可行的。

代码语言:javascript
复制
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"异常太过笼统,不能假定发生了DB超时。如果关闭的连接是由其他原因引起的,例如网络故障,该怎么办?

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

EN

回答 1

Stack Overflow用户

发布于 2021-07-08 22:31:09

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

网络连接检查示例:

代码语言:javascript
复制
curl --head http://ipaddress/

代码语言:javascript
复制
ping ipadress

代码语言:javascript
复制
#!/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46436016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档