0

List[String]チャンクにグループ化する必要があることがわかりました。チャンクごとにList[String]、結果として を返すクエリ (JDBC) を実行する必要があります。

私が到達しようとしているのは次のとおりです。

  • 1 つのフラット リストに連結されたさまざまなチャンクからのすべての結果
  • 非厳密なコレクションになる最終的なフラット リスト(メモリに ResultSet 全体をロードしないようにするため)

これは私がやったことです:

与えられたaStreamから aを生成する(これがチャンクです):ResultSetList[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()

(変数名は概念を証明するためのものです)。

それはうまくいくように見えますが、私は少し緊張しています:

  1. Iterator[Stream]for-comprehension を使用して を生成します。これは人がすることですか?
  2. flattening は言いましたIterator[Stream] (flattening 中に評価されないと思いますか?)。
  3. 接続とステートメントを閉じた、最終的なリストを使用する方法はありますか?
    たとえば、長時間続く操作を行う必要があり、その間接続を開いたままにしたくない場合、どのようなオプションがありますか?
  4. このコードは実際にDB ResultSet全体を一度にメモリにロードするのを防ぎますか(これが私の実際の目標でした)?
4

1 に答える 1