java - springboot_1.0 - configuración simple del grupo de conexiones jdbc tomcat

java-springboot 1.x - configuración del grupo de conexiones jdbc tomcat

ambiente

  • jdk 1.8
  • arranque de primavera 1.56
  • mibot 3.5.3

fondo

Dado que las personas a menudo configuran mal los parámetros del grupo de conexiones o confunden la configuración de springboot1.0 y 2.0, aquí hay una explicación de cómo configurar y usar el grupo de conexiones Tomcat predeterminado para springboot 1.0.

¿Cómo configurar y utilizar correctamente el grupo de conexiones Tomcat en bootstrap.yml?

Es incorrecto configurar directamente los parámetros del grupo de conexiones en string.datasource y la configuración no tendrá efecto.
Nota: Pegue el siguiente contenido en el archivo de configuración yml, donde — es la etiqueta de inicio del nuevo archivo de configuración; spring.profiles puede especificar sus propios parámetros de entorno;

---
spring.profiles: default
spring:
  datasource:
    tomcat :
      initialSize: 1  #池启动时打开的连接数
      maxActive: 20    #打开的最大连接数
      maxIdle: 5      #最大空闲连接数
      minIdle: 1      #打开连接的最小数量
      maxWait: 30000  #获取连接时抛出SQLException之前等待的时间(以毫秒为单位)
      testOnBorrow: false   #如果在请求连接时进行验证,则为True
      testOnReturn: false   #如果在返回连接时进行验证,则为True
      testWhileIdle: true   #如果验证在连接未使用(空闲)时发生,则为True
      timeBetweenEvictionRunsMillis: 60000  #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      minEvictableIdleTimeMillis: 300000  #配置一个连接在池中最小生存的时间,单位是毫秒(与 timeBetweenEvictionRunsMillis 配合使用)
      validationQueryTimeout: 1000    #连接验证查询失败前的超时(以秒为单位)
      validationQuery: select 1 AS count    #检测连接是否有效的SQL

Configuración predeterminada del grupo de conexiones Tomcat

Objetos clave utilizados por el código del grupo de conexiones

  • Configuración predeterminada: org.apache.tomcat.jdbc.pool.PoolProperties;
  • Paquete: tomcat-jdbc-8.5.16.jar
  • Para obtener detalles sobre los elementos de configuración, consulte: tomcat-jdbc-8.5.16.jar!\org\apache\tomcat\jdbc\pool\mbeans-descriptors.xml
  • Objeto del grupo de conexiones: org.apache.tomcat.jdbc.pool.ConnectionPool
  • Obtener método de conexión: org.apache.tomcat.jdbc.pool.ConnectionPool#getConnection()
    public static final int DEFAULT_MAX_ACTIVE = 100;
    private volatile int defaultTransactionIsolation = DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION;
    private volatile int initialSize = 10;
    private volatile int maxActive = DEFAULT_MAX_ACTIVE;
    private volatile int maxIdle = maxActive;
    private volatile int minIdle = initialSize;
    private volatile int maxWait = 30000;
    private volatile String validationQuery;
    private volatile int validationQueryTimeout = -1;
    private volatile String validatorClassName;
    private volatile Validator validator;
    private volatile boolean testOnBorrow = false;
    private volatile boolean testOnReturn = false;
    private volatile boolean testWhileIdle = false;
    private volatile int timeBetweenEvictionRunsMillis = 5000;
    private volatile int numTestsPerEvictionRun;
    private volatile int minEvictableIdleTimeMillis = 60000;
    private volatile boolean accessToUnderlyingConnectionAllowed = true;
    private volatile boolean removeAbandoned = false;
    private volatile int removeAbandonedTimeout = 60;
    private volatile boolean logAbandoned = false;
    private volatile String password;
    private volatile String username;
    private volatile long validationInterval = 3000;
    private volatile boolean jmxEnabled = true;
    private volatile String initSQL;
    private volatile boolean testOnConnect =false;
    private volatile boolean fairQueue = true;
    private volatile boolean useEquals = true;
    private volatile int abandonWhenPercentageFull = 0;
    private volatile long maxAge = 0;
    private volatile boolean useLock = false;
    private volatile int suspectTimeout = 0;
    private volatile boolean alternateUsernameAllowed = false;
    private volatile boolean commitOnReturn = false;
    private volatile boolean rollbackOnReturn = false;
    private volatile boolean useDisposableConnectionFacade = true;
    private volatile boolean logValidationErrors = false;
    private volatile boolean propagateInterruptState = false;
    private volatile boolean ignoreExceptionOnPreLoad = false;
    private volatile boolean useStatementFacade = true;

Instrucciones de configuración

  • maxActive="100"

    indica el número máximo de conexiones que se pueden obtener del grupo de conexiones en condiciones concurrentes.
  • maxIdle="30"

    Si se alcanza maxActive=100 durante la concurrencia, entonces el grupo de conexiones debe obtener 100 conexiones de la base de datos para que las use la aplicación. Cuando la aplicación cierra la conexión, debido a maxIdle=30, no todas todas las conexiones serán devuelto a la base de datos, permanecerán 30 conexiones en el grupo de conexiones y el estado será inactivo.
    La conexión correspondiente a maxIdle es en realidad una conexión larga mantenida por el grupo de conexiones, que también es la parte que aprovecha el grupo de conexiones. En teoría, se pueden mantener conexiones más largas, lo que puede responder más rápido cuando se realizan solicitudes de aplicaciones, pero también Se mantienen muchas conexiones, pero consumirán muchos recursos de la base de datos, por lo que maxIdle no es tan grande como sea posible.
  • minIdle = "2"

    no es efectivo de forma predeterminada. Significa que cuando hay pocas conexiones en el grupo de conexiones con minIdle, el hilo de monitoreo del sistema iniciará la función complementaria. Generalmente, no iniciamos el hilo complementario.
  • removeAbandoned="true"

    si se debe reciclar después del límite de tiempo
  • removeAbandonedTimeout="60"

    tiempo de espera; la unidad es la segunda
  • logAbandoned="true"

    genera el registro de errores al cerrar una conexión abandonada.
    A veces, los escritores de programas descuidados se olvidan de cerrar la conexión después de obtener la conexión del grupo de conexiones, de modo que el grupo de conexiones alcanzará gradualmente maxActive hasta que el grupo de conexiones no pueda proporcionar servicios. Los grupos de conexiones modernos generalmente proporcionan una verificación "inteligente", pero cuando se establece removeAbandoned="true", cuando el número de conexiones en el grupo de conexiones alcanza (getNumIdle() < 2) y (getNumActive() > getMaxActive() - 3) Se iniciará el reciclaje de la conexión y se reciclará la conexión cuyo tiempo de actividad exceda removeAbandonedTimeout="60". Al mismo tiempo, si logAbandoned="true" se establece en verdadero, el programa imprimirá el registro mientras recicla la conexión. removeAbandoned es una función avanzada del grupo de conexiones. En teoría, esta configuración no debería aparecer en el entorno de producción real, porque a veces la aplicación ejecuta transacciones largas. En este caso, el grupo de conexiones puede reciclarla por error. Esta configuración generalmente es utilizado en la prueba del programa En la etapa, para localizar la ubicación del código específico de la fuga de conexión, se abre y el programa mismo debe garantizar el cierre de la conexión en el entorno de producción.
    Generalmente, hay varias situaciones que requieren removeAbandoned: el código finalmente no libera la conexión, pero todos usamos sqlmapClientTemplate, y la capa inferior tiene el proceso de liberar la conexión y encuentra un punto muerto en la base de datos
    . Anteriormente, el proceso de almacenamiento de back-end había bloqueado la tabla, lo que provocaba que se bloquearan todos los grupos de conexiones en el clúster de front-end y el procesamiento comercial posterior fallaba porque no se podía obtener la conexión.
  • tamaño inicial

    El número de conexiones iniciales creadas cuando se inicia el grupo de conexiones (el valor predeterminado es 0)
  • maxWait

    El tiempo máximo de espera, cuando no hay conexión disponible, el tiempo máximo que el grupo de conexiones espera para que se libere la conexión. Si se excede el límite de tiempo, se lanzará una excepción. Si configura -1, significa espera infinita (el valor predeterminado es infinito, ajústelo a 60000 ms para evitar un uso insuficiente del grupo de subprocesos, lo que hace que la solicitud se cuelgue indefinidamente)
  • poolPreparedStatements

    habilita el grupo preparado (el valor predeterminado es falso, no se ajusta, después de la prueba, el rendimiento después de abrir no es tan bueno como el de cerrar).
  • maxOpenPreparedStatements

    El número máximo de conexiones simultáneas después de abrir el grupo preparado (el valor predeterminado es ilimitado, igual que arriba, no configurado)
  • minEvictableIdleTimeMillis

    La conexión en el grupo de conexiones ha estado inactiva durante un período de tiempo y se expulsa del grupo de conexiones (el valor predeterminado es 30 minutos, que se puede ajustar adecuadamente y debe estar relacionado con la configuración de políticas del servidor backend)
  • minEvictableIdleTimeMillis

    El tiempo de inactividad de las conexiones en el grupo de conexiones, en milisegundos


  • El tiempo del subproceso de desalojo establecido por timeBetweenEvictionRunsMillis , la unidad es ms
    y el subproceso de verificación de desalojo
    se abrirá solo cuando sea mayor que 0. El número de conexiones en el grupo hasta minIdle.
  • testOnBorrow

    , como sugiere el nombre, consiste en realizar la verificación de validarObjeto en la conexión obtenida cuando se procesa el objeto prestado.
  • Como sugiere el nombre, testOnReturn

    realiza returnObject para validarObject en la conexión devuelta. Personalmente, creo que tiene poca importancia para la gestión del grupo de conexiones de la base de datos.
  • El objetivo de testWhileIdle

    es que en GenericObjectPool, se configura un subproceso de sincronización Evict TimerTask para la administración del grupo (configurando el parámetro timeBetweenEvictionRunsMillis>0), y el enlace en el grupo de subprocesos se validaObject regularmente y el enlace no válido se cierra. Llame a sureMinIdle y establezca correctamente un enlace para garantizar el número mínimo de conexiones minIdle.
  • ValidarQuery

    representa el SQL verificado, que se utiliza para verificar si la conexión es válida. El requisito es una declaración de consulta. Si validarQuery es nulo, testOnBorrow, testOnReturn y testWhileIdle no funcionarán.
  • validarQueryTimeout

    significa que cuando se realiza la verificación, se establece mediante la declaración Statement.setQueryTimeout(validationQueryTimeout)
  • numTestsPerEvictionRun

    representa la cantidad de enlaces que se verificarán cada vez. Se recomienda configurarlo en maxActive para que todos los enlaces se puedan verificar de manera efectiva cada vez.

¿Cómo verificar si la configuración de los parámetros del grupo de conexiones surte efecto?

Inyecte un objeto de fuente de datos e imprima el contenido del objeto para verificar si los parámetros son válidos.

@Autowired
private DataSource ds;

public void test() throws IOException {
    System.out.println(ds.getClass());
    System.out.println(ds.toString());
}

Vea si varios atributos clave son consistentes con la configuración:
los atributos clave son: maxActive=3; maxIdle=2; minIdle=1; initialSize=1; maxWait=3000;

class org.apache.tomcat.jdbc.pool.DataSource
org.apache.tomcat.jdbc.pool.DataSource@2123a61c{ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=org.postgresql.Driver; maxActive=3; maxIdle=2; minIdle=1; initialSize=1; maxWait=3000; testOnBorrow=false; testOnReturn=false; timeBetweenEvictionRunsMillis=60000; numTestsPerEvictionRun=0; minEvictableIdleTimeMillis=300000; testWhileIdle=true; testOnConnect=false; password=********; url=********; validationQuery=select 1 AS count; validationQueryTimeout=1000; validatorClassName=null; validationInterval=3000; accessToUnderlyingConnectionAllowed=true; removeAbandoned=false; removeAbandonedTimeout=60; logAbandoned=false; connectionProperties=null; initSQL=null; jdbcInterceptors=null; jmxEnabled=true; fairQueue=true; useEquals=true; abandonWhenPercentageFull=0; maxAge=0; useLock=false; dataSource=null; dataSourceJNDI=null; suspectTimeout=0; alternateUsernameAllowed=false; commitOnReturn=false; rollbackOnReturn=false; useDisposableConnectionFacade=true; logValidationErrors=false; propagateInterruptState=false; ignoreExceptionOnPreLoad=false; useStatementFacade=true; }

El grupo de conexiones Pgsql no puede asignar enlaces ni solucionar problemas

información de excepción

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.tomcat.jdbc.pool.PoolExhaustedException: [Thread-15] Timeout: Pool empty. Unable to fetch a connection in 3 seconds, none available[size:1; busy:1; idle:0; lastwait:2999].

Ver enlaces existentes y ejecutar SQL a través de tablas del sistema

Cuando ocurra la excepción anterior en el sistema, abra la consola para ejecutar el script:

select * from pg_stat_activity;

La columna de consulta es el SQL que se está ejecutando; el análisis del SQL que se está ejecutando generalmente puede localizar el código comercial que activa el SQL;

Resumir

La configuración del grupo de conexiones debe considerar varios factores, como por ejemplo: ¿Cuál es el número máximo de conexiones a la base de datos? ¿Cuántos microservicios se necesitan para acceder a esta base de datos? ¿Cuántas instancias de cada microservicio se implementan? etc.

  • Por ejemplo, si solo usamos una instancia de base de datos, el número máximo de conexiones es 1600;
  • Hay 60 instancias implementadas en el clúster, todas las cuales necesitan acceder a la base de datos;
  • Entonces la configuración maxActive de cada servicio debe ser menor que 26 (1600/20),
    en la configuración real también es necesario considerar los enlaces reservados para expansión, por lo que maxActive = 20 es una configuración razonable;

Supongo que te gusta

Origin blog.csdn.net/xxj_jing/article/details/131813460
Recomendado
Clasificación