【发布时间】:2020-10-15 09:17:57
【问题描述】:
我在我的 Spring Boot 应用程序中执行一个函数,在 REST 请求中,我必须等待数据库中的变量具有“x”值,然后将响应返回给客户端。
我用Thread.sleep() 做了一段时间,但就性能而言,这是最好的方法吗?
带有 Thread.sleep 的代码:
while(!peticionTmp.isRealizada()) {
entityManager.clear();
peticionTmp = peticionesRepository.findById(peticion_id);
Thread.sleep(3000);
System.out.println("Iteración! --> " + peticionTmp);
}
return peticionTmp.isRealizada();
我看到了可以用这个做什么:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor ();
scheduler.schedule (() -> {
/ *
* define work to be done inside this lambda
* /
}, diffTime, TimeUnit.MILLISECONDS);
但是暂时不知道怎么实现。
客户端发送请求,spring boot 应用程序将请求保存到数据库,现在另一个程序查看数据库以搜索请求,创建包含请求的服务并更改该请求的数据库中的一个字段, spring boot 当它看到它已更改该字段时,我将响应返回给客户端...
【问题讨论】:
-
这似乎不是一个好主意...谁在更改数据库?如果您确定不会对数据库进行任何外部更改,则可以改为以可以通知更改(即可观察)的方式修改您的存储库,这样您就可以立即知道何时达到了所需的状态。
-
我认为您的
Thread.sleep方法是正确的。但是,整体设计似乎不正确。当结果在数据库中时,您宁愿使用回调,而不是让连接保持打开状态等待结果。 -
@ACV "Spin-Wait" 通常被认为是一种反模式。虽然有时无法避免,但您应该尽可能避免。这似乎是一个可以避免的例子,但需要付出一些巨大的努力。
-
您应该在 API 上使用长轮询或实现客户端通知,例如通过 websockets 或使用 HTPP2。阻止 REST 请求是一个糟糕的主意。
-
但就性能而言,这样做是不是最好的方法 ...这是一个荒谬的说法。你担心什么样的表现? “最佳”总是是主观的。例如,请注意(就 CPU 周期而言)您的第二个选项更重。而第一个解决方案意味着:您等待 3 秒。这可能太长了,所以从理论上讲,这可能会增加某些用户的延迟。但我们不知道任何这样的细节。你知道。所以,这里没有人能告诉你什么是对你最好的。
标签: java spring multithreading algorithm spring-boot