問題
開発者がトリガーでApexヒープ制限のエラーに遭遇した場合、このエラーを回避する方法はどれですか。 2つ選びなさい。
- 変数を宣言するときにtransientキーワードを使用する。
- 関連するオブジェクトを更新するときに、関連するオブジェクトの項目をクエリしてコレクションに保存する。
- 使用後にコレクションを削除するか、nullに設定する。
- 大きなクエリ結果を単一のコレクションに割り当ててコレクションをループする代わりに、SOQLのループを使用する。
正解
- 変数を宣言するときにtransientキーワードを使用する。
- 関連するオブジェクトを更新するときに、関連するオブジェクトの項目をクエリしてコレクションに保存する。
- 使用後にコレクションを削除するか、nullに設定する。
- 大きなクエリ結果を単一のコレクションに割り当ててコレクションをループする代わりに、SOQLのループを使用する。
解説
それぞれの選択肢の理由について説明します。
□ 変数を宣言するときにtransientキーワードを使用する。
これは不正解です。transient キーワードはVisualforceページのビューステートサイズを削減するため使用されますが、Apexのヒープ制限には直接関係ありません。
□ 関連するオブジェクトを更新するときに、関連するオブジェクトの項目をクエリしてコレクションに保存する。
これは不正解です。関連するオブジェクトの項目をクエリしてコレクションに保存するだけでは、ヒープ制限の問題を解決するわけではありません。
□ 使用後にコレクションを削除するか、nullに設定する。
これは正解です。コレクションからアイテムを削除することで、ランタイム中のヒープサイズを削減することができます。
□ 大きなクエリの結果を1つのコレクションに割り当て、そのコレクションをループするのではなく、SOQL for ループを使用してください。
これは正解です。SOQL for ループは、クエリの結果を直接ループするための特別な構文です。この方法では、クエリの結果は一度にすべてメモリにロードされず、必要に応じて少しずつロードされます。これにより、大量のレコードを返すクエリでもヒープ制限を超えるリスクが低くなります。一方、通常の方法では、クエリが非常に多くのレコードを返す場合、すべてのレコードがメモリに格納されるため、ヒープ制限を超える可能性があります。
コメント