Piu*_*sch 3 scala slick hikaricp
我正在将Slick 3.0和HikariCP 2.3.8一起使用(也可以玩2.4)
我做了很多数据库IO,并且不断达到队列限制。有没有一种方法可以获取当前的队列大小,如何增加队列大小?还是建议这样做,还是将带有自己队列的数据库包装器作为更好的选择?
我指的是例外:
java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@39496345 rejected from java.util.concurrent.ThreadPoolExecutor@21ee20b4[Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 7021]
Run Code Online (Sandbox Code Playgroud)
对我来说,1000个排队的任务似乎很多。显然,slick正在使用具有固定大小的队列(1000个元素)的执行程序,并且由于无法足够快地退出任务而使您陷入了这一限制。
最明显的原因是SQL执行时间。如果您可以减少SQL执行时间,那么您将在队列中为自己留出很多余地。
通常,这可以通过检查查询执行计划并在数据库端(取决于数据库)询问数据库长时间运行的查询来完成。
在HikariCP端,您可能想启用DropWizard指标(不确定如何通过slick等操作),并启用DropWizard日志报告器每10秒左右记录一次池统计信息。
也许最有趣的指标会有使用,因为这将显示您连接有多长出池之间的getConnection()和close()方法。在调整数据库和/或查询时,您希望看到该数字开始下降。
关键一点是,如果数据库无法跟上您的应用程序负载,则将平滑队列从1000增加到5000(甚至10000)将不会给您带来任何好处,除非在达到该限制之前需要花费一些时间。您必须找到性能瓶颈的根源并加以消除,以使队列退役的速度比应用程序生成队列的速度快(当然,时间尖峰除外)。
| 归档时间: |
|
| 查看次数: |
2114 次 |
| 最近记录: |