我正在将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
        }
      }
    }
  }
}


显然,这为我提供了一个Play应用程序每个内核20个线程,并且据我了解,Slick创建了它自己的线程池,Slick中的NumThreads字段是线程总数还是(NumThreads x CPU)?是否有最佳实践来获得最佳性能?我目前将我的设置配置为:

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(整数,可选,默认值:20):线程池中用于异步执行的并发线程数
数据库操作。有关更多信息,请参见HikariCP Wiki。
正确调整线程池的大小。注意,对于异步
在Slick中执行,您应该调整线程池大小(此
参数),而不是最大连接池大小。
queueSize(整数,可选,默认值:1000):数据库操作的队列大小,当所有
线程很忙。超出此限制,新操作将立即失败。
设置为0表示无队列(直接切换),设置为-1表示无限制
队列大小(不推荐)。


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

HikariCP支持以下配置键:


url(字符串,必填):JDBC URL
driver或driverClassName(字符串,可选):加载用户的JDBC驱动程序类(字符串,可选)*:用户名
密码(字符串,可选):密码
隔离(字符串,可选):新连接的事务隔离级别。允许的值为:NONE,READ_COMMITTED,
READ_UNCOMMITTED,REPEATABLE_READ,SERIALIZABLE。
catalog(字符串,可选):新连接的默认目录。
readOnly(布尔型,可选):新连接的只读标志。
properties(Map,可选):传递给驱动程序或DataSource的属性。
dataSourceClass(字符串,可选):JDBC驱动程序提供的DataSource类的名称。这优于使用
司机。请注意,设置此键后,网址将被忽略(您必须
使用属性来配置数据库连接)。
maxConnections(整数,可选,默认值:numThreads * 5):池中的最大连接数。
minConnections(整数,可选,默认值:与numThreads相同):保留在池中的最小连接数。
connectionTimeout(持续时间,可选,默认值:1s):在对getConnection的调用超时之前等待的最长时间。如果这
没有连接可用就超过了时间,
SQLException将被抛出。最小值为1000ms。
validationTimeout(持续时间,可选,默认值:1s):将测试连接的活动性的最长时间。 1000毫秒
是最小值。
idleTimeout(持续时间,可选,默认值:10min):允许连接在池中处于空闲状态的最长时间。
值0表示从不删除空闲连接。
池。
maxLifetime(持续时间,可选,默认值:30min):最大值
池中连接的生存期。当空闲连接到达时
此超时,即使最近使用过,也会从
池。值为0表示没有最大寿命。
connectionInitSql(字符串,可选):一条SQL语句,将在每次创建新连接后执行,然后再将其添加到
池。如果此SQL无效或引发异常,它将为
被视为连接失败,并且标准重试逻辑将被
跟着。
initializeFailFast(布尔值,可选,默认值:false):
控制如果无法恢复池,池是否将“快速失败”
初始连接成功播种。如果无法连接
如果在池启动时创建,则会抛出RuntimeException。
如果minConnections为0,则此属性无效。
LeakDetectionThreshold(持续时间,可选,默认值:0):在消息到达之前连接可以从池中移出的时间。
已记录,表明可能存在连接泄漏。值0表示泄漏
检测被禁用。启用泄漏的最低可接受值
检测时间为10秒。
connectionTestQuery(字符串,可选):一条语句
从连接获得连接之前将执行
池以验证到数据库的连接仍然有效。
它是数据库相关的,应该是一个花费很少的查询
由数据库处理(例如“ VALUES 1”)。未设置时,JDBC4
改用Connection.isValid()方法(通常是
最好)。
registerMbeans(布尔值,可选,默认值:false):是否注册了JMX管理Bean(“ MBeans”)。


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

07-24 18:48