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

Posted

技术标签:

【中文标题】Slick 对 numThreads 和获得良好性能的最佳实践感到困惑【英文标题】:Slick confused about numThreads and best practice for good performance 【发布时间】:2016-09-26 12:06:15 【问题描述】:

我正在使用带有 Slick 的 PlayFrameWork,并在一个 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)?是否有任何最佳实践来获得最佳性能?我目前的设置配置为:

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

【问题讨论】:

【参考方案1】:

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(字符串,必需):JDBC URL

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

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

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

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

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

属性(映射,可选):要传递给驱动程序或数据源的属性。

dataSourceClass(字符串,可选):JDBC 驱动程序提供的DataSource 类的名称。这优于使用 司机。请注意,设置此键时会忽略 url(您必须 使用属性来配置数据库连接)。

ma​​xConnections (Int, optional, default: numThreads * 5)池中的最大连接数。

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

李>

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

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

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

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

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

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

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

connectionTestQuery(字符串,可选):语句 将在从 池以验证与数据库的连接是否仍然有效。 它依赖于数据库,应该是一个需要很少的查询 由数据库处理(例如“VALUES 1”)。未设置时,JDBC4 而是使用Connection.isValid() 方法(通常是 更可取)。

registerMbeans(布尔型,可选,默认:false):是否注册 JMX 管理 Bean(“MBean”)。

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

【讨论】:

非常感谢您的详细解释帮助很大。

以上是关于Slick 对 numThreads 和获得良好性能的最佳实践感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

Slick 3 - 如何在使用纯 SQL 插入时获得正确的(数据库)架构

Slick 3.0插入然后获得自动增量值

未捕获的类型错误:$(...).slick 不是函数

React-slick 和 Nuka-carousel 在 Mozilla Firefox 中不起作用

Slick 3.0.0:如何查询一对多/多对多关系

如何使用Slick和Play在测试中应用手动演变! 2.4