Java Hikari连接池-慢速、阻塞、连接不可用:SpringBoot
问题: 我有一个springboot应用程序,它配置了hikari(自动)。我犯了个错误 连接不可用,请求在30113毫秒后超时 当我在数据库中执行插入操作时,流就像控制器>服务>存储库>保存(实体)一样,也没有在存储库中使用@Transactional,但如果我使用它,结果是相同的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-
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秒,一半成功,一半失败。还启用了泄漏检测,但日志中没有跟踪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秒钟内保持连接。