0

我有几千个数据库。我想一个接一个地连接到它们中的每一个并发出查询。我通过为每个人启动一个这样的 Postgrex 进程来做到这一点。

  {:ok, pid} =
    Postgrex.start_link(
      port: database.port,
      hostname: database.host,
      username: database.username,
      password: database.password,
      database: database.database_name
    )   

然后我发出 a Postgrex.query,然后像这样停止它

  :ok = GenServer.stop(pid, :normal)

一切似乎都很好,除了我最终有数千个Postgrex.TypeServer进程占用了似乎很长一段时间都没有清理的内存。

有没有更好的方法来清理Postgrex进程以便TypeServer也停止?

我在 Postgrex 0.13.3 上。

编辑:

为了澄清一点,我想在每个 Postgrex 进程停止后清理 TypeServer。在整个 Enum.map 完成后清理所有 TypeServer 对我来说并不是那么有用,因为它会导致内存缓慢增长,然后是急剧下降而不是平线。

Enum.map(databases, fn database ->
  {:ok, pid} = Postgrex.start_link(port: database.port, hostname: database.host, username: database.username, password: database.password, database: database.database_name)   
  Postgrex.query!(pid, "some query", [])
  :ok = GenServer.stop(pid, :normal)
  # something here to clean up the TypeServer
end)
4

1 回答 1

0

我没有深入挖掘它,但是Postgrex.TypeServers是由dynamic管理的Postgrex.TypeSupervisor,幸运的是,它是从一个硬编码的 name 开始的

所以我的疯狂猜测应该是以下内容:

DynamicSupervisor.stop(Postgrex.TypeSupervisor)

此外,关闭Postgrex.App也应该有帮助

Application.stop(:postgrex)
于 2020-04-06T04:36:45.810 回答