多个线程中的Spring读取查询并发执行

我有一个Spring启动项目,我想从x个不同的线程中执行数据库中的特定查询,同时防止不同的线程读取相同的数据库条目。到目前为止,我能够在多个线程中运行查询,但是没有找到“拆分”读取负载的方法。到目前为止,我的代码如下:

@Async
@Transactional
public CompletableFuture<Book> scanDatabase() {
    final List<Book> books = booksRepository.findAllBooks();
    return CompletableFuture.completedFuture(books);
}

关于我该如何处理的任何想法?

fanfan1133 回答:多个线程中的Spring读取查询并发执行

有很多方法可以做到这一点。

  1. 如果数据中的数字字段有些随机,则可以将条件添加到... and some_value % :N = :i之类的where子句中,其中:N是线程数的参数,而{ {1}}是特定线程的索引(从0开始)。

  2. 如果没有数字字段,则可以使用哈希函数创建一个数字字段,然后将其应用于其他字段以将其转换为数字字段。请参阅您的数据库特定文档以获取可用的哈希函数。

  3. 您可以使用诸如ROW_NUMBER()之类的分析函数来创建要在条件中使用的数值。

  4. 您可以在第一个查询中查询行数,然后查询正确的Slice using Spring Datas pagination feature

还有更多变体。 它们都有一个共同点,即整个行集在处理期间一定不能更改,否则您可能会多次查询或根本不查询行。

如果不能保证在实际选择它们之前需要标记要由线程处理的记录,例如,通过在额外的字段中标记它们,或在查询中使用:i子句。

最后一个问题是这是否真的是您所需要的。 在多个线程中查询数据可能不会使查询部分更快,因为这会使查询更加复杂,并且不会加速通常限制吞吐量的那些部分:应用程序与数据库之间的网络以及数据库中的I / O。 / p>

因此,通过一个查询选择数据并对其进行遍历,然后将其传递给线程池进行处理,可能是一种更好的方法。

您可能还想看看Spring Batch,这可能对处理大量数据有帮助。

本文链接:https://www.f2er.com/3163644.html

大家都在问