java - Oracle 僵尸连接与 Tomcat 9

标签 java tomcat jdbc ojdbc tomcat9

我在 Tomcat 9.0.12 上创建了一个非常简单的 Web 服务,每次调用它时,我都会使用数据源(在 conf/context.xml 文件中定义)创建到数据库 (Oracle 12) 的连接,然后在返回响应客户端,它关闭与数据库的连接。

但是如果我检查我的数据库上的 Activity session ,它会显示连接仍然​​存在,所以我有很多与我的数据库的“僵尸”连接。

我在客户端程序中使用了或多或少相同的代码,在这种情况下程序关闭了连接。也许是 Tomcat 的错误配置?

我该如何解决这个问题?

谢谢!

conf/context.xml

<Resource maxWaitMillis="5000" 
          maxIdle="100" 
          maxActive="200" 
          password="PASSWORD" 
          username="USER" 
          url="jdbc:oracle:thin:@/192.168.1.248:1521/PRD" 
          driverClassName="oracle.jdbc.driver.OracleDriver" 
          type="javax.sql.DataSource" 
          auth="Container" 
          name="jdbc_Connection"/>

Java

public String method() {

    try {
        System.out.println("---------------------------------------");
        System.out.println("START");
        System.out.println("---------------------------------------");


        DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/jdbc_Connection");

        Connection DB = ds.getConnection();


        String sql ="SELECT VAR FROM TABLE_NAME";
        PreparedStatement stmt = null;
        try {
            stmt = DB.prepareStatement(sql);
            ResultSet rs    = stmt.executeQuery();

            while(rs.next()){
                System.out.println("rs->"+rs.getString(1));
            }

            rs.close();
            stmt.close();
        } catch (SQLException ex) {
        }finally{
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException ex) {

                }
            }
        }


        System.out.println("CLOSE");
        DB.close();

    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (NamingException ex) {
        ex.printStackTrace();
    } 

    System.out.println("---------------------------------------");
    System.out.println("END");
    System.out.println("---------------------------------------");


    return "HELLO";
}

最佳答案

他们不是僵尸。他们在连接池中等待重用。创建连接是昂贵的,所以你不想(真的)白白关闭它们。正如 Andreas 指出的那样,连接池返回一个包装连接,其中调用 close() 并没有真正关闭它。它刚刚返回到池中。

您的配置表明池中最多可以有 100 个空闲连接,总连接数为 200。正如马克所说,这可能是 way too much .

关于java - Oracle 僵尸连接与 Tomcat 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58588106/

相关文章:

java - 我是否在使用 Tomcat 网络服务器?

java - 如何调用H2 LINK_SCHEMA?

jdbc - jmeter jdbc 变量名查询

mysql - SQL "SELECT"命令不工作,即使条目在数据库中

java - 包级别的方法

tomcat - grails 问题 [对象不是声明类的实例]

java - 使用 MessageFormat 创建 ASCII 温度计

java - 如何创建一个使用另一个库的 "leech"Tomcat 应用程序

Java Web App CPU 消耗率较高

java - GSON 无法使用字符串空间解析 JSON