Apexでいろいろ機能を追加しているうちに、いつの間にか処理が重くなりすぎて「Apex CPU time limit exceeded」エラーが出てしまった、、、
なんてことよくあります。
ということで、今回は「CPU時間の制限とはなんぞや?」と「CPU時間の制限を回避しよう」のテーマで書いてみました。
CPU時間の制限とは?
「CPU時間の制限」とは Salesforceに設けられているガバナ制限の1つで、1つのトランザクションで発生する処理時間の制限を指します。
「Apex CPU time limit exceeded」エラーが出たということは、処理に時間がかかりすぎて、定められている上限を超えてしまったことを意味します。
CPU時間の制限は下表の通りです。
説明 | 同期処理 | 非同期処理 |
---|---|---|
Salesforce サーバの最大 CPU 時間 | 10,000 ミリ秒 | 60,000 ミリ秒 |
同期処理であれば1トランザクションにつき「 10,000 ミリ秒 」。
非同期処理であれば 同期処理であれば1トランザクションにつき「 60,000 ミリ秒 」がCPU時間の上限となっています。
多いのか少ないのかよくわからない!って感じですが、とりあえずこれを超えてしまうとガバナ制限に引っかかり、 「 Apex CPU time limit exceeded」エラーが出てしまいます。
CPU時間の制限を避けよう
CPU時間の制限に引っかからないようにするためには、非同期処理を使用するのがよさそうですね。
なんといってもCPU時間の制限が同期処理の6倍ありますから。
CPU時間の確認の仕方
CPU時間の確認は「Limits.getCpuTime() 」メソッド使用します。
以下のような感じで、CPU時間を計測したい箇所にデバッグを設置し、デバッグログから確認します。
System.debug('Limits.getCpuTime: ' + Limits.getCpuTime() );
デバッグログの 下部 に CUMULATIVE_LIMIT_USAGE 欄で表示される以下の箇所より
消費したCPU時間を確認できます。
表示例)
14:51:47:079 CUMULATIVE_LIMIT_USAGE
14:51:42:000 LIMIT_USAGE_FOR_NS Maximum CPU time: 3 out of 10000
コメント