繁体   English   中英

线程未释放 spring 引导中的 jdbc 连接

[英]Thread not releasing jdbc connection in spring boot

我们有一个 spring 启动应用程序,其起点是 API。API 调用一个接口 ITradeService,它实现了 Callable。 ITradeService 有一个方法 service(),它依次调用 7 个方法,其中最后三个方法 method5() method6() 和 method7() 是独立的。

在 SIT、UAT 环境中,由于某些原因,4 个节点中只有一个节点处于活动状态,我的项目负责人要求我使用 4 个线程 - 1 个线程执行服务方法,其他 3 个线程执行上述 3 个方法。

我们的项目中有这三层

  • 控制器(休息API)
  • 服务 ITradeService
    贸易服务实施
    Type1TradeServiceImpl Type2TradeServiceImpl Type3TradeServiceImpl
  • DAO CommonDao Type1Dao Type2Dao Type3Dao

我们在每个 DAO 类中使用 JdbcTemplate。

在我们的 application.yaml 中,我们将 hikari 数据库连接池配置为 2

当我尝试使用 ThreadPoolTaskExecutor 为 4 个请求执行线程时,进程按预期工作但是当我发送第 5 个请求时它说

CannotCreateTransactionException 无法打开 JDBC 事务连接

我知道 4 个线程持有 JDBC 连接。 我应该让线程释放 JDBC 连接并将其发送回 hikari 连接池,或者我应该在任务完成后关闭线程

我应该如何以 spring 特定方式进行操作?

这将有助于理解为什么您觉得需要并行运行这三种方法。

在任何情况下,您都可以通过以下方式解决/缓解问题:

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

关于第二个要点,如果你绝对需要原子操作,也许你可以使用乐观锁定(拉出你需要的信息并在那里完成工作单元,对数据的分离副本进行繁重工作,启动另一个工作单元,看看数据是否同时发生变化,如果是,重试整个过程,否则只用你的副本更新数据)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM