[caracas-pm] Re: [l-linux] perl+postgres y el consumo de memoria

Ernesto Hernández-Novich emhn at telcel.net.ve
Sat Mar 5 08:45:26 PST 2005


On Fri, 2005-03-04 at 14:33 -0800, Daniel Cubero Salas wrote:
> Consejo: Debido a que realizo varias llamadas a
> funciones que programé en postgres, decidí ejecutar
> todos los "prepare_cached" antes de entrar al bucle
> FOR. 
> 
> $dbh = DBI->connect_cached(<Conecta correctamente>)
>  
> $sthC  = $dbh->prepare_cached(
>          "SELECT * FROM funcion_consulta(?)");
> 
> $sthV  = $dbh->prepare_cached(
>          "SELECT * FROM funcion_verifica(?)");
> 
> $sthA  = $dbh->prepare_cached(
>          "SELECT * FROM funcion_actualiza(?)");
> 
> for (;;) {
>    <HACE ALGUNAS OPERACIONES>
> }
> 
> Funcionó, pero es válidos esto..??

Si, eso es perfecto.

> Pregunta: Es necesario el uso de strict para asegurar
> la "correcta" ejecución del programa..???

El 'use strict' asegura que el compilador no te va a perdonar ninguna
metida de pata, ni de las más simples (eso para los que dicen que Perl
es demasiado liberal, con use strict se pone fascista).

Es obligatorio tomarse el tiempo para leer man perldsc.

>  Pregunto esto porque uso constant para valores globales que así
> facilita el cambio de ciertas variables de ejecución;

Para usar valores constantes de manera _formal_ en un programa en Perl
deberías escribir:

#!/usr/bin/perl -w
use strict;              # -w _y_ strict, programación para hombres
use constant FOO => 4;
use constant BAR => 5;

print FOO * BAR;    # Imprime 20

Ojo, que más de uno escribe

use constant FOO => 4, BAR => 5;

y no es lo mismo (y allí viene la metida de pata), pues lo último es
equivalente a que FOO = (4, BAR, 5) y, evidentemente BAR no está
definida.

> dentro de varios sub llamo estas constantes y me lanza
> el error:
> 
> Bareword "CONSTANTE_X" not allowed while "strict subs"
> in use at .....

Ese error ocurrió porque en algún lugar del programa escribiste
CONSTANTE_X sin haberla definido como constante, sin ponerle un sigil
por delante ($,@,%) o fuera de un par de comillas. Por lo tanto, no es
una variable (no tiene sigil), no es un literal (no está entre comillas)
y Perl se ha dado cuenta que no es una función (porque no hay ninguna
función llamada así, doh!), y en virtud del use strict muestra ese
error.

> Busqué el Google, y en varios ejemplos indicaban usar:
> 
> no strict 'subs';
> 
> Para qué usar strict si lo voy a estar "desactivando"
> cuando vaya a un sub (en mi caso son varios
> subprocesos)

El asunto es que tu estabas buscando "como quitar el mensaje" y no "como
corregir el error" :-) Para corregir el error tienes que hacer que no
aparezca CONSTANTE_X "suelto" sino en el contexto adecuado. Si hubieras
usado Perl en modo "liberal", no te habría salido el error pero quien
sabe que otro problema estarías viendo.

Hay ciertas ocasiones en las cuales es _necesario_ tener un bareword,
pero ésta no es una de ellas.

> Y de una con el mismo ride.. Pregunta: Cuál es la
> diferencia-ventaja más significativa en usar
> conexiones "CACHED" con postgres..??

El tiempo que se consume en hacer una conexión a una base de datos puede
ser considerable, en comparación con lo que se tarda en ejecutar
instrucciones; más aún si la base de datos está en una máquina remota, o
es hacia algún manejador de base de datos que es "lento" para establecer
conexiones (como Oracle y MySQL). Al hacer connect_cached(), sólo la
primera vez se establece la conexión, y se mantiene abierta mientras
dure el _programa_; ésto se logra interceptando los disconnect() y
haciendo que no cierren la conexión. Entonces, si tu programa va a estar
mucho tiempo activo, es mejor usar el connect_cached(). Si tu programa
sólo se conecta al principio, está trabajando mucho tiempo, y se
desconecta antes de terminar, entonces es indiferente. Si el programa es
multihilo, o reproduce procesos hijo idénticos, vale la pena usar
connect_cached en los _hijos_, asumiendo que el padre abrió una conexión
antes de hacer fork().
-- 
Ernesto Hernández-Novich - On Linux 2.6.11 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list