Могут ли дескрипторы инструкций DBI использовать кэшированные вызовы для выполнения ()?

#performance #perl #dbi

#Производительность #perl #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 делает, но я понял, что он кэширует только сам дескриптор оператора, а не фактическое выполнение дескриптора оператора.

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

Ответ №1:

как вы сказали, prepare_cached связан с дескриптором инструкции, и вам необходимо кэшировать результаты выполнения. Запоминание — это хорошо, но, вероятно, вам нужно время от времени аннулировать кеш и повторно выполнять запрос, чтобы получить новую копию из базы данных. Я бы использовал кеш (http://search.cpan.org/perldoc ?Модуль кэша). Я только что скопировал этот фрагмент из введения:

 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 минутами жизни).

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