Может ли дескриптор оператора DBI использовать кэшированные вызовы execute ()? - PullRequest
6 голосов
/ 30 сентября 2011

У меня есть приложение, в котором база данных редко изменяется, и приложение требует много чтений из базы данных, что значительно снижает производительность. Многие из этих чтений абсолютно одинаковы. Поэтому я хочу, чтобы 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, но я понял, что он кэширует только сам дескриптор оператора, а не фактические исполнения дескриптора оператора.

Полагаю, я мог бы достичь того, чего хотел, обернув выполнение оператора внутри запомненной подпрограммы. Но я просто вижу, есть ли ярлык в самом DBI.

1 Ответ

7 голосов
/ 30 сентября 2011

как вы сказали, prepare_cached связан с дескриптором оператора, и вам необходимо кэшировать результаты выполнения. Memoize хорош, но, вероятно, вам нужно время от времени аннулировать кэш и повторять запрос, чтобы получить свежую копию из базы данных. Я бы использовал модуль Cache (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 минутами жизни).

Надеюсь, это поможет.

...