Что не так в моей настройке пула котов? MaxIdle похоже что не работает - PullRequest
0 голосов
/ 03 сентября 2018

Состояние postgresql на моем сервере показывает номер простоя, превышающий номер, указанный в моем tomcat

systemctl status postgresql-9.4.service | grep idle -c
284

Другими словами:

select count(state) from pg_stat_activity where state like 'idle' 
284

Настройки в моем context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context  allowCasualMultipartParsing="true">
    <Resource 
               name="jdbc/postgres" 
               auth="Container"
               type="javax.sql.DataSource" 
               driverClassName="org.postgresql.Driver"
               url="jdbc:postgresql://localhost:5432/db1"
               username="postgres" password="*****" 
               initialSize ="30"
               maxTotal="300" maxIdle="20" maxWaitMillis="30000"
               closeMethod="close"
               validationQuery="SELECT 1"
               validationQueryTimeout="5"
               removeAbandonedOnBorrow="true"
               removeAbandonedOnMaintenance="true"
               removeAbandonedTimeout="60"
               logAbandoned="true"
      />

          <Resource 
               name="jdbc/postgresDb2" 
               auth="Container"
               type="javax.sql.DataSource" 
               driverClassName="org.postgresql.Driver"
               url="jdbc:postgresql://localhost:5432/db2"
               username="postgres" password="*****" 
               initialSize ="30"
               maxTotal="300" maxIdle="20" maxWaitMillis="30000"
               closeMethod="close"
               validationQuery="SELECT 1"
               validationQueryTimeout="5"
               removeAbandonedOnBorrow="true"
               removeAbandonedOnMaintenance="true"
               removeAbandonedTimeout="60"
               logAbandoned="true"
      />
</Context>

Соединения в моем коде такие:

 public String asignacionMax(String type) throws ModuleException, Exception{      
    Connection conn = null;
    PreparedStatement stmt = null;  
    String accountno="";
    try{
        String query = "select nextval('public.asignacionseq');";
        conn = getConnection("GU");
        stmt = conn.prepareStatement(query);   
        ResultSet rst = stmt.executeQuery();    
        String cnt="";
        if(rst.next()){
            cnt = rst.getString("nextval");
            for(int i=cnt.length();i<9;i++){
                cnt= "0"+cnt;
            }   
        }
        accountno = type+cnt;

    }catch(Exception e){
        throw new Exception(e);
    }finally{
        if (conn != null) {conn.close();}
        if (stmt != null) {stmt.close();}
    }
    return accountno;
}

Информация о моей системе:

Версия сервера: Apache Tomcat / 9.0.5
Построен сервер: 6 февраля 2018 21:42:23 UTC
Номер сервера: 9.0.5.0
Название ОС: Linux
Версия ОС: 3.10.0-693.21.1.el7.x86_64
Архитектура: amd64
Версия JVM: 1.8.0_161-b14

1 Ответ

0 голосов
/ 03 сентября 2018

Tomcat jdbc pool определяет атрибут minEvictableIdleTimeMillis для управления продолжительностью бездействия соединения, которое считается допустимым.

minEvictableIdleTimeMillis

(int) Минимальное количество времени, в течение которого объект может бездействовать в пуле, прежде чем он будет допущен к выселению. Значение по умолчанию - 60000 (60 секунд).

В вашей конфигурации этот атрибут не указан, поэтому по умолчанию он равен 60 секундам.

1) Свободные соединения должны учитываться в течение этого периода для проверки их изменения.
2) Определены два пула, поэтому можно ожидать, что в какой-то момент будет вдвое больше свободных соединений.
3) По умолчанию проверяемые соединения проверяются каждые 5 секунд, чтобы вы могли проверять каждые 3 секунды в течение 61 секунды с помощью:

timeout 61 watch -n3 "systemctl status postgresql-9.4.service | grep idle -c | tee idle.log"

idle.log должен содержать значения, найденные за этот период.
Другой аспект проблемы заключается в том, чтобы убедиться, что ваш метод проверки является подходящим с точки зрения пула, другими словами, если idle означает то же самое для обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...