在生成的进程内运行查询时Postgres断开连接?

时间:2016-11-08 05:45:21

标签: elixir ecto

我有一个生成进程的函数,它执行如下查询:

  def trigger_schedule(u = %User{}) do
    spawn(fn ->
      (Repo.preload(p, :tasks)).tasks
      |> Enum.map(fn ts -> trigger_schedule(ts) end)
    end)
    u
  end

此代码由某些操作触发,只是意味着在后台运行。但是,当我运行测试时,我开始看到这个:

00:37:33.324 [error] Postgrex.Protocol (#PID<0.789.0>) disconnected: ** (DBConnection.ConnectionError) owner #PID<0.1531.0> exited while client #PID<0.1533.0> is still running with: shutdown

在spa函数内执行查询不正确,还是有办法解决这个错误?我认为这与PG连接池有关...

1 个答案:

答案 0 :(得分:1)

由于Ecto 2.0连接所有权功能,您收到此错误。问题是拥有连接的进程(即测试进程)在运行查询的进程(spawn)之前退出。

我猜你是异步运行测试的。如果您正在使用Phoenix和ModelCase,那么您可能拥有:ok = Ecto.Adapters.SQL.Sandbox.checkout(YourApp.Repo)。最简单的解决方案是不要在测试中使用async: true

您也可以尝试手动允许其他进程使用Ecto.Adapters.SQL.Sandbox.allow(Repo, self(), process_pid)访问数据库,但您必须知道进程的pid,我不确定是否可行,因为您的trigger_schedule函数返回用户,而不是pid。