web-dev-qa-db-ja.com

JDBCを使用して大きなOracleテーブルを非同期的に読み取る

大きなOracleテーブルのすべての行を読み取るために使用できる戦略1回のみ、ただしJDBCを使用して可能な限り高速&Java ?

各行に重要な量のデータがあることを考慮してください(一部の列の大きなテキストを含む30列)。

私が考えることができるいくつかの戦略は次のとおりです。

  • シングルスレッドと読み取りテーブル。 (遅すぎますが、わかりやすくするためにリストされています)
  • IDをConcurrentLinkedQueueに読み込み、スレッドを使用してキューを消費し、IDごとにバッチでクエリを実行します。
  • IDをJMSキューに読み込み、ワーカーを使用してキューを消費し、IDごとにバッチでクエリを実行します。

他にどのような戦略を使用できますか?

この質問の目的のために、行の処理が自由であると仮定します。

1
Ben George

まず第一に、どれくらい速くする必要がありますか? 「時期尚早の最適化」ゾーンに入らないように注意する必要があります。

明確にするための最初の提案は、jdbc_batch_sizeを増やすことです。 Oracleデータベースが別のホスト上にある場合は、すべての提案でパフォーマンスが向上します。

ページングを実装してデータセットを複数のページに分割し、提案を使用できます

  • 行/ページ全体をConcurrentLinkedQueueに読み込み、スレッドを使用してキューを消費します(より多くのメモリを使用する代わりに、IDに基づいて再クエリする必要がなくなります)
  • 同様のアプローチをJMSの提案に使用できます

別の提案は、これが機能するかどうかはわかりませんが、Java Streams APIを使用してResultSetを処理することです。このためのコードはおそらくより簡潔なので、プラスになります。唯一の欠点は、ResultSetを並行して処理できない可能性があることです(洞察については、 this および this を参照してください)。

1
Shiraaz.M