gpt4 book ai didi

java - JPA 存储库和阻塞 I/O

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:43 26 4
gpt4 key购买 nike

我遇到一个问题,在使用 JpaRepository 写入数据库后,我需要在单独的线程上执行多个慢速 HTTP 请求。问题是 doActualJob() 在等待一系列 futures 解决时阻塞。这似乎可以防止底层 Hibernate session 关闭,从而导致应用程序很快就用完连接。

如何编写此函数,以便在执行阻塞 I/O 时数据库连接不会保持打开状态?甚至可以使用 JpaRepositories,还是我需要使用较低级别的 API,如 EntityManager/SessionFactory?

@Service
class SomeJobRunner {

private final SomeJobRepository mSomeJobRepository; //extends JpaRepository

@AutoWired
public SomeJobRunner(final SomeJobRepository someJobRepository) {
mSomeJobRepository = someJobRepository;
}

@Async
public void doSlowJob(final long someJobId) {
SomeJob someJob = mSomeJobRepository.findOne(someJobId);
someJob.setJobStarted(Instant.now());
mSomeJobRepository.saveAndFlush(someJob);

doActualjob(); // Synchronous job doing several requests using Unirest in series

someJob = mSomeJobRepository.findOne(someJobId);
someJob.setJobEnded(Instant.now());
mSomeJobRepository.saveAndFlush(someJob);
}

最佳答案

嗯——非阻塞数据库 IO 在 Java/JDBC 世界中以标准方式是不可能的。简单地说——你的 Spring 数据存储库最终将使用 JPA ORM 实现(比如 Hibernate),而 JPA ORM 实现又将使用 JDBC与本质上是阻塞的数据库进行交互。 Oracle ( Asynchronous Database Access API ) 目前正在做这方面的工作,以提供与 JDBC 类似但非阻塞的 API。他们打算将此作为标准提出。 Spring 人员也为此做出了令人兴奋的并行努力,即 R2DBC – Reactive Relational Database Connectivity .他们实际上也将其与 Spring 数据集成 ( link ),这样可以帮助您集成到您的解决方案中。可以找到 Spring 的一个很好的教程 here .

编辑:截至 2022 年,Hibernate 有 reactive选项也是

关于java - JPA 存储库和阻塞 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56294522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com