我有一个生成进程的函数,它执行如下查询:
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连接池有关...
答案 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。