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

标签 scala relational-database slick

我对 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/

    相关文章:

    mysql - mySQL 中的默认信用卡标志

    php - MYSQL/PDO PHP系统---寻找大笔画输入

    mysql - 无法在 Lucene 6.2 中使用 Scala 进行搜索

    playframework - 如何在开发中使用 play-slick 与 H2 和 MySQL 兼容模式,在生产中使用 MySQL?

    使用从不同范围导入时的 Scala 类型不匹配问题

    Scala:枚举值的通用解析器

    scala - akka 调度器的延迟如何?

    mysql - scalikejdbc 中的批量插入在远程计算机上速度很慢

    scala - 解决大型 Chisel 文件所触发的 JVM 代码大小限制的任何方法

    mysql - 如何连接两个相关表,同时一个记录引用另一个记录中的两条记录?