Slick 对 numThreads 和获得良好性能的最佳实践感到困惑
Slick confused about numThreads and best practice for good performance
我正在将 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
}
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 表示无队列(直接 hand-off)或设置为 -1 表示无限制
队列大小(不推荐)。
池默认调整为异步执行。在大多数情况下,除了连接参数外,您只需要设置 numThreads 和 queueSize。在这种情况下,线程池(通过其队列)存在争用,而不是连接,因此您可以对最大连接数有相当大的限制(基于数据库服务器仍然可以处理的,而不是最多的)高效的)。在对事务内的 non-database 操作进行排序时,Slick 将使用比池中线程更多的连接。
HikariCP 支持以下配置键:
url(字符串,必需):JDBC URL
driver 或 driverClassName(字符串,可选): JDBC driver class加载用户(字符串,可选)*:用户名
密码(字符串,可选):密码
isolation(字符串,可选):新连接的事务隔离级别。允许的值为:NONE、READ_COMMITTED、
READ_UNCOMMITTED、REPEATABLE_READ、可序列化。
目录(字符串,可选):新连接的默认目录。
readOnly(布尔值,可选):新连接的只读标志。
properties(Map,可选):要传递给 driver 或 DataSource 的属性。
dataSourceClass (String, optional): JDBC driver 提供的DataSource class 的名称.这优于使用
driver。请注意,设置此键时 url 将被忽略(您必须
使用属性来配置数据库连接)。
maxConnections(整数,可选,默认:numThreads * 5):池中的最大连接数。
minConnections(整数,可选,默认值:与 numThreads 相同):池中保留的最小连接数.
connectionTimeout (Duration, optional, default: 1s): 调用getConnection超时前等待的最长时间。如果这
没有连接变得可用的时间超过了,一个
SQL将抛出异常。 1000ms是最小值。
validationTimeout (Duration, optional, default: 1s): 测试连接是否存活的最长时间。 1000毫秒
是最小值。
idleTimeout(持续时间,可选,默认值:10 分钟):允许连接在池中闲置的最长时间。
值为 0 意味着空闲连接永远不会从
水池。
maxLifetime(持续时间,可选,默认:30min):最大
池中连接的生命周期。当空闲连接到达
这个超时,即使最近使用过,也会从
水池。值为 0 表示没有最大生命周期。
connectionInitSql(字符串,可选):一个 SQL 语句,将在每次创建新连接后将其添加到
水池。如果这个 SQL 无效或抛出异常,它将是
被视为连接失败,标准重试逻辑将是
跟着。
initializationFailFast(布尔值,可选,默认值:false):
控制池是否会 "fail fast" 如果池不能
初始连接成功播种。如果连接不能
在池启动时创建,将抛出 RuntimeException。
如果 minConnections 为 0,此 属性 无效。
leakDetectionThreshold (Duration, optional, default: 0): 在消息被发送之前连接可以离开池的时间量
记录指示可能的连接泄漏。值为 0 表示泄漏
检测被禁用。启用 l 的最低可接受值啊
检测时间为10s。
connectionTestQuery(字符串,可选):一条语句
将在从
池以验证与数据库的连接是否仍然有效。
它依赖于数据库,应该是一个花费很少的查询
由数据库处理(例如 "VALUES 1")。未设置时,JDBC4
Connection.isValid()
方法被改用(这通常是
最好)。
registerMbeans(布尔值,可选,默认值:false):是否注册了 JMX Management Beans("MBeans")。
Slick 具有非常透明的配置 setting.Best 良好性能的实践,没有经验法则。这取决于您的数据库(提供多少个并行连接)和您的应用程序。这都是关于数据库和应用程序之间的调整。
我正在将 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
}
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 表示无队列(直接 hand-off)或设置为 -1 表示无限制 队列大小(不推荐)。
池默认调整为异步执行。在大多数情况下,除了连接参数外,您只需要设置 numThreads 和 queueSize。在这种情况下,线程池(通过其队列)存在争用,而不是连接,因此您可以对最大连接数有相当大的限制(基于数据库服务器仍然可以处理的,而不是最多的)高效的)。在对事务内的 non-database 操作进行排序时,Slick 将使用比池中线程更多的连接。
HikariCP 支持以下配置键:
url(字符串,必需):JDBC URL
driver 或 driverClassName(字符串,可选): JDBC driver class加载用户(字符串,可选)*:用户名
密码(字符串,可选):密码
isolation(字符串,可选):新连接的事务隔离级别。允许的值为:NONE、READ_COMMITTED、 READ_UNCOMMITTED、REPEATABLE_READ、可序列化。
目录(字符串,可选):新连接的默认目录。
readOnly(布尔值,可选):新连接的只读标志。
properties(Map,可选):要传递给 driver 或 DataSource 的属性。
dataSourceClass (String, optional): JDBC driver 提供的DataSource class 的名称.这优于使用 driver。请注意,设置此键时 url 将被忽略(您必须 使用属性来配置数据库连接)。
maxConnections(整数,可选,默认:numThreads * 5):池中的最大连接数。
minConnections(整数,可选,默认值:与 numThreads 相同):池中保留的最小连接数.
connectionTimeout (Duration, optional, default: 1s): 调用getConnection超时前等待的最长时间。如果这 没有连接变得可用的时间超过了,一个 SQL将抛出异常。 1000ms是最小值。
validationTimeout (Duration, optional, default: 1s): 测试连接是否存活的最长时间。 1000毫秒 是最小值。
idleTimeout(持续时间,可选,默认值:10 分钟):允许连接在池中闲置的最长时间。 值为 0 意味着空闲连接永远不会从 水池。
maxLifetime(持续时间,可选,默认:30min):最大 池中连接的生命周期。当空闲连接到达 这个超时,即使最近使用过,也会从 水池。值为 0 表示没有最大生命周期。
connectionInitSql(字符串,可选):一个 SQL 语句,将在每次创建新连接后将其添加到 水池。如果这个 SQL 无效或抛出异常,它将是 被视为连接失败,标准重试逻辑将是 跟着。
initializationFailFast(布尔值,可选,默认值:false): 控制池是否会 "fail fast" 如果池不能 初始连接成功播种。如果连接不能 在池启动时创建,将抛出 RuntimeException。 如果 minConnections 为 0,此 属性 无效。
leakDetectionThreshold (Duration, optional, default: 0): 在消息被发送之前连接可以离开池的时间量 记录指示可能的连接泄漏。值为 0 表示泄漏 检测被禁用。启用 l 的最低可接受值啊 检测时间为10s。
connectionTestQuery(字符串,可选):一条语句 将在从 池以验证与数据库的连接是否仍然有效。 它依赖于数据库,应该是一个花费很少的查询 由数据库处理(例如 "VALUES 1")。未设置时,JDBC4
Connection.isValid()
方法被改用(这通常是 最好)。registerMbeans(布尔值,可选,默认值:false):是否注册了 JMX Management Beans("MBeans")。
Slick 具有非常透明的配置 setting.Best 良好性能的实践,没有经验法则。这取决于您的数据库(提供多少个并行连接)和您的应用程序。这都是关于数据库和应用程序之间的调整。