2016-12-06 14 views
1

Я использую Slick3.1.1 + HikariCP2.5.1 для подключения к AWS t2.medium Экземпляры MySql. В документах AWS говорится, что t2.medium может иметь 312 максимальных соединений. Мой файл конфигурации:Slick/HikariCP дает «слишком много соединений» вместо таймаутов

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  
} 

Когда я ударил его с большой нагрузкой я начинаю получать ошибки «слишком много подключений»:

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] 
... 

Я запутался об этом. Из документов я думал, что он никогда не должен пытаться получить больше, чем указанные 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 соединений , Изменение этого признака на объект вместо исправления ошибки - теперь все классы используют один и тот же экземпляр базы данных Singleton, поэтому колпачок maxConnections должным образом соблюдается.

+0

Я ценю для вас обратную связь. Это мне очень помогло. –

 Смежные вопросы

  • Нет связанных вопросов^_^