我使用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]
答案 0 :(得分:4)
1000个排队的任务对我来说似乎很重要。很明显,光滑的是使用具有固定大小队列(1000个元素)的执行程序,并且您正在遇到该限制,因为任务没有足够快地退役。
最明显的原因是SQL执行时间。如果你可以缩短你的SQL执行时间,你会在队列中为自己买很多空间。
通常,这将通过检查查询执行计划在数据库端完成,并根据数据库向数据库询问长时间运行的查询是什么。
在HikariCP方面,您可能希望enable DropWizard metrics(不知道如何通过光滑的方式执行此操作)并且每隔10秒左右启用DropWizard log reporter日志池统计信息。
可能是最有趣的指标 usage ,因为它会显示 getConnection()和 close之间的连接超出池的时间( )。在调整数据库和/或查询时,您希望看到该数字开始丢弃。
一个关键点是,如果数据库无法跟上你的应用程序负载,那么将光滑队列从1000增加到5000(甚至10000)除了在达到该限制之前的少量时间之外什么都不会给你买。您必须找到性能瓶颈的来源并消除它,这样队列的退役速度比应用程序生成的速度快(当然除了时间峰值之外)。
答案 1 :(得分:1)
使用Database.forConfig时,可以提供不同的队列大小值。