gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:17:17 24 4
gpt4 key购买 nike

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

  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

在跨区函数内执行查询是否不正确,或者是否有办法解决此错误?我认为这与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。

关于elixir - Postgres 在生成的进程中运行查询时断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40479801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com