我有一个生成进程的函数,它执行如下查询:
def trigger_schedule(u = %User{}) do
spawn(fn ->
(Repo.preload(p, :tasks)).tasks
|> Enum.map(fn ts -> trigger_schedule(ts) end)
end)
u
end
Run Code Online (Sandbox Code Playgroud)
此代码由某些操作触发,仅用于在后台运行。但是,当我运行测试时,我开始看到:
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
Run Code Online (Sandbox Code Playgroud)
在跨区函数内执行查询是否不正确,或者是否有办法解决此错误?我认为这与PG连接池有关...
由于 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。
归档时间: |
|
查看次数: |
518 次 |
最近记录: |