最近项目由Oracle切mysql,在压测时发现一直会有该错误抛出:

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

我们知道Springboot 2.X默认的是使用的Hikari连接池,抛出上述错误因为拿不到连接了,最大可能是因为连接池的最大连接数设置的小了;

创建连接池和session代码如下:

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);
    }

}

连接池配置如下:

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

通过这种方式就可解决以上问题,具体连接池的最大连接数的设置要考虑项目的并发情况。 

 

 

Logo

更多推荐