使用Ecto的每个请求的数据库线程

时间:2017-10-03 11:48:50

标签: json architecture elixir psql ecto

典型的Elixir Web应用程序通常会有一个postgresql后端,Ecto查询与API逻辑相结合。

但是,由于cowboy每个请求创建一个子GenServer进程(包含应用程序逻辑),这会产生为 n生成 n psql线程的效果并发请求,即使汇集cowboy / poolboy提供了?

然后,转移到存在多个应用程序实例的场景(例如docker容器集群)这不会为现有数据库线程的总数增加额外的因素吗?

1 个答案:

答案 0 :(得分:4)

Cowboy确实为每个请求创建了一个新的Erlang进程,但是从该进程执行Ecto查询将导致新的数据库连接。 Ecto保留与数据库的连接池(使用db_connection / poolboy)。使用Repo配置中的pool_size选项设置此池的大小。启动查询时,将借用此池中的连接并用于执行查询。执行完成后,连接将返回到池中。 Ecto永远不会为每个查询创建新连接。如果池中没有连接,则在配置的超时(默认为30秒)内未签入连接时,它将等待一个连接可用或最终超时。