典型的Elixir Web应用程序通常会有一个postgresql后端,Ecto
查询与API逻辑相结合。
但是,由于cowboy
每个请求创建一个子GenServer
进程(包含应用程序逻辑),这会产生为 n生成 n psql线程的效果并发请求,即使汇集cowboy
/ poolboy
提供了?
然后,转移到存在多个应用程序实例的场景(例如docker容器集群)这不会为现有数据库线程的总数增加额外的因素吗?
答案 0 :(得分:4)
Cowboy确实为每个请求创建了一个新的Erlang进程,但是从该进程执行Ecto查询将不导致新的数据库连接。 Ecto保留与数据库的连接池(使用db_connection / poolboy)。使用Repo配置中的pool_size
选项设置此池的大小。启动查询时,将借用此池中的连接并用于执行查询。执行完成后,连接将返回到池中。 Ecto永远不会为每个查询创建新连接。如果池中没有连接,则在配置的超时(默认为30秒)内未签入连接时,它将等待一个连接可用或最终超时。