与Hikari一起使用时不要在需要时使用更多连接

时间:2016-09-16 13:21:29

标签: mysql scala slick hikaricp

我试图理解Slick-Hikari是如何工作的,我已经阅读了很多文档但是我的用例我的行为我不明白。

我使用Slick 3和Hikari,使用默认配置。我已经有一个同时连接〜1000个用户的生产应用程序。我的应用程序使用websockets,当我部署新版本时,所有客户端都重新连接。 (我知道它不是处理部署的最佳方式,但我目前还没有集群。)当所有这些用户重新连接时,他们都开始进行查询以获得用户状态(狗堆影响)。当它发生时Slick开始抛出很多错误,如:

java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@4dbbd9d1 rejected from java.util.concurrent.ThreadPoolExecutor@a3b8495[Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 23740]

我认为它正在发生的是,待处理查询的光滑队列已满,因为它无法处理从数据库请求信息的所有客户端。但如果我看到Dropwizard提供给我的指标,我会看到以下内容:

Example of Observed Dropwizard Metrics

16:45附近我们进行部署。在旧实例终止之前,我们可以看到连接数从20增加到40.我认为这是正常的,因为部署过程是如何完成的。

但是,如果由于狗堆效应导致Slick的查询队列变满,为什么如果有20个连接可用,它不会使用超过3-5个连接?数据库表现非常好,所以我认为瓶颈在于Slick。

您对改进此部署流程有什么建议吗?我现在只有1000名用户,但我会在几周内获得更多用户。

1 个答案:

答案 0 :(得分:0)

基于“被拒绝”的异常,我认为许多灵活的动作同时提交给了光滑的,超过了光滑中嵌入的队列的默认大小(1000)。

所以我认为你应该:

  1. 增加队列大小(queueSize)以容纳更多未处理的操作。
  2. 在光滑中增加线程数(numThreads)以同时处理更多操作。 You can get more tips here