當我查詢數據庫並接收到(只進只讀)ResultSet時,ResultSet的行爲與數據庫行列表相似。像Scala流一樣處理SQL ResultSet
我想找到一些方法來對待這個ResultSet,比如Scala Stream
。這將允許諸如filter
,map
等的操作,而不消耗大量的RAM。
我實現了一個尾遞歸的方法來提取單個項目,但是這要求所有項目在記憶的同時,一個問題,如果ResultSet是非常大的:
// 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)
}
}
可以使用Iterable而不是Stream來執行您想要的操作嗎? – 2012-03-09 17:19:36
另外一個流將保留內存中的值,所以當你到達列表的末尾時,你不會真正保存內存。 – 2013-07-30 13:16:53
我認爲如果沒有jdbc標誌/選項使得jdbc自己對結果進行流式處理,那麼您的內存中仍然有一個完整的數據副本,由您的jdbc api構建。 – matanster 2016-03-08 20:57:41