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

时间:2016-05-28 05:26:11

标签: 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
        }
      }
    }
  }
}

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

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

1 个答案:

答案 0 :(得分:27)

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或无限制设置为-1 队列大小(不推荐)。

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

HikariCP支持以下配置键:

  • url(String,required):JDBC URL

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

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

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

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

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

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

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

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

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

  • connectionTimeout(持续时间,可选,默认值:1s):调用getConnection超时前的最长等待时间。如果这 没有连接可用时超过时间,a 将抛出SQLException。 1000ms是最小值。

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

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

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

  • connectionInitSql(String,optional):在每次创建新连接之后执行的SQL语句,然后将其添加到 池。如果此SQL无效或抛出异常,它将是 作为连接失败处理,标准重试逻辑将是 紧随其后。

  • initializationFailFast(布尔值,可选,默认值:false): 控制池是否会快速失败&#34;如果游泳池不能 成功连接初始连接。如果连接不能 在池启动时创建,将抛出RuntimeException。 如果minConnections为0,则此属性无效。

  • leakDetectionThreshold(持续时间,可选,默认值:0):在消息发出之前连接可以离开池的时间量 记录表明可能的连接泄漏。值为0表示泄漏 检测被禁用。启用泄漏的最低可接受值 检测是10秒。

  • connectionTestQuery(String,optional):一个语句 将在从中获取连接之前执行 池以验证与数据库的连接是否仍然存在。 它依赖于数据库,应该是一个非常少的查询 由数据库处理(例如&#34; VALUES 1&#34;)。未设置时,JDBC4 改为使用Connection.isValid()方法(通常是这样) 优选)。

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

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