Функциональная обработка курсора базы данных в 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

Я знаю, что это надумано, но есть ли лучший способ, не прибегая к изменчивости? Если бы я пытался сделать это в Хаскеле, я мог бы найти решение, которое включало бы монады, но я нене хочу отправлять мои мысли вниз "извилистые маленькие отрывки, все одинаковые " потому что это может никогда не вернуться ...

Ответы на вопрос(2)

Ваш ответ на вопрос