Java 反应器和数据库事务

Java 反应器和数据库事务,java,spring,spring-boot,project-reactor,reactor,Java,Spring,Spring Boot,Project Reactor,Reactor,我正在从事一个java项目,使用spring boot作为容器,为了提供到Oracle数据库的连接不是被动的这一事实,我们决定使用reactor来并行化互不依赖的操作,如插入或更新(它们之间没有外键关系) 有时在并行通量的执行过程中,它会哀叹失去连接: org.springframework.jdbc.CannotGetJdbcConnectionException:获取jdbc连接失败;嵌套异常为java.sql.SQLTransientConnectionException:HikariPo

我正在从事一个java项目,使用spring boot作为容器,为了提供到Oracle数据库的连接不是被动的这一事实,我们决定使用reactor来并行化互不依赖的操作,如插入或更新(它们之间没有外键关系)

有时在并行通量的执行过程中,它会哀叹失去连接:

org.springframework.jdbc.CannotGetJdbcConnectionException:获取jdbc连接失败;嵌套异常为java.sql.SQLTransientConnectionException:HikariPool-1-连接不可用,请求在1001ms后超时

或者只是在ParallelFlux调用之前找不到持久化的数据,但未提交

这种行为是随机的,使用相同的数据作为输入

我想知道的是,数据库事务是否是线程安全的,以及ParallelFlux是否正确处理它

有人能解释一下spring引导如何将数据库事务传递给reactor,以及最后一个如何处理它吗

编辑

我做了其他的测试。我监视了DB上的连接,并注意到原始事务(在ParallelFlux块之前保存数据的事务)被挂起,对于ParallelFlux块内方法的每次调用,都有一个新的连接打开并等待原始连接结束。所有这些最终都锁定了Oracle,并且由于连接饱和,导致org.springframework.jdbc.CannotGetJdbcConnectionException

知道了这一点,我将ParallelFlux调用的方法的@Transactional注释更改为:

 @Transactional(propagation = Propagation.REQUIRED)
这样做会在方法的第一次调用时产生org.springframework.jdbc.CannotGetJdbcConnectionException,正如预期的那样

标签更改

有人要求从这个问题的标签列表中删除“reactor”,但这是不正确的,因为我使用的是reactor,而不是SpringWebFlux,这部分在后端,而不是REST服务中

<dependency>
    <groupId>io.projectreactor</groupId>
    <artifactId>reactor-core</artifactId>
    <type>jar</type>
</dependency>

离子交换反应器
堆芯
罐子

以目前的形式,这并不是真正需要回答的问题。这可能是反应堆实现的一个问题(胡乱猜测,也许你使用的线程太少,请求太多,而你的连接正在超时。谢谢。我将做一些测试,试图简化项目,看看我是否能想出一个解决方案或更深入地了解它们的工作原理。你是否使用反应式关系数据库连接来连接到oracle?事实上,我在当我在一个反应式进程中调用数据库时进行事务处理。我使用R2DBC进行了测试,效果很好,但正如您之前所说,R2DBC仍处于测试阶段。因此,为了克服事务的问题,所有对数据库的调用必须在事务性方法中被阻塞,然后我可以使用反应式处理。我知道这是错误的这不是最好的解决方案,但就目前而言,使用关系数据库进行一些反应式处理会有点复杂。以下是您将如何使用R2DBC管理事务:如果您愿意,请添加一段问题代码,以便我们可以分析它。。。