在springboot中有没有控制数据库连接释放策略的方法?有点像冬眠 ConnectionReleaseMode
?
我的测试代码如下:
插入查询
http调用
更新查询
插入和更新查询是存储库bean中自己的方法(可以扩展crudrepository,也可以作为mybatis@mapper)。http调用在它自己的bean中。
现在,我的服务bean是我尝试不同服务的地方 @Transactional
我的最终目标是在一个事务中执行这三个步骤。
问题是,http调用可能需要数百毫秒,而spring在这段时间内保持着数据库连接。这很快导致连接池变空,而连接本身处于空闲状态。
我用默认配置做了同样的实验 spring-boot-starter-data-jpa
同时使用 mybatis-spring-boot-starter
.
唯一让我离目标更近的是设定目标 spring.jpa.open-in-view=false
为了 data-jpa
,这将在不使用的情况下释放db连接 @Transactional
完全或传播设置为 NEVER
. 不过,如果都用transactin包起来,那就行不通了。
我觉得我在 Spring 缺少了一些重要的事务概念。尽管spring参考文档只提到了与jta事务管理器+jee容器+hibernate相关的发布模式。
1条答案
按热度按时间epggiuax1#
事务已绑定到连接/会话,因此不能在事务中间释放连接。您必须完成事务才能关闭/释放连接。请记住,事务随时都可能中止,而且由于http调用不是事务的“一部分”,而只是在事务进行时运行,因此在http调用运行时保持事务打开没有任何帮助。我建议您选择以下解决方案之一:
使用断路器取消http调用,如果它遇到超时,则会有一个上限,即连接/事务可以打开/保持多长时间
在事务之前或之后,将http调用移出事务
使用两个数据库事务
请注意,可以使用事务性作业调度程序在第一个tx中调度作业。然后,该作业可以使用至少一次语义,尝试调用http调用,然后继续执行第二个事务,或者在出现故障时进行一些补偿。