Slick使用比线程更多的连接的情况

时间:2017-12-13 08:56:30

标签: scala relational-database slick

我对Slick文档中的这句话感到困惑:

  

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

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

1 个答案:

答案 0 :(得分:4)

似乎我的理解是错的。

让我们说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应该永远不会打开比线程更多的连接。