Понимание поведения пула tomcat-jdbc при смене пароля

#java #tomcat-jdbc

#java #tomcat-jdbc

Вопрос:

В следующем коде (измененном на основе примера кода, приведенного на сайте tomcat-jdbc ), я сначала создаю пул соединений, используя правильное имя пользователя и пароль. Через некоторое время я меняю имя пользователя и пароль на неправильные, но соединение по-прежнему успешно. Я установил testOnBorrow значение true , которое должно проверять соединение при его выдаче. Может кто-нибудь объяснить, почему код не проверяет пароль при подключении?

Мой код

 PoolProperties p = new PoolProperties();
    p.setUrl("myurl");
    p.setDriverClassName("oracle.jdbc.driver.OracleDriver");
    p.setUsername("test");
    p.setPassword("bsc");
    p.setJmxEnabled(true);
    p.setTestWhileIdle(false);
    p.setTestOnBorrow(true);
    p.setValidationQuery("SELECT 1");
    p.setTestOnReturn(true);
    p.setValidationInterval(30000);
    p.setTimeBetweenEvictionRunsMillis(30000);
    p.setMaxActive(100);
    p.setInitialSize(10);
    p.setMaxWait(1000);
    p.setRemoveAbandonedTimeout(60);
    p.setMinEvictableIdleTimeMillis(30000);
    p.setMinIdle(10);
    p.setLogAbandoned(true);
    p.setRemoveAbandoned(true);
    p.setJdbcInterceptors(
            "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"  
                    "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
    DataSource datasource = new DataSource();
    datasource.setPoolProperties(p);
    datasource.getPoolProperties().setUsername("Correct");
    datasource.getPoolProperties().setPassword("Correct");

    for (int i = 0; i < 1000; i  ) {

        if (i == 6) {
            System.out.println("Updating wrong user.");
            datasource.getPoolProperties().setUsername("Wrong");
            datasource.getPoolProperties().setPassword("Wrong");
        }
        Connection con = null;
        try {
            System.out.println("Creating connection - "   i);
            con = datasource.getConnection();
            System.out.println("Done. connection status is open "   con.isClosed());
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(select);
            int cnt = 1;
            while (rs.next()) {
                System.out.println((cnt  )   ". Host:"   rs.getString(1));
            }
            rs.close();
            st.close();
            System.out.println("Done - n");
        } finally {
            if (con != null) try {
                con.close();
            } catch (Exception ignore) {
            }
        }
  

Комментарии:

1. Соединения открываются и кэшируются в пуле. Соединения уже открыты, изменение учетных данных не окажет никакого влияния на открытые соединения, только на новые соединения (если они открыты по мере необходимости). Если вы хотите, чтобы все соединения использовали новые учетные данные, вам необходимо завершить работу пула и повторно инициализировать его.

2. вы пробовали чистую компиляцию mvn?

3. При запуске сервера tomcat. он использует свойства соединения для подключения к БД и установки пула соединений. Изменение учетных данных после этого вообще не окажет никакого влияния. Для проверки вы можете проверить журналы отладки в tomcat-jdbc jar при попытке аутентификации..

Ответ №1:

По словам разработчиков Oracle, учетные данные используются только для аутентификации при установлении соединения. После установления соединения отдельные проходящие пакеты не проверяются на действительность учетных данных. Эту реализацию можно аргументировать с обеих сторон, но Oracle не согласна с тем, что они должны проверять уже установленные соединения. Для этого есть несколько веских причин, но, опять же, это спорно. Итак, как указал @Ironluca в комментарии, ваши объединенные открытые соединения больше не будут проверены.

Если у вас есть требование аннулировать сеансы, можно отключить эти соединения, то есть сеансы на стороне базы данных. Для этого потребуется доступ к администратору базы данных — не могу вспомнить точный sql, но я полагаю, что это может быть таблица сеансов v $.