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

但是,如果我检查数据库上的活动会话,则表明该连接仍处于活动状态,因此我与数据库有很多“僵尸”连接。

我已经在客户端程序中使用了几乎相同的代码,在这种情况下,该程序关闭了连接。也许是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"/>


爪哇

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个连接。正如Mark所说,这可能是way too much

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

10-11 22:26
查看更多