Gdy wyszukuję bazę danych i otrzymuję wynikowy zestaw wyników (tylko do odczytu), funkcja ResultSet działa jak lista wierszy bazy danych.Traktowanie zestawu wynikowego SQL, takiego jak strumień Scala
Próbuję znaleźć sposób, aby traktować ten zestaw wyników jak Scala Stream
. Umożliwi to takie operacje, jak filter
, map
itp., Nie zużywając przy tym dużych ilości pamięci RAM.
I wdrożone metody ogon rekurencyjnej, aby wyodrębnić poszczególne elementy, ale wymaga to, że wszystkie elementy są w pamięci w tym samym czasie, to problem, jeśli wynikowa jest bardzo duża:
// 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)
}
}
Czy możesz użyć Iterable zamiast Stream, aby zrobić to, co chcesz? –
Również strumień zachowa wartości w pamięci, tak więc nie będziesz faktycznie zapisywać pamięci, gdy dojdziesz do końca listy. –
Myślę, że bez flagi/opcji jdbc, która powoduje, że jdbc sam przesyła wyniki, wciąż masz jedną pełną kopię danych w pamięci, zbudowaną przez twój interfejs API jdbc. – matanster