Le traitement d'un ResultSet SQL comme un Scala Flux

Quand j'ai une requête à une base de données et de recevoir une (avant uniquement en lecture seule) jeu de résultats, le jeu de résultats agit comme une liste de lignes de la base de données.

Je suis en train d'essayer de trouver un moyen de traiter ce ResultSet comme un Scala Stream. Cela permettra à des opérations telles que le filter, map, etc., alors que ne pas consommer de grandes quantités de RAM.

J'ai mis en place une queue-méthode récursive pour extraire les éléments individuels, mais cela nécessite que tous les éléments soient en mémoire dans le même temps, un problème si le jeu de résultats est très 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)
  }
}
  • Pourriez-vous utiliser un objet iterable au lieu d'un Ruisseau pour faire ce que vous voulez?
  • Également un flux de retenir la valeur dans la mémoire de toute façon si vous ne économiser de la mémoire au moment où vous atteignez la fin de la liste.
  • Je pense que sans jdbc drapeau/option qui rend jdbc lui-même flux, les résultats, vous avez toujours une copie complète des données dans la mémoire, construit par votre api jdbc.
InformationsquelleAutor Ralph | 2012-03-09