2016-09-16 57 views
7

我想了解Slick-Hikari是如何工作的,我讀過很多文檔,但我有一個用例,其行爲我不明白。光滑與Hikari不需要在需要時使用更多連接

我使用Slick 3與Hikari,使用默認配置。我已經有一個生產應用程序,同時有大約1000個用戶連接。我的應用程序使用websockets,當我部署新版本時,所有客戶端都重新連接。 (我知道這不是處理部署的最佳方式,但目前我沒有集羣)。當所有這些用戶重新連接時,他們都開始進行查詢以獲取其用戶狀態(狗樁效應)。當它發生油滑開始拋出了很多的錯誤,如:

java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 23740] 

我認爲它的發生是待處理的查詢光滑隊列已滿,因爲它無法處理請求數據庫中的信息的所有客戶端。但是,如果我看到的指標,Dropwizard提供了我,我看到以下內容:

Example of Observed Dropwizard Metrics

16:45我們知的部署。在舊的實例被終止之前,我們可以看到連接數量從20到40.我認爲這是正常的,因爲部署過程如何完成。

但是,如果Slick的查詢隊列由於狗樁效應而變滿,爲什麼它沒有使用超過3-5個連接(如果它有20個連接可用)?該數據庫表現非常好,所以我認爲這個瓶頸在Slick中。

對於改進此部署過程,您有任何建議嗎?我現在只有1000個用戶,但幾周後我會有更多。

+0

也許附加表示在所有20所謂的「活躍」在ThreadPoolExecutor的線程都將有助於線程轉儲?他們是否被封鎖在HikariCP上?他們被其他東西阻擋了嗎?另外,Slick和HikariCP的版本(完全)是什麼? – brettw

+0

這是否有助於http://stackoverflow.com/questions/29897003/slick-3-0-rc3-fails-with-java-util-concurrent-rejectedexecutionexception? – brettw

+0

什麼版本的Slick和HikariCP?我知道Slick在過去的幾個月裏嘗試了一些改變來提高併發性...... – brettw

回答

0

基於「被拒絕」異常,我認爲很多光滑的操作同時被提交到光面,這超出了光滑嵌入的隊列的默認大小(1000)。

所以我認爲你應該:

  1. 增加隊列的大小(QUEUESIZE)持有更多未處理的行動。
  2. 增加浮動中的線程數(numThreads)以同時處理更多操作。 You can get more tips here