最近项目由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
通过这种方式就可解决以上问题,具体连接池的最大连接数的设置要考虑项目的并发情况。
更多推荐
springboot使用Hikari连接池问题:HikariPool-1 - Connection is not available, request time
发布评论