2011-09-30 7 views
6

Tengo una aplicación donde la base de datos rara vez cambia, y la aplicación requiere muchas lecturas de la base de datos que ralentiza el rendimiento de manera bastante significativa. Muchas de estas lecturas son exactamente lo mismo. Así que quiero que DBI guarde en caché los resultados de una lectura de base de datos.¿Pueden manejar las sentencias de DBI las llamadas en caché para ejecutar()?

Por ejemplo,

$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 

pensé por primera vez esto es lo que hace prepare_cached, pero me di cuenta de que sólo se almacena el identificador de instrucción en sí y ejecuciones no reales de contexto de sentencia.

Supongo que puedo lograr lo que quiero al envolver la ejecución de la declaración dentro de un subcomunicado. Pero solo estoy viendo si hay un atajo dentro de DBI.

Respuesta

7

como dijiste, prepare_cached está relacionado con el descriptor de contexto de la declaración, y necesitas almacenar en caché los resultados de la ejecución. Memoize es bueno, pero probablemente necesite invalidar la caché de vez en cuando, y vuelva a ejecutar la consulta para obtener una nueva copia de la base de datos. Usaría el módulo Caché (http://search.cpan.org/perldoc?Cache). Acabo de copiar este fragmento de la introducción:

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; 

Puede utilizar en memoria caché en lugar de Archivo. Este ejemplo utiliza el valor de $ cliente de la memoria caché, si existe, y es válida; de lo contrario, obtiene un valor nuevo y se almacena en la memoria caché (con 10 minutos de vida útil).

Espero que esto ayude.

Cuestiones relacionadas