2009-04-16 35 views

回答

3

我也推出了自己的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,則可以在更新()ORM方法中清除(或更新)緩存條目。

最後一點要仔細考慮 - 每次都會返回相同的對象,這會產生影響。例如,如果一段代碼檢索一個對象並更新一個值,但是沒有將該更改提交給該數據庫,則檢索該對象的所有其他代碼將看到該更改。如果你將一系列操作串聯在一起,這可能非常有用 - 它們都可以更新對象,然後你可以在最後提交它 - 但它可能不是你想要的。我通常在對象剛從數據庫中新建一個標誌,然後在你的setter方法中,如果對象被更新,則使該標誌無效 - 這樣,如果你真的想要一個新的對象,你可以隨時檢查該標誌。

2

有幾次我們推出了自己的產品,但是我們將其限制在特殊情況下,分析表明我們需要提升(例如大型聯接)。由於我們的應用程序通常在DB訪問之上使用自定義抽象層(類似於本土ORM),這就是我們實現緩存的地方。我們取得了令人滿意的好成績,並且沒有花費很多精力。當然,由於我們沒有使用CPAN ORM,我們也沒有任何關於使用CPAN緩存模塊的選擇。

這是嚴格的個案和選擇加入。無論您最終使用CPAN解決方案還是自行開發,最好將其限制爲分析表明您需要幫助的情況,並確保它是可選的,以便您的緩存不會以微妙的方式破壞您的應用程序當你沒有想到它會活躍時。

相關問題