2017-07-31 71 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

似乎在使用错误的验证查询时,应用程序无法识别健康连接并将其标记为无效。