ホームページ >データベース >mysql チュートリアル >OutOfMemoryErrors を回避するために Spring で大規模な MySQL 結果セットを効率的にストリーミングするにはどうすればよいですか?

OutOfMemoryErrors を回避するために Spring で大規模な MySQL 結果セットを効率的にストリーミングするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-30 04:19:12262ブラウズ

How Can I Efficiently Stream Large MySQL Result Sets in Spring to Avoid OutOfMemoryErrors?

大規模な MySQL 結果の効率的なストリーミング

Spring アプリケーションの開発において、巨大な MySQL テーブルからデータを取得することは、潜在的に大きな課題となる可能性があります。 OutOfMemoryExceptions が発生します。これは、MySQL JDBC ドライバーのデフォルトの動作では、結果セット全体がメモリにロードされるためです。

フェッチ サイズの設定: 不十分な対策

この問題を軽減するには開発者は、statement.setFetchSize(Integer.MIN_VALUE) メソッドを使用してフェッチ サイズを設定することがよくあります。ただし、これだけでは包括的な解決策ではありません。 Statement#setFetchSize() のドキュメントに記載されているように、フェッチ サイズはドライバーにヒントを提供するだけであり、尊重される場合もされない場合もあります。

MySQL JDBC ドキュメントの再確認

MySQL JDBC ドライバーのドキュメントを詳しく調べると、大規模な結果をストリーミングするためのより微妙なアプローチが明らかになります。ストリーミングを有効にするには、次のようにステートメントを作成する必要があります:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

ストリーミングの注意事項

このアプローチの実装には、次のような注意事項があります:

  1. 行処理: を処理することが重要です結果セット内のすべての行を削除するか、ただちに結果セットを閉じます。これを行わないと、接続上で後続のクエリを実行するときに例外がスローされます。
  2. トランザクション完了: ステートメントがトランザクションに属している場合、ロックは両方のトランザクションが完了した場合にのみ解放されます。取引と明細が完了しました。これは、すべての結果を読み取るか、結果セットを閉じる必要があることを意味します。

メモリ割り当てを再考してください

フェッチ サイズを設定し、ステートメントの作成を調整する場合は、 OutOfMemoryError を解決するには、根本原因は Java メモリ内のデータの保存にある可能性があります。結果セット全体をキャッシュするのではなく、結果セットが使用可能になったらすぐに処理することを検討してください。これには大幅なコードの変更が必要になる場合があり、完全な書き換えが必要になる可能性があります。

以上がOutOfMemoryErrors を回避するために Spring で大規模な MySQL 結果セットを効率的にストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。