【问题标题】:Oracle DB connections not releasing from connection pool in Tomcat 8Oracle DB连接未从Tomcat 8中的连接池中释放
【发布时间】:2022-04-26 04:49:59
【问题描述】:

我们正在将 Tomcat6、java 6 和 Oracle 10g Web 应用程序迁移到 Tomcat 8、Java 8 和 Oracle 10g。迁移后我们的应用程序工作正常,但连接池中可用的初始连接 (initialSize="5") 在 Tomcat 关闭后未释放。当第二次启动 tomcat 时,它会再创建 5 个初始连接到池。我在 server.xml 中使用以下资源配置

<Resource   name="TestAppDataSource"
            auth="Container"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            type="javax.sql.DataSource"
            driverClassName="oracle.jdbc.OracleDriver"
            initialSize="5"
            maxActive="40"
            maxIdle="40"
            minIdle="5"
            timeBetweenEvictionRunsMillis="30000"
            minEvictableIdleTimeMillis="30000"
            maxWait="10000"
            testWhileIdle="true"
            testOnBorrow="true"
            testOnReturn="false"
            validationQuery="SELECT 1 from dual"
            validationInterval="30000" 
            logAbandoned="true"
            removeAbandonedTimeout="30"
            removeAbandonedOnBorrow="true"
            removeAbandonedOnMaintenance="true"
            suspectTimeout="300"
            maxAge="60000"
            url="jdbc:oracle:thin:@//IP_ADDRESS:1521/SCHEMA_NAME"
            username="USER_NAME"
            password="PASSWORD" />

应用META_INF/context.xml中的资源链接配置如下

<ResourceLink
    name="APP_TEST"
    global="TestAppDataSource" 
    type="javax.sql.DataSource"
/>

我正在使用 ojdbc7.jar 作为 oracle 驱动程序。请帮助我是否错过任何配置..

【问题讨论】:

  • Tomcat JVM 终止后,您是否已将套接字连接到 Oracle?这很难相信。你检查网络层了吗?还是你的问题是别的什么?

标签: jdbc java-8 connection-pooling tomcat8 ojdbc


【解决方案1】:

尝试以下选项:

removeAbandoned = true 

(boolean) 如果放弃的连接超过 删除AbandonedTimeout。如果设置为 true,则考虑连接 如果使用时间超过 removeAbandonedTimeout 将此设置为 true 可以恢复数据库 来自无法关闭连接的应用程序的连接。看 还有 logAbandoned 默认值为 false。

Tomcat 现在使用 JDBC 连接池 org.apache.tomcat.jdbc.pool,它是 Apache Commons DBCP 连接池的替代品或替代品。

removeAbandoned 是 JDBC 连接池的一个选项

https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html

【讨论】:

    【解决方案2】:

    您必须在 context.xml 中将 closeMethod="close" 添加到您的 JDBC 资源中。这样,Tomcat 就会正确地释放到数据库的挂起连接。

    【讨论】:

      【解决方案3】:

      Nitpick:当tomcat关闭时,JVM关闭,因此它的所有资源也被“释放”,并且没有更多的连接池 - 你的意思是连接没有正确关闭,因此没有通知数据库它们已关闭,因此没有结束会话。这要么是因为池没有收到关闭命令,要么是因为在关闭期间其他东西挂在 tomcat 中,因此它没有达到关闭池的地步,在等待超时后被关闭脚本强制杀死已到期。您可以在关闭期间进行线程转储以查看它正在等待什么,并查看 catalina.out 以获取有关泄漏线程的消息(...已启动线程...尚未关闭...)。一个常见的问题是 webapps 将启动长时间运行的线程而不对其进行守护 - 这样的 webapps 需要实现一个 ServletContextListener 来在 ServletContext 停止时停止该线程/资源。

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 2013-05-07
        • 2018-12-24
        • 2015-12-04
        • 2016-10-24
        相关资源
        最近更新 更多