Slick 对 numThreads 和获得良好性能的最佳实践感到困惑

Slick confused about numThreads and best practice for good performance

我正在将 PlayFrameWork 与 Slick 一起使用,并在一个全是 I/O 数据库的系统中使用它。在我的 application.conf 文件中我有这个设置:

play {
  akka {
    akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
    loglevel = WARNING
    actor {
      default-dispatcher = {
        fork-join-executor {
          parallelism-factor = 20.0
        }
      }
    }
  }
}

这显然为播放应用程序提供了每个核心 20 个线程,据我了解,Slick 创建了自己的线程池,Slick 中的 NumThreads 字段是指线程总数还是 (NumThreads x CPU's)?是否有最佳性能的最佳实践?我目前的设置配置为:

database {
  dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
  properties = {
    databaseName = "dbname"
    user = "postgres"
    password = "password"
  }
  numThreads = 10
}

numThreads 是线程池中线程的简单数量。 Slick 使用这个线程池来执行查询。

The following config keys are supported for all connection pools, both built-in and third-party:

  • numThreads (Int, optional, default: 20):异步执行的线程池中并发线程数 数据库操作。有关更多信息,请参阅 HikariCP wiki 正确调整线程池的大小。注意对于异步 在 Slick 中执行你应该调整线程池大小(这 参数)相应地而不是最大连接池大小。

  • queueSize (Int, optional, default: 1000): 数据库动作队列大小 线程很忙。超出此限制,新操作会立即失败。 设置为 0 表示无队列(直接 hand-off)或设置为 -1 表示无限制 队列大小(不推荐)。

池默认调整为异步执行。在大多数情况下,除了连接参数外,您只需要设置 numThreads 和 queueSize。在这种情况下,线程池(通过其队列)存在争用,而不是连接,因此您可以对最大连接数有相当大的限制(基于数据库服务器仍然可以处理的,而不是最多的)高效的)。在对事务内的 non-database 操作进行排序时,Slick 将使用比池中线程更多的连接。

HikariCP 支持以下配置键:

  • url(字符串,必需):JDBC URL

  • driver 或 driverClassName(字符串,可选): JDBC driver class加载用户(字符串,可选)*:用户名

  • 密码(字符串,可选):密码

  • isolation(字符串,可选):新连接的事务隔离级别。允许的值为:NONE、READ_COMMITTED、 READ_UNCOMMITTED、REPEATABLE_READ、可序列化。

  • 目录(字符串,可选):新连接的默认目录。

  • readOnly(布尔值,可选):新连接的只读标志。

  • properties(Map,可选):要传递给 driver 或 DataSource 的属性。

  • dataSourceClass (String, optional): JDBC driver 提供的DataSource class 的名称.这优于使用 driver。请注意,设置此键时 url 将被忽略(您必须 使用属性来配置数据库连接)。

  • maxConnections(整数,可选,默认:numThreads * 5)池中的最大连接数。

  • minConnections(整数,可选,默认值:与 numThreads 相同)池中保留的最小连接数.

  • connectionTimeout (Duration, optional, default: 1s): 调用getConnection超时前等待的最长时间。如果这 没有连接变得可用的时间超过了,一个 SQL将抛出异常。 1000ms是最小值。

  • validationTimeout (Duration, optional, default: 1s): 测试连接是否存活的最长时间。 1000毫秒 是最小值。

  • idleTimeout(持续时间,可选,默认值:10 分钟):允许连接在池中闲置的最长时间。 值为 0 意味着空闲连接永远不会从 水池。

  • maxLifetime(持续时间,可选,默认:30min):最大 池中连接的生命周期。当空闲连接到达 这个超时,即使最近使用过,也会从 水池。值为 0 表示没有最大生命周期。

  • connectionInitSql(字符串,可选):一个 SQL 语句,将在每次创建新连接后将其添加到 水池。如果这个 SQL 无效或抛出异常,它将是 被视为连接失败,标准重试逻辑将是 跟着。

  • initializationFailFast(布尔值,可选,默认值:false): 控制池是否会 "fail fast" 如果池不能 初始连接成功播种。如果连接不能 在池启动时创建,将抛出 RuntimeException。 如果 minConnections 为 0,此 属性 无效。

  • leakDetectionThreshold (Duration, optional, default: 0): 在消息被发送之前连接可以离开池的时间量 记录指示可能的连接泄漏。值为 0 表示泄漏 检测被禁用。启用 l 的最低可接受值啊 检测时间为10s。

  • connectionTestQuery(字符串,可选):一条语句 将在从 池以验证与数据库的连接是否仍然有效。 它依赖于数据库,应该是一个花费很少的查询 由数据库处理(例如 "VALUES 1")。未设置时,JDBC4 Connection.isValid() 方法被改用(这通常是 最好)。

  • registerMbeans(布尔值,可选,默认值:false):是否注册了 JMX Management Beans("MBeans")。

Slick 具有非常透明的配置 setting.Best 良好性能的实践,没有经验法则。这取决于您的数据库(提供多少个并行连接)和您的应用程序。这都是关于数据库和应用程序之间的调整。