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

use*_*668 15 scala playframework slick

我正在使用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
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这显然给了我每个核心20个线程的播放应用程序,据我所知它Slick创建它自己NumThreads的线程,Slick中的字段意味着这是线程的总数还是它(NumThreads x CPU的)?是否有最佳性能的最佳实践?我目前将我的设置配置为:

database {
  dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
  properties = {
    databaseName = "dbname"
    user = "postgres"
    password = "password"
  }
  numThreads = 10
}
Run Code Online (Sandbox Code Playgroud)

Sky*_*Sky 33

numThreads是线程池中的简单线程数.Slick使用此线程池来执行查询.

所有连接池都支持以下配置键,包括内置和第三方:

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

  • queueSize(Int,optional,default:1000):数据库操作的队列大小,当所有线程都忙时,不能立即执行.超出此限制,新操作立即失败.无队列(直接切换)设置为0或无限队列大小设置为-1(不推荐).

默认情况下,池已调整为异步执行.除了连接参数,您在大多数情况下只需设置numThreads和queueSize.在这种情况下有争在线程池(通过其队列),不通过连接,这样你就可以对连接的最大数目相当大的限制(基于什么数据库服务器仍然可以处理,没有什么是最有效).在对事务内的非数据库操作进行排序时,Slick将使用比池中的线程更多的连接.

HikariCP支持以下配置键:

  • url(String,required):JDBC URL

  • driver或driverClassName(String,optional):用于加载用户的JDBC驱动程序类(字符串,可选)*:用户名

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

  • isolation(String,optional):新连接的事务隔离级别.允许的值为:NONE,READ_COMMITTED,READ_UNCOMMITTED,REPEATABLE_READ,SERIALIZABLE.

  • catalog(String,optional):新连接的缺省目录.

  • readOnly(Boolean,optional):新连接的只读标志.

  • properties(Map,optional):要传递给驱动程序或DataSource的属性.

  • dataSourceClass(String,optional):JDBC驱动程序提供的DataSource类的名称.这比使用驱动程序更受欢迎.请注意,设置此键时将忽略url(您必须使用属性来配置数据库连接).

  • maxConnections(Int,optional,default:numThreads*5):池中的最大连接数.

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

  • connectionTimeout(持续时间,可选,默认值:1s):调用getConnection超时之前的最长等待时间.如果在没有连接可用的情况下超过此时间,则将抛出SQLException.1000ms是最小值.

  • validationTimeout(持续时间,可选,默认值:1s):连接将测试活动的最长时间.1000ms是最小值.

  • idleTimeout(持续时间,可选,默认值:10分钟):允许连接在池中空闲的最长时间.值为0表示永远不会从池中删除空闲连接.

  • maxLifetime(持续时间,可选,默认值:30分钟):池中连接的最长生命周期.当空闲连接达到此超时时,即使最近使用过,它也将从池中退出.值0表示没有最大生命周期.

  • connectionInitSql(String,optional):在每次创建新连接之后将执行的SQL语句,然后将其添加到池中.如果此SQL无效或引发异常,则将其视为连接失败,并将遵循标准重试逻辑.

  • initializationFailFast(Boolean,optional,default:false):如果无法成功地为初始连接添加池,则控制池是否"快速失败".如果在池启动时无法创建连接,则将抛出RuntimeException.如果minConnections为0,则此属性无效.

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

  • connectionTestQuery(String,optional):将在从池中获取连接之前执行的语句,以验证与数据库的连接是否仍处于活动状态.它依赖于数据库,应该是一个只需要数据库处理很少的查询(例如"VALUES 1").未设置时,将使用JDBC4 Connection.isValid()方法(通常更可取).

  • registerMbeans(布尔值,可选,默认值:false):是否注册了JMX管理Bean("MBean").

光滑的配置设置非常透明.最佳实践表现良好,没有拇指规则.这取决于您的数据库(并行连接提供了多少)和您的应用程序.这完全是关于数据库和应用程序之间的调整.

  • 非常感谢您的详细解释,帮了大忙。 (2认同)