問題
開発者は、Apexクラスのメソッドを特定する必要があります。このメソッドは、Account上のSOQL文の結果セットを繰り返し処理することで、メモリ内でリソース負荷が高い処理を実行します。また、このメソッドは変更をデータベースに保存するためにDMLステートメントを実行します。トランザクション制御を確実にし、ガバナー制限の超過を回避するための最善の方法として、開発者が実装すべき1つの技法はどれですか。
- Database.Savepointメソッドを使用して、データベースの整合性を強制します。
- 部分的なDML文を使用して、有効なデータのみがコミットされるようにします。
- @ReadOnlyアノテーションを使用して、SOQLによって返される行数を回避します。
- System.Limitクラスを使用して、現在のCPUガバナー制限の消費量を監視します。
正解
- Database.Savepointメソッドを使用して、データベースの整合性を強制します。
- 部分的なDML文を使用して、有効なデータのみがコミットされるようにします。
- @ReadOnlyアノテーションを使用して、SOQLによって返される行数を回避します。
- System.Limitクラスを使用して、現在のCPUガバナー制限の消費量を監視します。
解説
それぞれの選択肢の理由について説明します。
□ Database.Savepointメソッドを使用して、データベースの整合性を強制します。
これは不正解です。Apexには「Database.Savepointメソッド」という名前のメソッドは存在しません。しかし、SalesforceにはDatabase.setSavepoint()
というメソッドが存在し、これを使用するとトランザクションの特定の時点をマークすることができます。その後、Database.rollback(databaseSavepoint)
メソッドを利用して、指定したセーブポイントまでのDML操作を取り消すことができます。このrollback
メソッドを使うことで、エラーが発生した場合や予期せぬ問題が生じた時に、データベースの状態を元の状態に戻すことができるのです。したがって、「データベースの整合性を強制する」という文脈での使用は正しいと言えますが、問題文のメソッド名が不正確であるため、この選択肢は不正解となります。
□ 部分的なDML文を使用して、有効なデータのみがコミットされるようにします。
これは不正解です。Database.insert(records, false)
やその他の部分的なDML操作はエラーを起こすレコードだけを失敗させ、他のレコードは正常に操作します。しかし、レコード数が多い場合やすべてのレコードが有効である場合、ガバナー制限を超える可能性があります。
□ @ReadOnlyアノテーションを使用して、SOQLによって返される行数を回避します。
これは不正解です。@ReadOnlyアノテーションは、SOQLの行数制限を増やすことができますが、DML操作は許可されていません。このシナリオでは、メソッドがDMLステートメントを実行するため、このアノテーションは適切ではありません。
□ System.Limitクラスを使用して、現在のCPUガバナー制限の消費量を監視します。
これは正解です。System.Limitsクラスを使用することで、ガバナ制限の消費量をリアルタイムで監視することができます。これにより、リソースを大量に消費しているメソッドや処理を特定し、ガバナ制限の超過を回避するための最適化を行うことができます。
コメント