小编Gor*_*eng的帖子

检测 Ecto DB 查询超时

当 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

elixir ecto phoenix-framework

5
推荐指数
1
解决办法
561
查看次数

如何判断对变量的流提取是否失败?

我正在从字符串流中提取数据到a string和a double:

std::string word;
double num;
std::istringstream stream("hello x");

stream >> word >> num;

std::cout << word;
std::cout << num;
Run Code Online (Sandbox Code Playgroud)

是否可以判断第二个令牌是否"x"已成功解析为int

在这种情况下,它显然不会,而x的值是0.

c++

0
推荐指数
1
解决办法
64
查看次数

标签 统计

c++ ×1

ecto ×1

elixir ×1

phoenix-framework ×1