2017-07-31 72 views
1

當我嘗試使用Oracle將Tomcat的JDBC池集成到我的Web應用程序時遇到ORA-12519, TNS:no appropriate service handler found錯誤。Tomcat DBCP用完連接

我通常會在對應用程序運行集成測試幾分鐘後間歇性地看到此錯誤。

配置我的是:在tomcat/lib目錄中使用相同的資源

  • Oracle驅動程序和tomcat-DBCP罐
  • 2種的webapps,兩者。配置在春季完成:在conf/context.xml文件中定義

    <jee:jndi-lookup id="webDS" jndi-name="jdbc/web" 
        expected-type="javax.sql.DataSource" /> 
    
  • 數據源資源,如下所示:

    <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}" /> 
    

我已經試過所以這樣的其他地方進行了各種建議,增加或減少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 
+0

這是一個不是tomcat/jdbc的數據庫錯誤。你可以在db服務器上運行'lsnrctl services'..然後。這是可以的,沒有問題。嘗試'改變系統集進程= 300(或你想要的)scope = spfile;'重啓數據庫。 –

+2

您的驗證查詢('SELECT 1')在oracle中不起作用。它必須是'從雙重選擇1'。 –

+0

這不是數據庫錯誤。與c3p0相同的確切配置工作得很好。 –

回答

2

您的驗證查詢(SELECT 1)將不會在甲骨文工作。它必須是select 1 from dual

似乎在使用錯誤的驗證查詢時,應用程序無法識別健康連接並將其標記爲無效。