Springboot usa el problema del grupo de conexiones de Hikari: HikariPool-1-Connection no está disponible, la solicitud agotó el tiempo de espera después de 30000ms

Recientemente, Oracle redujo el proyecto a mysql y se encontró que este error se produjo durante la prueba de esfuerzo:

HikariPool-1 - Connection is not available, request timed out after 30000ms

Sabemos que Springboot 2.X usa el grupo de conexiones Hikari de forma predeterminada. El error anterior se produce porque no se puede obtener la conexión. La razón más probable es que el número máximo de conexiones en el grupo de conexiones es pequeño;

El código para crear un grupo de conexiones y una sesión es el siguiente:

package com.bootMybatis.config;

import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.util.Date;

/**
 *  MySQL数据连接
 *  @Primary 标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean 优先被考虑。「多数据源配置的时候注意,必须要有一个主数据源,用 @Primary 标志该 Bean
 * @MapperScan 扫描 Mapper 接口并容器管理,包路径精确到 master,为了和下面 cluster 数据源做到精确区分
 * @Value 获取全局配置文件 application.yml 的 kv 配置,并自动装配sqlSessionFactoryRef 表示定义了 key ,表示一个唯一 SqlSessionFactory 实例
 *

 */
@Configuration
@MapperScan(basePackages = {"com.bootMybatis.*"}, sqlSessionFactoryRef="mysqlSqlSessionFation1")
public class MysqlDataSource  {


    /**
     *  创建数据源DataSource
     * @return
     */
    @Bean(name = "mysqlDataSource1")
    @ConfigurationProperties(prefix = "spring.datasource1")
    @Primary     // 设置优先,因为有多个数据源,,会用带有primary的,这个注解必须有一个数据源要添加
    public DataSource mysqlDataSource(){
        return DataSourceBuilder.create(HikariDataSource.class.getClassLoader()).build();
        // return DataSourceBuilder.create().build();
    }


    /**
     *  创建SQLSessionFactory工厂
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "mysqlSqlSessionFation1")
    @Primary
    public SqlSessionFactory mysqlSqlSessionFation(@Qualifier("mysqlDataSource1")DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean =  new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mysqlMapper/*.xml"));

        return sqlSessionFactoryBean.getObject();
    }


    /**
     *  配置事务
     * @param dataSource
     * @return
     */
    @Bean(name="mysqlTransactionManager1")
    @Primary
    public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource1")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "mysqlSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFation1")SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

La configuración del grupo de conexiones es la siguiente:

spring.datasource1:
    jdbc-url: jdbc:mysql://localhost:3306/sjfirn?serverTimezone=UTC&allowMultiQueries=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    read-only: false
    #客户端等待连接池连接的最大毫秒数
    connection-timeout: 60000
    #允许连接在连接池中空闲的最长时间(以毫秒为单位)
    idle-timeout: 60000
    #连接将被测试活动的最大时间量
    validation-timeout: 3000
    #池中连接关闭后的最长生命周期
    max-lifetime: 60000
    #最大池大小
    maximum-pool-size:  60
    #连接池中维护的最小空闲连接数
    minimum-idle: 10
    #从池返回的连接的默认自动提交行为。默认值为true
    auto-commit: true
    #如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性
    connection-test-query: SELECT 1
    #自定义连接池名称
    pool-name: MyHikariCP

De esta manera, se pueden resolver los problemas anteriores La configuración del número máximo de conexiones en el grupo de conexiones específico debe considerar la concurrencia del proyecto. 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42228950/article/details/111059352
Recomendado
Clasificación