spring-batch - Spring Batch : HikariPool-1 - Connection is not available, 请求在 30000 毫秒后超时

标签 spring-batch

我在 SpringBatch 中遇到以下错误:

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.

鉴于我有很多文件要加载,我认为错误是因为我的 TaskExecutor :

@Bean
    public TaskExecutor MyTE() {
             ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
             executor.setCorePoolSize(64);
             executor.setMaxPoolSize(64);
             executor.setQueueCapacity(64);
             executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
             executor.setThreadNamePrefix("MyTE-");
             return executor;
        }

我对 CorePoolSize、MaxPoolSize 和 QueueCapacity 使用了“Integer.MAX_VALUE”(而不是 64),但错误仍然发生。

编辑:最终,我的问题的原因似乎是对存储过程的调用 在之前的工作中。事实上,当我在下面评论这段代码时,它起作用了。

@Override
public void beforeJob(JobExecution jobExecution) {
        
CallableStatement cs=null; 

cs=MyDataSource.getConnection().prepareCall("CALL my_proc(?,?)");
cs.setString(1, "my_arg1");
cs.setString(2,"my_arg2"); 
cs.execute();
cs.close();

但是,我想做这个调用,但我不明白为什么它会产生问题。使用 cs.close();

似乎可以很好地关闭连接

问题是什么?

问候。

解决方案:

Connection con = null;
CallableStatement cs = null; 

con=MyDataSource.getConnection();
                         
cs=con.prepareCall("CALL my_proc(?,?)");
cs.setString(1, "my_arg1");
cs.setString(2,"my_arg2"); 
cs.execute();

cs.close();
con.close();

最佳答案

您正在耗尽数据库连接池,因为您没有关闭连接以将它们释放回池中。您只是在 CallableStatement 上调用 close。尝试这样的事情......

try (Connection conn = MyDataSource.getConnection()) {
  CallableStatement cs= conn.prepareCall("CALL my_proc(?,?)");
  cs.setString(1, "my_arg1");
  cs.setString(2,"my_arg2"); 
  cs.execute();
  cs.close();
}

这将自动关闭 Connection 对象并将其释放回 DataSource 连接池。

关于spring-batch - Spring Batch : HikariPool-1 - Connection is not available, 请求在 30000 毫秒后超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69178742/

相关文章:

具有多个 JVM 的多个实例的 App 中的 Spring Scheduler 代码

tomcat - Apache Tomcat 连接池和 Oracle 全局临时表。数据可以共享吗?

spring-boot - 使用作业存储 'org.quartz.simpl.RAMJobStore' - 不支持持久性。并且不聚集

hibernate - 使用 Hibernate 3.5 批量插入

spring-batch - Spring Batch - 如何并行运行多个作业

spring-batch - 将当前步骤输出传递到下一步并写入平面文件

java - 如何解决Spring集成中ftp网关的连接超时问题?

java - 如何跳过 block 中的任何错误并继续下一个 block 项目?

java - 通过 JUnit 运行时执行 Spring Batch 作业增量器

java - 根据操作类型调用特定的编写器?