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(您必须 使用属性来配置数据库连接)。
maxConnections (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 插入时获得正确的(数据库)架构