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 サイトの他の関連記事を参照してください。