Slick 使用的连接多于线程的情况

A case when Slick uses more connections than threads

我对 Slick 文档中的这个声明感到困惑:

Slick will use more connections than there are threads in the pool when sequencing non-database actions inside a transaction.

这是否意味着 Slick 打开一个事务,然后使用不同的数据库连接(在不同的线程中)在该事务中执行操作?我做对了吗?我从没想过可以在多个连接之间保持事务打开。

看来我的理解有误

假设 Slick 线程池大小为 1。我们有一个事务 1,其中 运行 有两个查询 A 和 B。

首先,Slick打开一个连接1,运行s一个查询A,占用线程池中的单线程。同时,事务 2 排队,其中有一个查询 C 到 运行。由于所有线程都被占用,查询C被放入队列。

同时查询 A 完成,一些 Scala 代码 运行s 异步处理结果(使用另一个线程池)。处理线程返回到 Slick 线程池。但是由于事务 1 仍在 运行 中,数据库连接 1 仍在使用中。

所以当查询 C 为 运行 时,Slick 发现没有空闲连接,因此创建了一个新的数据库连接 2 到 运行 它。这正是文档中提到的那种情况——我们有 2 个打开的连接,而线程池大小只有 1。

这就是为什么默认的连接池设置是这样的:

  • minConnections 默认等于 numThreads
  • maxConnections 默认等于 numThreads * 5

因此,如果您不 运行 在一个事务中进行多个查询,那么 Slick 打开的连接数绝不会超过线程数。