当队列大小达到 slick 时该怎么办?
What to do when hitting the queue size of slick?
我正在使用 Slick 3.0 和 HikariCP 2.3.8(也玩 2.4)
我做了很多数据库 IO 并不断达到队列限制。
有没有办法获取当前队列大小以及如何增加它?
或者甚至建议这样做,或者使用自己的队列包装数据库是更好的选择吗?
我指的异常:
java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon@39496345 rejected from java.util.concurrent.ThreadPoolExecutor@21ee20b4[Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 7021]
1000 个排队的任务对我来说似乎很多。显然,slick 使用的是具有固定大小队列(1000 个元素)的执行程序,并且您 运行 达到了该限制,因为任务退出的速度不够快。
最明显的原因是 SQL 执行时间。如果您可以减少 SQL 执行时间,您将在队列中为自己争取到很多余量。
通常,这将通过检查查询执行计划在数据库端完成,并根据数据库询问数据库什么是长 运行 查询。
在 HikariCP 端,您可能希望 enable DropWizard metrics (not sure how to do that through slick, tho) and enable a DropWizard log reporter 每 10 秒左右记录一次池统计信息。
可能最有趣的指标是 usage,因为它会显示 getConnection()[=26] 之间连接离开池的时间=] 和 close()。当您调整数据库 and/or 查询时,您希望看到该数字开始下降。
一个关键点是,如果数据库跟不上您的应用程序负载,将灵活队列从 1000 增加到 5000(甚至 10000)除了在达到该限制之前的一小段时间之外不会给您带来任何好处。您必须找到性能瓶颈的根源并消除它,这样队列退出的速度就会比您的应用程序生成它们的速度更快(当然,临时峰值除外)。
使用 Database.forConfig 时,可以提供不同的队列大小值。
我正在使用 Slick 3.0 和 HikariCP 2.3.8(也玩 2.4)
我做了很多数据库 IO 并不断达到队列限制。 有没有办法获取当前队列大小以及如何增加它? 或者甚至建议这样做,或者使用自己的队列包装数据库是更好的选择吗?
我指的异常:
java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon@39496345 rejected from java.util.concurrent.ThreadPoolExecutor@21ee20b4[Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 7021]
1000 个排队的任务对我来说似乎很多。显然,slick 使用的是具有固定大小队列(1000 个元素)的执行程序,并且您 运行 达到了该限制,因为任务退出的速度不够快。
最明显的原因是 SQL 执行时间。如果您可以减少 SQL 执行时间,您将在队列中为自己争取到很多余量。
通常,这将通过检查查询执行计划在数据库端完成,并根据数据库询问数据库什么是长 运行 查询。
在 HikariCP 端,您可能希望 enable DropWizard metrics (not sure how to do that through slick, tho) and enable a DropWizard log reporter 每 10 秒左右记录一次池统计信息。
可能最有趣的指标是 usage,因为它会显示 getConnection()[=26] 之间连接离开池的时间=] 和 close()。当您调整数据库 and/or 查询时,您希望看到该数字开始下降。
一个关键点是,如果数据库跟不上您的应用程序负载,将灵活队列从 1000 增加到 5000(甚至 10000)除了在达到该限制之前的一小段时间之外不会给您带来任何好处。您必须找到性能瓶颈的根源并消除它,这样队列退出的速度就会比您的应用程序生成它们的速度更快(当然,临时峰值除外)。
使用 Database.forConfig 时,可以提供不同的队列大小值。