タイムリミットまで、残り32分 コレクションサイズエラーの特定と対応について【Salesforce】

読者の皆様、 コムコム.comです。

今年の秋は、期間が短いように感じています。

さて今回は、つい先日発生した障害と解決方法について、紹介したいと思います。

システム利用者から、【コレクションサイズ 1,019 は、1,000 の最大サイズを超えています。】

システムエラーが発生し、Visualforce画面が表示出来ないと障害連絡がありました。

また、障害が発生している画面を使用して打合せをするとの事で、打合せ時刻まで残り32分と時間制限のある作業になりました。

困った時の、Google先生という事で、さっそくエラーメッセージを検索をしてHITした内容は、<apex:repeat> に関する情報でした。
 >>参照ページ

障害が発生している画面は、<apex:repeat>を使用していますが、検索処理をした後に動作する部分の為、今回の事象には一致しませんでした。

そもそも、画面起動時にエラーが発生しているのと、最大サイズ1000を越える大量のデータを取得している。

この2点を頭に入れて、ソースをチェックした結果、 選択リストの取得処理部分が怪しいと当たりをつけました。

この選択リストは、SOQLで動的に出力する選択項目を取得しており、データ取得時のSOQLを実行すると1018件とエラーメッセージに表示されているのと近い件数が取得出来たのと

直近で関係するオブジェクトにデータ追加をして、その後にエラーが発生している点から、可能性が非常に高いと判断しました。

このタイミングで、制限時間まで残り15分を切っていましたので、ソース修正とリリースをするには時間が足りないと判断し、先ほど追加したデータを消す判断をして、

データを消したらエラーが解消され、画面が表示されました。

翌日、選択リストのデータ取得部分の見直しを入れて、改修版をリリースした後に、削除したデータを投入した以降は発生していません。

また、確認の意味で再現テストをしました。方法は、選択リストの取得部分で1000件と1001件以上を切り替えて、それぞれ画面に表示させました。

/**
    * セレクトボックスの生成処理
    */
    public List<SelectOption> getSelectOptions() {
        List<SelectOption> options = new List<SelectOption>();
	//↓以下を切り替えて検証
        //通常時
	Integer MaxCount = 1000;
	//エラー発生時
	//Integer MaxCount = 1010;
        String SetCount = '';
        for(Integer count = 0; count < MaxCount; count++){
            SetCount = String.valueOf(count);
            options.add(new SelectOption(SetCount, SetCount));
        }
        return options;
    }

結果は、以下の通りで、1000件は、表示されていますが、1001件以上の場合は、コレクションサイズのエラーが表示されています。

①1000件以内の場合、選択リストが表示される

9-1

②1001件以上の場合、エラーが発生

9-2_

なお、改めて今回発生したエラーメッセージを、ネットで検索をしても選択リスト部分で発生する事を記載しているサイトを見つける事は出来ませんでした。

対応までのタイムリミットがある状況下で、一つ一つの可能性を潰して行き、答えを見つけ出せるかは、どれだけ冷静に対応出来るかである事を久しぶりに経験しました。正直冷や汗だらだらでした。 

選択リストに1000件近くのデータを設定する事は、あまりないと思いますが、もし同じ障害が発生した場合に、この記事を見て参考にしていただければと思います。

それでは、またどこかでお会いしましょう