Jooq Java 代码处理表中超过 200k 条记录

问题描述 投票:0回答:1

我的数据库中的表有超过 200k 条记录,我不想在结果集中一次性获取所有记录进行处理。我正在尝试在服务中编写一个函数,该函数调用另一个持久性类函数来仅处理 1000 条记录。 一旦处理完 1000 条记录,它应该获取接下来的 1000 条记录。我在 Java 代码中使用 JOOQ 数据库库。我只是分享我脑海中的示例框架代码。

class RecordService {
    RecordPersistence recordPersistence = new RecordPersistence();

    public void processRecords() {

        List<Record> records = recordPersistence.fetchRecords();
        // Code to process them
     }
} 


class RecordPersistence {
    public List<Record>  fetchRecords(){
        
        Cursor<Record> records = dsl.select...fetchLazy();

        while (records.hasNext()) {
           records.fetchNext(1000);
        }
        return records
    }
}

如何从 fetchRecords() 函数仅返回几条记录?我应该写这是一个异步函数吗?这是处理结果的正确方法吗?或者有更好的方法来处理我的案子吗?

java persistence jooq dsl querydsl
1个回答
0
投票

正如评论中提到的,问题在于您将处理逻辑保留在获取逻辑之外。只需将其移入内部即可,例如如下:

class RecordService {
    RecordPersistence recordPersistence = new RecordPersistence();

    public void processRecords() {

        recordPersistence.fetchRecords(
            (List<Record> records) -> {
                // Code to process them
            }
        );
     }
} 

class RecordPersistence {
    public List<Record> fetchRecords(Consumer<? super List<Record>> consumer) {
        try (Cursor<Record> cursor = dsl.select...fetchLazy()) {
            while (cursor.hasNext()) {
                consumer.accept(cursor.fetchNext(1000));
            }
        }
    }
}

您不需要任何范式转变(例如异步、反应式等)即可使这种类型的流式传输发挥作用。只需从外部迭代切换到内部迭代

© www.soinside.com 2019 - 2024. All rights reserved.