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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-02 05:37:09889ブラウズ

How Can I Efficiently Stream Large MySQL Result Sets to Avoid Memory Errors?

MySQL を使用した大規模な結果セットのストリーミング

MySQL で大規模なテーブルを操作する場合、デフォルト設定により過剰なリソース消費とメモリ エラーが発生する可能性があります。結果セット全体をメモリにロードする JDBC ドライバーの動作。これを軽減するには、データを一度にすべてロードするのではなく、データをストリーミングするための適切な手法を実装することが不可欠です。

アプローチ

提供された質問では、statement.setFetchSize(Integer) を使用することを提案しています。 .MIN_VALUE);データの読み込みを制限しますが、これだけでは不十分です。 MySQL JDBC ドライバーのドキュメントによると、効果的なストリーミングには結果セットを TYPE_FORWARD_ONLY および CONCUR_READ_ONLY に設定する必要があります:

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

ただし、このアプローチには潜在的な欠点があることに注意することが重要です:

  • 結果セット内のすべての行は、クエリに対してさらにクエリを発行する前に処理する必要があります。接続。
  • ロックは、トランザクションが完了するか、すべての結果が読み取られるか、アクティブな結果セットが閉じられるとのみ解放されます。

その他の考慮事項

結果セットを TYPE_FORWARD_ONLY および CONCUR_READ_ONLY に設定してもメモリが解決されない場合問題がある場合、根本的な原因は、処理される前に Java のメモリにデータが保存されていることである可能性があります。これに対処するには、データが入ってくるとすぐに処理する必要があり、これには大幅なコードの変更が必要になる場合があります。詳細については、同様の問題に対処する回答内のリンクを参照してください。

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

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