List[String]
チャンクにグループ化する必要があることがわかりました。チャンクごとにList[String]
、結果として を返すクエリ (JDBC) を実行する必要があります。
私が到達しようとしているのは次のとおりです。
- 1 つのフラット リストに連結されたさまざまなチャンクからのすべての結果
- 非厳密なコレクションになる最終的なフラット リスト(メモリに ResultSet 全体をロードしないようにするため)
これは私がやったことです:
与えられたaStream
から aを生成する(これがチャンクです):ResultSet
List[String]
def resultOfChunk(chunk: List[String])(statement: Statement): Stream[String] = {
//..
val resultSet = statement.executeQuery(query)
new Iterator[String] {
def hasNext = resultSet.next()
def next() = resultSet.getString(1)
}.toStream
}
最終リストの作成:
val initialList: List[String] = //..
val connection = //..
val statement = connection.createStatement
val streams = for {
chunk <- initialList.grouped(10)
stream = resultOfChunk(chunk)(statement)
} yield stream
val finalList = streams.flatten
statement.close()
connection.close()
(変数名は概念を証明するためのものです)。
それはうまくいくように見えますが、私は少し緊張しています:
Iterator[Stream]
for-comprehension を使用して を生成します。これは人がすることですか?- flattening は言いました
Iterator[Stream]
(flattening 中に評価されないと思いますか?)。 - 接続とステートメントを閉じた後、最終的なリストを使用する方法はありますか?
たとえば、長時間続く操作を行う必要があり、その間接続を開いたままにしたくない場合、どのようなオプションがありますか? - このコードは実際にDB ResultSet全体を一度にメモリにロードするのを防ぎますか(これが私の実際の目標でした)?