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

Mik*_*sov 4 scala relational-database slick

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

在对事务内的非数据库操作进行排序时,Slick 将使用比池中线程更多的连接。

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

Mik*_*sov 5

看来我的理解有误。

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

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

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

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

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

  • minConnections 默认情况下等于 numThreads
  • maxConnections 默认情况下等于 numThreads * 5

因此,如果您不在一个事务中运行多个查询,那么 Slick 不应打开比线程数更多的连接。