SQLNonTransientConnectionException: не удалось создать подключение к серверу базы данных

Столкнулся со следующей проблемой: с подключением к серверу все было в порядке, пока я не решил использовать c3p0 для пула подключений. Теперь (иногда) я получаю исключение SQLNontransientConnectionException, которое возникает из-за того, что новые ресурсы не могут быть получены после 30 попыток получения. Поведение этого довольно случайно, потому что часто, когда я локально перезапускаю сервер, он отказывается строить, потому что соединение не найдено. Может ли это иметь какое-либо отношение к тому, как я создаю экземпляр EntityManagerFactory? Буду рад любой помощи

`WARNUNG: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@4ff43e8a -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30).
Last acquisition attempt exception:java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:550)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:537)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:527)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:512)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:480)
        at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1807)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1624)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:637)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:351)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:224)
        at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146)
        at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195)
        at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)
        at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086)
        at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073)
        at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44)
        at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810)
        at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)
Caused by: java.lang.ArrayIndexOutOfBoundsException`

постоянство.xml

        <property name="hibernate.c3p0.min_size" value="5"/>
        <property name="hibernate.c3p0.max_size" value="20"/>
        <property name="hibernate.c3p0.timeout" value="3000"/>
        <property name="hibernate.c3p0.max_statements" value="100"/>
        <property name="hibernate.c3p0.idle_test_period" value="300"/>
        <property name="hibernate.c3p0.numHelperThreads" value="8"/>
        <property name="hibernate.c3p0.testConnectionOnCheckout" value="true"/>

Редактировать 1: это полная трассировка стека

    java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:550)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:537)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:527)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:512)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:480)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1807)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1624)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:637)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:351)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:224)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 24
    at com.mysql.cj.mysqla.io.Buffer.readInteger(Buffer.java:271)
    at com.mysql.cj.mysqla.io.MysqlaCapabilities.setInitialHandshakePacket(MysqlaCapabilities.java:62)
    at com.mysql.cj.mysqla.io.MysqlaProtocol.readServerCapabilities(MysqlaProtocol.java:434)
    at com.mysql.cj.mysqla.io.MysqlaProtocol.beforeHandshake(MysqlaProtocol.java:359)
    at com.mysql.cj.mysqla.io.MysqlaProtocol.connect(MysqlaProtocol.java:1359)
    at com.mysql.cj.mysqla.MysqlaSession.connect(MysqlaSession.java:132)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1754)
    ... 13 more
[C3P0PooledConnectionPoolManager[identityToken->1hge1tv9nk20xsdnfi9dv|6f911326]-HelperThread-#0] WARN com.mchange.v2.resourcepool.BasicResourcePool - Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@55d58825 is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.

Редактировать 2: переместить конфигурацию из persistence.xml в c3p0-config.xml

<c3p0-config>
<default-config>
    <property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="initialPoolSize">20</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">200</property>

    <user-overrides user="test-user">
        <property name="maxPoolSize">10</property>
        <property name="minPoolSize">1</property>
        <property name="maxStatements">0</property>
    </user-overrides>
</default-config>


person Daniel As    schedule 06.04.2017    source источник
comment
привет, можете ли вы включить трассировку стека ArrayIndexOutOfBoundsException, которая является причиной проблемы?   -  person Steve Waldman    schedule 06.04.2017
comment
@SteveWaldman нет трассировки стека. это буквально последняя строка трассировки стека. Я думаю, что исключение arrayindexoutofboundsexception вызвано 30 неудачными попытками получения: ПРЕДУПРЕЖДЕНИЕ: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@710bedb7 -- Ошибка попытки получения!!! Очистка ожидающих приобретения. При попытке получить необходимый новый ресурс нам не удалось превысить максимально допустимое количество попыток получения (30). Исключение последней попытки получения:   -  person Daniel As    schedule 06.04.2017
comment
я очень сомневаюсь в этом. насколько я помню, в логике получения соединения c3p0 не используются массивы. Гораздо более вероятно, что все 30 попыток приводят к ошибке ArrayIndexOutOfBoundsException. вам нужно будет настроить ведение журнала, чтобы либо не усекать трассировки стека, либо установить уровень журнала DEBUG для com.mchange.v2.resourcepool, чтобы увидеть отдельные трассировки стека сбоев.   -  person Steve Waldman    schedule 06.04.2017
comment
@SteveWaldman, извините, вы были правы, опубликовали полную трассировку стека   -  person Daniel As    schedule 07.04.2017
comment
Привет, извините за медленный ответ. Похоже, что это режим отказа MySQL, когда что-то не так в определении и аутентификации соединения. См. здесь dezyre.com/questions/5061/sqoop-installation-steps для почти идентичного Вызвано трассировкой стека. Решено, явно включив порт в URL-адрес mysql jdbc и предоставив разрешения, по-видимому.   -  person Steve Waldman    schedule 10.04.2017
comment
@SteveWaldman большое спасибо за вашу помощь. Мы уже импортировали порт и предоставили разрешение. Наша проблема, конечно же, не в том, что мы изначально подключаемся к серверу. Похоже, что после того, как соединения открыты, они больше не закрываются, и мы получаем ошибку «Слишком много соединений». К сожалению, увеличение max_size тоже не помогло.   -  person Daniel As    schedule 10.04.2017
comment
Похоже, у вас есть утечка соединения, которую c3p0 может помочь вам отладить. См., например. stackoverflow.com/questions/41773676/ или документы c3p0.   -  person Steve Waldman    schedule 10.04.2017
comment
@SteveWaldman еще раз спасибо за вашу помощь!! Когда я распечатываю список процессов, он просто показывает мне много спящих потоков, я изменил свою перемещенную конфигурацию соединения c3p0 из моего persistence.xml в c3p0-config.xml в моей папке web-inf. Это все еще не сделало этого для меня. Как только соединение открыто, оно просто остается бездействующим и спит, игнорируя тот факт, что я установил maxIdleTime на 30 секунд.   -  person Daniel As    schedule 11.04.2017
comment
нет проблем с использованием persistence.xml, вы можете установить любые свойства c3p0, которые вы могли бы установить в c3p0-config.xml там. c3p0 не найдет конфигурацию в корневом каталоге WEB-INF веб-приложения, это должно быть WEB-INF/classes. и я, конечно, не предлагал смотреть список процессов, хотя это не повредит. у вас, вероятно, есть утечка соединения, и вы должны понять и попробовать параметры конфигурации c3p0 unreturnedConnectionTimeout и debugUnreturnedConnectionStackTraces.   -  person Steve Waldman    schedule 12.04.2017