Foros del Web » Programación para mayores de 30 ;) » Programación General »

sql colgado

Estas en el tema de sql colgado en el foro de Programación General en Foros del Web. Hola. Este problema lo he planteado antes. se trata de un aplicacion cgi que ejecuta recurrentemente una consulta sql, dicha consulta esta en un metodo ...
  #1 (permalink)  
Antiguo 09/11/2010, 07:40
 
Fecha de Ingreso: octubre-2004
Ubicación: Santiago de Chile
Mensajes: 504
Antigüedad: 19 años, 6 meses
Puntos: 0
sql colgado

Hola.

Este problema lo he planteado antes. se trata de un aplicacion cgi que ejecuta recurrentemente una consulta sql, dicha consulta esta en un metodo de una clase. leyendo por ahi vi un caso en que se estaba tratando de insertar muchos registros en una BBDD, pero que solo ingresaba una pequeña parte
http://www.forosdelweb.com/f12/inser...-mysql-512695/ aqui se le recomienda usar la funcion finish(). que trate de usar pero no logro superar el problema.
aqui va el codigo del metodo del que hablo.



Código HTML:
sub preparar
{
     my $self = shift;
     my $tipo = shift;
     my $visualizacion = shift;

#    $tipo = ($tipo) ?$tipo : 1;
    $tipo ||= 1;

    print start_table({-width=>'100%'}) if (! $visualizacion);
	 
    my $personal = $dbh->selectall_arrayref("Select a.id From Personas2 a Where exists (select 1 from atributos b where a.id = b.cod_atributo and b.ind_proc_docto = $self->{ind_proc_doc} And b.id_tipo_atributo = $tipo and b.id_dueno = $self->{dueno})", { Slice => {} } ) || die $self->error($self->{dbh}->errstr);
	# Personas2 es una vista de una tabla en otra BBDD, pero en el mismo servidor.

    my $pers_resp=0;
    my @array;
	foreach my $pers (@$personal){
        my $emp = new SBMP::Empleado($pers->{id});
        if ($visualizacion){
            push @array,&fixcase($emp->nombre);
        } else {
            print Tr(
                        td({-class=>"bordercell", -width=>'100%'},&fixcase($emp->nombre))
                    )."\n";
            $pers_resp++;
        }
    }
     if ($visualizacion){
        return join " ; ", @array;
    } else {
        print end_table();
        print hidden('tot_pers',$pers_resp);
    }
                #aqui agregue esta sentencia, pero sin resultados
	$personal->finish;

}
Adicionalmente hay que agregar que se trata de SqlServer 7.0.... tambien por ahi he investigado que esta BBDD va acumulando las sesiones y en este caso como se trata de un metodo que es llamado persistentemente, deberia ser el problema. Sin embargo haciendo pruebas, no tengo claro si el problema pasa por sqlserver o por perl.


Muchas Gracias
__________________
Dios es mas grande que tu problema :-)
  #2 (permalink)  
Antiguo 13/11/2010, 07:49
 
Fecha de Ingreso: enero-2010
Mensajes: 191
Antigüedad: 14 años, 3 meses
Puntos: 7
Respuesta: sql colgado

Hay que realizar una mayor investigación, donde están los "inserts", el finish es útil en sentencias preparadas "prepare", la tuya es un todo en uno por lo que nada tiene que ver.

El problema no será que tienes muchos resultados? tal vez una consulta preparada te ayude más.

Código PHP:
Ver original
  1. # preparamos la consulta
  2. my $personal = $dbh->prepare('SELECT a.id FROM Personas2 a WHERE exists (SELECT 1 FROM atributos b WHERE a.id = b.cod_atributo AND b.ind_proc_docto = ? AND b.id_tipo_atributo = ? AND d b.id_dueno = ?)') || die $self->error($self->{dbh}->errstr);
  3.     # Personas2 es una vista de una tabla en otra BBDD, pero en el mismo servidor.
  4.  
  5. # Ejecutamos la consulta y enviamos los datos a reemplazar.
  6. $personal->execute($self->{ind_proc_doc},$tipo,$self->{dueno});
  7.  
  8.  
  9.     my $pers_resp=0;
  10.     my @array;
  11.  
  12.     while (my $pers = $personal->fetchrow_hashref()){
  13.        
  14.         my $emp = new SBMP::Empleado($pers->{id});
  15.         if ($visualizacion){
  16.             push @array,&fixcase($emp->nombre);
  17.         } else {
  18.             print Tr(
  19.                         td({-class=>"bordercell", -width=>'100%'},&fixcase($emp->nombre))
  20.                     )."\n";
  21.             $pers_resp++;
  22.         }
  23.     }
  24.  
  25. # eliminamos la consulta preparada
  26. $personal->finish();

A mi punto de vista y por la forma de programación es más probable que el problema sea un "circular reference" y te producta una "Leak Memory".

En principio en ese código no veo nada a prima facie, que es lo que te está sucediendo, cuando pasa, cuanto tiempo o veces en ejecución estuvo antes de fallar, cuanta memoria consume, etc.

Última edición por abcdefghi; 13/11/2010 a las 08:16

Etiquetas: sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:50.