我们有一个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的具体方式?
1条答案
按热度按时间ycl3bljg1#
了解 * 为什么 * 您觉得需要并行运行这三种方法会很有帮助。
在任何情况下,您都可以通过以下方式解决/缓解问题:
connectionTimeout
和maximumPoolSize
,以确保池自动缩放以满足应用程序需求,或者额外的线程在等待释放连接时不会超时,和/或@Transactional
方法内进行繁重的计算、文件访问等。关于第二个要点,如果您绝对需要操作是原子的,也许您可以使用乐观锁定(提取您需要的信息并在那里完成工作单元,在数据的分离副本上执行繁重的工作,启动另一个工作单元,查看数据是否在此期间发生了更改,如果是,则重试整个过程,否则只使用您的副本更新数据)。