Tomcat DBCP用完了连接

时间:2017-07-31 19:34:26

标签: java spring oracle tomcat tomcat-dbcp

尝试使用Oracle将Tomcat的JDBC池集成到我的Web应用程序时遇到 SELECT c.CLM_ID, c.PATID, c.ADMIT_DT, d.LN_ID, d.DATE_OF_SERVICE FROM CLM_HDR c INNER JOIN CLM_DET d ON c.CLM_ID = d.CLM_ID WHERE c.ADMIT_DT between ‘2017-07-01’ and ‘2017-07-31’ and c.CLM_ID NOT IN ( SELECT c.CLM_ID FROM CLM_DET c WHERE c.DATE_OF_SERVICE > ‘2017-07-31’ ) 错误。

在针对应用程序运行集成测试几分钟后,我通常会看到此错误间歇性出现。

我的配置是:

  • oracle驱动程序和tomcat / lib目录中的tomcat-dbcp jars
  • 两个webapps,都使用相同的资源。在Spring中完成配置:

    ORA-12519, TNS:no appropriate service handler found
  • 在conf / context.xml中定义的DataSource资源,如下所示:

    <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}" /> 大小,但到目前为止没有运气。我之前使用c3p0来管理连接池。有了这个开关,我想知道是否需要做一些与连接关闭有关的额外配置,因为看起来我正在泄漏它们。

堆栈跟踪:

maxActive

1 个答案:

答案 0 :(得分:2)

您的验证查询(SELECT 1)在Oracle中不起作用。它必须是select 1 from dual

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