When I query a database and receive a (forward-only, read-only) ResultSet back, the ResultSet acts like a list of database rows.
I am trying to find some way to treat this ResultSet like a Scala Stream
. This will allow such operations as filter
, map
, etc., while not consuming large amounts of RAM.
I implemented a tail-recursive method to extract the individual items, but this requires that all items be in memory at the same time, a problem if the ResultSet is very large:
// Iterate through the result set and gather all of the String values into a list
// then return that list
@tailrec
def loop(resultSet: ResultSet,
accumulator: List[String] = List()): List[String] = {
if (!resultSet.next) accumulator.reverse
else {
val value = resultSet.getString(1)
loop(resultSet, value +: accumulator)
}
}
ResultSet
itself fights the recursion pattern. Here's a solution allowing for a less memory-intensive alternative; i.e. do the per row work within the lambda and initiate the iterator with a.foreach()
: https://mcmap.net/q/373165/-scala-exposing-a-jdbc-resultset-through-a-generator-iterable – Dropkick