Tomcat DBCP Исчерпаны соединения

Я сталкиваюсь с ошибкой ORA-12519, TNS:no appropriate service handler found при попытке интегрировать пул JDBC Tomcat в свое веб-приложение с помощью Oracle.

Обычно я вижу, что эта ошибка периодически появляется после нескольких минут запуска интеграционных тестов для приложения.

Конфигурация у меня такая:

  • Драйвер oracle и файлы jar tomcat-dbcp в каталоге tomcat/lib
  • два веб-приложения, использующие одни и те же ресурсы. Конфигурация сделана весной:

    <jee:jndi-lookup id="webDS" jndi-name="jdbc/web"
        expected-type="javax.sql.DataSource" />
    
  • Ресурсы DataSource определены в conf/context.xml следующим образом:

    <Resource name="jdbc/web" auth="Container" 
    type="javax.sql.DataSource" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
    testWhileIdle="true" 
    testOnBorrow="true" 
    testOnReturn="false" 
    validationQuery="SELECT 1" 
    timeBetweenEvictionRunsMillis="30000" 
    maxActive="20" 
    maxIdle="10" 
    minIdle="5" 
    removeAbandonedTimeout="60" 
    removeAbandoned="false" 
    logAbandoned="true" 
    minEvictableIdleTimeMillis="30000" 
    jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" 
    username="${database.user}" 
    password="${database.password}" 
    driverClassName="${database.driver}" 
    url="${database.url}" />
    

Я пробовал различные предложения, сделанные в других местах на SO, такие как увеличение или уменьшение размера maxActive, но пока мне не повезло. Раньше я использовал c3p0 для управления пулом соединений. Что касается коммутатора, мне интересно, есть ли какая-то дополнительная настройка, которую мне нужно выполнить, относящуюся к закрытию соединений, потому что кажется, что я их пропускаю.

Трассировка стека:

Caused by: org.hibernate.exception.GenericJDBCException: Could not open connection
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:124)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:56)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:159)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:183)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:157)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1881)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1858)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
at org.hibernate.loader.Loader.doQuery(Loader.java:906)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:348)
at org.hibernate.loader.Loader.doList(Loader.java:2550)
at org.hibernate.loader.Loader.doList(Loader.java:2536)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2366)
at org.hibernate.loader.Loader.list(Loader.java:2361)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:198)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1230)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:268)
... 112 more
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:278)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
at org.apache.tomcat.jdbc.pool.PooledConnection.reconnect(PooledConnection.java:315)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:803)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:628)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:187)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70)
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:301)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
... 132 more
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

at oracle.net.ns.NSProtocol.connect(NSProtocol.java:399)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
... 146 more

person Mark    schedule 31.07.2017    source источник
comment
Это ошибка базы данных, а не tomcat/jdbc. Можете ли вы запустить на сервере БД «службы lsnrctl».. Тогда. это нормально и нет проблем. Попробуйте «изменить системный набор процессов = 300 (или что вы хотите) scope = spfile;» перезапустить БД.   -  person mehmet sahin    schedule 31.07.2017
comment
Ваш проверочный запрос (SELECT 1) не будет работать в оракуле. Должно быть select 1 from dual.   -  person Evgeni Dimitrov    schedule 31.07.2017
comment
Это не ошибка базы данных. Точно такая же конфигурация, но с c3p0 работает просто отлично.   -  person Mark    schedule 31.07.2017
comment
Комментарий @EvgeniDimitrov - это решение. У меня больше не заканчиваются связи; проблема заключалась в том, что с плохим тестовым запросом система не могла определить, устарело ли соединение или нет. Евгений, если вы опубликуете это как ответ, я приму это.   -  person Mark    schedule 31.07.2017
comment
@MarkS Только что опубликовал это. Я рад, что это помогло.   -  person Evgeni Dimitrov    schedule 01.08.2017


Ответы (1)


Ваш проверочный запрос (SELECT 1) не будет работать в Oracle. Должно быть select 1 from dual.

Похоже, что при использовании неправильного запроса проверки приложение не может определить исправные соединения и пометить их все как недействительные.

person Evgeni Dimitrov    schedule 31.07.2017