我的数据库中的表有超过 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() 函数仅返回几条记录?我应该写这是一个异步函数吗?这是处理结果的正确方法吗?或者有更好的方法来处理我的案子吗?
正如评论中提到的,问题在于您将处理逻辑保留在获取逻辑之外。只需将其移入内部即可,例如如下:
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));
}
}
}
}
您不需要任何范式转变(例如异步、反应式等)即可使这种类型的流式传输发挥作用。只需从外部迭代切换到内部迭代