#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 минутами жизни).
Надеюсь, это поможет.