Как исправить ошибку «Нет доступных управляемых соединений в течение настроенного времени блокировки (60000 [мс])» - PullRequest
0 голосов
/ 29 мая 2019

Я развернул java приложение на wildfly-15.0.1.FINAl сервере. Я использую OJDBC 12.1.0.2.0 драйвер.

<datasource jndi-name="java:/DS_APP" pool-name="APP" enabled="true" use-java-context="true">
        <connection-url>jdbc:oracle:thin:@localhost:1521:MYDB</connection-url>      
        <driver>OracleJDBCDriver</driver>
        <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
        <pool>
             <min-pool-size>3</min-pool-size>
             <max-pool-size>200</max-pool-size>
        </pool>
        <security>
             <security-domain>Password4APP</security-domain>
        </security>
        <validation>
            <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
            <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
        </validation>
        <timeout>
            <blocking-timeout-millis>60000</blocking-timeout-millis>
            <idle-timeout-minutes>15</idle-timeout-minutes>
        </timeout>
        <statement>
            <track-statements>true</track-statements>
            <prepared-statement-cache-size>100</prepared-statement-cache-size>
        </statement>
    </datasource>

Был период, когда мое приложение не могло подключиться к базе данных и регистрировало ошибки, подобные этой

Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/DS_APP
    at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:146) ~[?:?]
    at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:64) ~[?:?]
    at ge.app.ws.util.DbManager.getDatabaseConnection(DbManager.java:55) ~[classes:?]
    ... 2 more
Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/DS_APP
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:690) ~[?:?]
    at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:440) ~[?:?]
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789) ~[?:?]
    at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:138) ~[?:?]
    at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:64) ~[?:?]
    at ge.app.ws.util.DbManager.getDatabaseConnection(DbManager.java:55) ~[classes:?]
    ... 2 more
Caused by: javax.resource.ResourceException: IJ000655: No managed connections available within configured blocking timeout (60000 [ms])
    at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:570) ~[?:?]
    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:632) ~[?:?]
    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:604) ~[?:?]
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:624) ~[?:?]
    at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:440) ~[?:?]
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789) ~[?:?]
    at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:138) ~[?:?]
    at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:64) ~[?:?]
    at ge.app.ws.util.DbManager.getDatabaseConnection(DbManager.java:55) ~[classes:?]
    ... 2 more

Я читал много блогов об этой ошибке, но моя точка зрения другая. Из блогов я нашел несколько проблемных вопросов:

  1. Возможно, у вас утечка соединения. Вы не закрываете соединения
    • Что я сделал: я проверил каждую строку своего кода и уверен, что каждый Connection и CallableStatement закрываются.
  2. Возможно, все соединения из пула уже используются. Попробуйте увеличить размер пула соединений, который является значением по умолчанию. 20
    • Что я сделал: Когда возникла эта проблема, я проверил соединения на стороне базы данных, и не было активных соединений, все соединения были неактивны, также у меня есть 200 соединений в пуле, что так много, у меня максимум 30 активных сеансов в в то же время у меня есть 60 секунд, чтобы дождаться освобождения соединений из пула.

Когда я перезапустил свой Wildfly сервер, проблема решилась, но меня интересует, почему эти ошибки произошли, если могут быть такие ошибки в будущем (я думаю, они возникнут снова) и как их избежать?

...