Newer Version Available
CacheBuilder インターフェースを使用した安全な値のキャッシュ
Apex クラスで何をキャッシュするかを宣言するだけでなく、CacheBuilder インターフェースを実装する内部クラスを作成します。このインターフェースには、doLoad(String var) という 1 つのメソッドがあり、doLoad(String var) メソッドの引数に基づいてキャッシュ値を構築するロジックのコードを作成して上書きします。
CacheBuilder でキャッシュした値を取得するために、doLoad(String var) メソッドを直接コールすることはありません。代わりに、CacheBuilder を実装するクラスを初めて参照するときに Salesforce が間接的にコールします。値が存在する場合は、それ以降のコールでキャッシュから値が取得されます。値が存在しない場合は、値を構築するために doLoad(String var) メソッドが再度コールされ、その後その値が返されます。そのため、CacheBuilder インターフェースを使用しているときは、put() メソッドを実行しません。doLoad(String var) メソッドによってキャッシュの欠落がチェックされるため、null 値を確認するコードを各自が記述する必要はありません。
例を見てみましょう。Visualforce ページの Apex コントローラークラスのコードを記述しているとします。Apex クラスで、ユーザー ID を基にユーザーレコードを検索する SOQL クエリを実行することがよくあります。SOQL クエリは高価である可能���があります。また、通常、Salesforce ユーザーレコードは頻繁に変更されません。そのため、ユーザー情報が CacheBuilder の適切な候補になります。
コントローラークラスで、CacheBuilder インターフェースを実装して、doLoad(String var) メソッドを上書きする内部クラスを作成します。次に、ユーザー ID をそのパラメーターとする doLoad(String var) メソッドに SOQL コードを追加します。
1class UserInfoCache implements Cache.CacheBuilder {
2 public Object doLoad(String userid) {
3 User u = (User)[SELECT Id, IsActive, username FROM User WHERE id =: userid];
4 return u;
5 }
6}組織のキャッシュからユーザーレコードを取得するには、UserInfoCache クラスとユーザー ID を渡す Org.get(cacheBuilder, key) メソッドを実行します。同様に、Session.get(cacheBuilder, key) と Partition.get(cacheBuilder, key) を使用して、それぞれセッションまたはパーティションのキャッシュから値を取得します。
1User batman = (User) Cache.Org.get(UserInfoCache.class, ‘00541000000ek4c');get() メソッドを実行すると、Salesforce が、文字列 00541000000ek4c と UserInfoCache で構成される一意のキーを使用してキャッシュを検索します。キャッシュ値が検出された場合は、その値が返されます。この例のキャッシュ値は、ID 00541000000ek4c に関連付けられたユーザーレコードです。値が見つからない場合は、Salesforce が UserInfoCache の doLoad(String var) メソッドを再度実行して (および SOQL クエリを再度実行して)、ユーザーレコードをキャッシュしてから、そのレコードを返します。
CacheBuilder のコーディング要件
CacheBuilder インターフェースを実装するクラスのコードを記述するときは、次の要件に従います。
- doLoad(String var) メソッドは、そのメソッドのコードでパラメーターを使用しなくても、String パラメーターを取る必要があります。Salesforce は文字列とクラス名を組み合わせて、キャッシュ値の一意のキーを構築します。
- doLoad(String var) メソッドは、null を含めてどのような値も返す可能性があります。null 値が返された場合、直接 CacheBuilder コンシューマーに配信され、キャッシュされません。CacheBuilder コンシューマーは null 値を適切に処理するよう期待されています。キャッシュキーを再作成するための一時的なエラーを反映させるには null 値を使用することをお勧めします。
- CacheBuilder を実装するクラスは非静的でなければなりません。Salesforce がクラスを新たにインスタンス化し、doLoad(String var) メソッドを実行してキャッシュ値を作成するためです。