[英]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 个方法。
我们的项目中有这三层
我们在每个 DAO 类中使用 JdbcTemplate。
在我们的 application.yaml 中,我们将 hikari 数据库连接池配置为 2
当我尝试使用 ThreadPoolTaskExecutor 为 4 个请求执行线程时,进程按预期工作但是当我发送第 5 个请求时它说
CannotCreateTransactionException 无法打开 JDBC 事务连接
我知道 4 个线程持有 JDBC 连接。 我应该让线程释放 JDBC 连接并将其发送回 hikari 连接池,或者我应该在任务完成后关闭线程
我应该如何以 spring 特定方式进行操作?
这将有助于理解为什么您觉得需要并行运行这三种方法。
在任何情况下,您都可以通过以下方式解决/缓解问题:
connectionTimeout
和maximumPoolSize
以确保池自动缩放以满足应用程序需求,或者其他线程在等待释放连接时不会超时,和/或@Transactional
方法中进行繁重的计算、文件访问等。关于第二个要点,如果你绝对需要原子操作,也许你可以使用乐观锁定(拉出你需要的信息并在那里完成工作单元,对数据的分离副本进行繁重工作,启动另一个工作单元,看看数据是否同时发生变化,如果是,重试整个过程,否则只用你的副本更新数据)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.