Функциональная обработка курсора базы данных в Scala
Когда мне нужно прочитать миллионы строк базы данных из базы данных PostgreSQL с помощью драйвера JDBC, я всегда использую курсор, в противном случае я получу OutOfMemoryError. Вот шаблон (псевдокод), который я использую:
begin transaction
execute("declare cursor...")
while (true) {
boolean processedSomeRows = false
resultSet = executeQuery("fetch forward...")
while (resultSet.next()) {
processedSomeRows = true
...
}
if (!processedSomeRows) break
}
close cursor
commit
Это болеефункциональный» эквивалент, который я придумал для реализации в Scala:
begin transaction
execute("declare cursor...")
@tailrec
def loop(resultSet: ResultSet,
processed: Boolean): Boolean = {
if (!resultSet.next()) processed
else {
// Process current result set row
loop(resultSet, true)
}
}
while (loop(executeQuery("fetch forward..."), false))
; //Empty loop
close cursor
commit
Я знаю, что это надумано, но есть ли лучший способ, не прибегая к изменчивости? Если бы я пытался сделать это в Хаскеле, я мог бы найти решение, которое включало бы монады, но я нене хочу отправлять мои мысли вниз "извилистые маленькие отрывки, все одинаковые " потому что это может никогда не вернуться ...