Java Hikari连接池-慢速、阻塞、连接不可用:SpringBoot

Java Hikari连接池-慢速、阻塞、连接不可用:SpringBoot,java,spring-boot,jdbc,hikaricp,Java,Spring Boot,Jdbc,Hikaricp,问题: 我有一个springboot应用程序,它配置了hikari(自动)。我犯了个错误 连接不可用,请求在30113毫秒后超时 当我在数据库中执行插入操作时,流就像控制器>服务>存储库>保存(实体)一样,也没有在存储库中使用@Transactional,但如果我使用它,结果是相同的 当加载测试50request/1sec到该服务时,是否依次获得20-30个请求的成功?剩余操作失败,出现以下异常 2019-03-28 20:58:29.507 ERROR 90260 --- [http-nio-

问题:

我有一个springboot应用程序,它配置了hikari(自动)。我犯了个错误

连接不可用,请求在30113毫秒后超时

当我在数据库中执行插入操作时,流就像控制器>服务>存储库>保存(实体)一样,也没有在存储库中使用@Transactional,但如果我使用它,结果是相同的

  • 当加载测试50request/1sec到该服务时,是否依次获得20-30个请求的成功?剩余操作失败,出现以下异常

    2019-03-28 20:58:29.507 ERROR 90260 --- [http-nio-8080-exec-234] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection] with root cause
    
    java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30113ms.
        at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:697) ~[HikariCP-3.3.1.jar:na]
    
    我正在做一种负载测试,触发50req/1秒,一半成功,一半失败。还启用了泄漏检测,但日志中没有跟踪

  • 我是否过度使用了此测试的配置,还是需要调整池连接?或者它只支持那么多

  • 另外,第二次请求和后续请求后的hikari getconnection几乎需要5秒以上的时间(块数)为什么?它不是平行的为什么?请帮助我或指导我需要调整多少才能接受每1分钟200个请求

  • application.yml

    spring:
      application:
        name: demo
      datasource:
        hikari:
          connection-timeout: 20000
          minimum-idle: 5
          maximum-pool-size: 50
          idle-timeout: 300000
          max-lifetime: 1200000
          auto-commit: true
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
          jdbc-url:: jdbc:sqlserver://ip:port;databaseName=sample
          username: username
          leak-detection-threshold: 30000
    
    BootApplication.java

    @SpringBootApplication
    public class Sample{
    public static void main(String[] args) {
            SpringApplication.run(Sample.class, args);
        }
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
        public DataSource dataSource() {
         HikariDataSource dataSource=new HikariDataSource();
              //configuring pass from vault
            return dataSource;
        }
    }
    
    @Service
    public class SampleService implements SampleService {
        @Autowired
        private SampleRepository sampleRepository;
    
        @Override
        public List<String> getAll() {
            return (List<String>) sampleRepository.findAll();
        }
    
        @Override
        public String saveOrUpdate(Sample obj) {
            return sampleRepository.save(obj);
        }
    }
    
    SampleService.java

    @SpringBootApplication
    public class Sample{
    public static void main(String[] args) {
            SpringApplication.run(Sample.class, args);
        }
    
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
        public DataSource dataSource() {
         HikariDataSource dataSource=new HikariDataSource();
              //configuring pass from vault
            return dataSource;
        }
    }
    
    @Service
    public class SampleService implements SampleService {
        @Autowired
        private SampleRepository sampleRepository;
    
        @Override
        public List<String> getAll() {
            return (List<String>) sampleRepository.findAll();
        }
    
        @Override
        public String saveOrUpdate(Sample obj) {
            return sampleRepository.save(obj);
        }
    }
    
    @服务
    公共类SampleService实现SampleService{
    @自动连线
    私人采样器存放处采样器存放处;
    @凌驾
    公共列表getAll(){
    return(List)samplePository.findAll();
    }
    @凌驾
    公共字符串保存或更新(示例obj){
    返回采样器位置保存(obj);
    }
    }
    
    请求成功需要多长时间?如果池中最多有50个连接,但请求所需时间超过1秒,然后每秒触发50个请求当然会耗尽池,因为新请求在旧请求仍在进行的情况下进入…通常请求需要持续6秒才能完成。然后,您需要找到一种方法更快地释放连接,或者需要将池大小增加到至少300(并确保您的数据库配置允许如此多的连接!)或者您需要使用更真实的数字进行测试。如果您的要求是每分钟200个请求,为什么您要以每秒50个请求(或每分钟3000个)进行测试?如何在spring boot中更快地释放连接jpa repository类正在使用连接。有什么方法可以这样做吗?但是我不能定义10秒,因为即将到来的请求需要+2秒或更多秒来获取连接。我现在也尝试了每10秒20个请求一次。但在5分钟的范围内失败。持续hikari conn我说的更快是指你需要找到一种提高性能的方法,这样你就不会在6秒钟内保持连接。