java 线程未释放 Spring Boot 中的JDBC连接

4ngedf3f  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(212)

我们有一个Spring Boot应用程序,它的起点是一个API。API调用一个接口,比如说实现Callable的ITradeService。ITradeService有一个方法service(),它依次调用7个方法,其中最后三个方法,比如说method5()、method6()和method7()是独立的。
在SIT、UAT环境中,由于某些原因,4个节点中只有一个节点处于活动状态,我的项目负责人要求我使用4个线程-1个线程执行服务方法,另外3个线程执行上述3个方法。
在我们的项目中有这三个层

  • 控制器(Rest API)
  • 服务I贸易服务

贸易服务实施
类型1贸易服务实施类型2贸易服务实施类型3贸易服务实施

  • DAO公用道类型1道类型2道类型3道

我们在每个DAO类中使用JdbcTemplate。
在我们的应用程序. yaml中,我们将hikari数据库连接池配置为2。
当我尝试使用ThreadPoolTaskExecutor执行4个请求的线程时,进程按预期工作,但当我发送第5个请求时,它说
无法打开事务的JDBC连接
我知道这4个线程正在保持JDBC连接。我应该让线程释放JDBC连接并将其发送回hikari连接池,或者我应该在任务完成时关闭线程
我应该如何做在Spring的具体方式?

ycl3bljg

ycl3bljg1#

了解 * 为什么 * 您觉得需要并行运行这三种方法会很有帮助。
在任何情况下,您都可以通过以下方式解决/缓解问题:

  • 设置适当的connectionTimeoutmaximumPoolSize,以确保池自动缩放以满足应用程序需求,或者额外的线程在等待释放连接时不会超时,和/或
  • 确保在这三个方法的执行期间连接打开的时间尽可能短,例如线程不在@Transactional方法内进行繁重的计算、文件访问等。

关于第二个要点,如果您绝对需要操作是原子的,也许您可以使用乐观锁定(提取您需要的信息并在那里完成工作单元,在数据的分离副本上执行繁重的工作,启动另一个工作单元,查看数据是否在此期间发生了更改,如果是,则重试整个过程,否则只使用您的副本更新数据)。

相关问题