Oracle зомби связи с Tomcat 9 - PullRequest
       67

Oracle зомби связи с Tomcat 9

0 голосов
/ 28 октября 2019

Я создал очень простой веб-сервис на Tomcat 9.0.12, который каждый раз, когда он вызывается, я создаю соединение с базой данных (Oracle 12), используя DataSource (определенный в файле conf / context.xml), затем перед возвратомв ответ клиенту он закрывает соединение с базой данных.

Но если я проверяю активный сеанс в моей базе данных, это показывает, что соединение все еще живо, поэтому у меня много "зомби" соединения с моимБаза данных.

Я использовал более или менее тот же код для программы на стороне клиента, и в этом случае программа закрывает соединение. Может быть, у 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";
}

1 Ответ

2 голосов
/ 28 октября 2019

Они не зомби. Они ждут в пуле соединений для повторного использования. Создание соединений стоит дорого, поэтому вы не хотите (действительно) закрывать их даром. Как отметил Андреас, пулы соединений возвращают завернутое соединение, где вызов close() на самом деле не закрывает его. Он просто возвращается в пул.

Ваша конфигурация говорит, что в пуле может быть до 100 неактивных соединений и всего 200 соединений. Как сказал Марк, это, вероятно, слишком много .

...