2016-12-06 70 views
1

我正在使用Slick3.1.1 + HikariCP2.5.1連接到AWS t2.medium MySql實例。 AWS文檔說t2.medium最多可以有312個連接。我的配置文件是:Slick/HikariCP給出「太多連接」而不是超時

17:05:40.708 DEBUG [] [rdsConfig connection adder] com.zaxxer.hikari.pool.HikariPool - rdsConfig - Cannot acquire connection from data source 
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections 
     at sun.reflect.GeneratedConstructorAccessor59.newInstance(Unknown Source) ~[na:na] 
... 

我很困惑這個問題:

rdsConfig = { 
    url = "jdbc:mysql://mydb.........us-west-2.rds.amazonaws.com:3306/owlschema" 

    driver = "com.mysql.jdbc.Driver" 
    connectionPool = HikariCP 
    maxConnections = 222   # <<<<< ie make this < 312. 
    keepAliveConnection = true 
    properties = { 
    user = "me" 
    password = "mydarksecret" 
    } 
    numThreads = 40  
} 

當我懷着沉重的負擔,我開始變得「​​太多的連接」的錯誤打它。從文檔中我認爲它永遠不應該試圖獲得超過我指定的222個連接,這永遠不會超過AWS的限制。我期望在重負載下獲得超時,但不會出現「連接太多」的錯誤。那麼maxConnections是做什麼的?謝謝。

+1

如果將'minConnections'設置爲'222',是否也會立即發生? (讓我們確定問題出在Slick部分上,比預定的更多的連接;而不是MySQL拋出異常遠低於極限) –

+0

它不會立即發生。日誌顯示它會逐個打開連接,如果負載不太重,則永遠不會有問題。只有當負載太高時纔會打開太多的連接。 – thund

+0

你的意思是即使你設置了'minConnections = 222'? –

回答

3

修正了它。正如上面的@Pawel Dolega所建議的那樣,我還將minConnections = 222設置爲一個實驗。在啓動應用程序時,我立即開始得到too many connections錯誤,即使沒有負載。它原來是我的錯誤:我其實是打開多個單獨的數據庫實例,因爲我用的是以下特質在每一個需要的數據庫訪問類:

trait dbCore { 
    val db = Database.forConfig("rdsConfig") 
} 

所以每個班級使用的222個連接自己獨立的帽。將這個特性改爲一個對象,而不是固定錯誤 - 現在所有類都使用相同的單例數據庫實例,因此maxConnections帽子得到了正確的尊重。

+0

我很感謝你的反饋。這對我幫助很大。 –