我对 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,使用占用线程池中的单个线程来运行查询 A。同时,事务 2 排队等待运行单个查询 C。由于所有线程都被占用,因此将查询 C 放入队列中。
同时查询 A 完成,一些 Scala 代码异步运行以处理结果(使用另一个线程池)。处理线程返回到 Slick 线程池。但是由于事务 1 仍在运行,数据库连接 1 仍在使用中。
所以当查询 C 运行时,Slick 看到没有空闲连接,因此创建一个新的数据库连接 2 来运行它。这正是文档中提到的那种情况 - 我们有 2 个打开的连接,而线程池大小仅为 1。
这就是为什么默认连接池设置是这样的:
minConnections
默认等于 numThreads
maxConnections
默认等于 numThreads * 5
因此,如果您不在一个事务中运行多个查询,那么 Slick 不应打开比线程数更多的连接。
关于scala - Slick 使用的连接数多于线程数的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788991/