2011-09-30 72 views
6

我有一個數據庫很少更改的應用程序,並且應用程序需要從數據庫讀取很多數據,這會顯着降低性能。這些讀取中的許多完全相同。所以我想讓DBI緩存數據庫讀取的結果。可以DBI語句處理使用緩存的調用執行()?

例如,

$sth = $dbh->prepare('SELECT a, b FROM a_table WHERE c = ?'); 
$sth->execute(5); 
$sth->execute(2); 
$sth->execute(5); # this call loads the cached result set 

我首先想到這是prepare_cached的做法,但我意識到,這只是緩存語句句柄本身和語句句柄的不是實際的執行。

我想我可以通過將語句執行包裝在memoized子文件中來實現我想要的。但我只是看到DBI本身是否有捷徑。

回答

7

正如您所說,prepare_cached與語句句柄相關,並且需要緩存執行結果。 Memoize是好的,但可能需要不時使緩存失效,然後重新執行查詢以從數據庫中獲取全新副本。 我會使用緩存(http://search.cpan.org/perldoc?Cache)模塊。我只是複製此片段從介紹:

use Cache::File; 

my $cache = Cache::File->new(cache_root => '/tmp/cacheroot'); 
my $customer = $cache->get($name); 

unless ($customer) { 
    $customer = get_customer_from_db($name); 
    $cache->set($name, $customer, '10 minutes'); 
} 

return $customer; 

您可以在內存中緩存,而不是文件中使用。如果存在並且它是有效的,則此示例使用來自緩存的$ customer值,否則將獲得新值並存儲在緩存中(具有10分鐘的生命)。

希望這會有所幫助。