私はあまりにも自分のORMをロールバックしていると言いたいことは何度もあります!すべてのフェッチが単一のAPI(またはそのサブクラス)を介して行われる場合、キャッシング/メモ化は非常に簡単です。
ユニークキーに基づいたフェッチでは、キーの連結に基づいてキャッシュすることができます。単純なアプローチは次のようになります。代わりにハッシュの
my %_cache;
sub get_object_from_db {
my ($self, $table, %table_lookup_key) = @_;
# concatenate a unique key for this object
my $cache_key = join('|', map { "$_|$table_lookup_key{$_}" }
sort keys %table_lookup_key
return $_cache{$cache_key}
if exists $_cache{$cache_key};
# otherwise get the object from the db and cache it in the hash
# before returning
}
は、あなたがあなたのキャッシュ内の時間とメモリの制限を実装するためにCPANにモジュールのキャッシュ::スイートを使用することができます。
キャッシュに入れようとしているのであれば、キャッシュ内のオブジェクトを期限切れにする方法について考えるとよいでしょう。たとえば、すべての更新もORMを経由する場合は、update()ORMメソッドのキャッシュエントリをクリア(または更新)できます。
念入りに考えると、毎回同じオブジェクトが返されていますが、これは意味があります。たとえば、あるコードがオブジェクトを取得して値を更新するがその変更をdbにコミットしない場合、そのオブジェクトを取得する他のすべてのコードはその変更を認識します。これは一連の操作を一緒にストリング化している場合に非常に便利です。オブジェクトをすべて更新してから最後にコミットできますが、意図したとおりではありません。私は通常、データベースから新鮮なときにオブジェクトにフラグを設定し、オブジェクトが更新されていればセッターメソッドでそのフラグを無効にします。新しいオブジェクトが本当に必要な場合は、常にそのフラグをチェックできます。