Foros del Web » Programando para Internet » PHP »

Saturacion de mysql

Estas en el tema de Saturacion de mysql en el foro de PHP en Foros del Web. Hola a todos, soy nuevo en foros del web, y espero alguien pueda ayudarme, tengo un sitio en el cual debo cambiar el estado de ...
  #1 (permalink)  
Antiguo 22/10/2014, 13:20
Avatar de matiassebben  
Fecha de Ingreso: octubre-2014
Ubicación: Rosario
Mensajes: 3
Antigüedad: 9 años, 6 meses
Puntos: 0
Exclamación Saturacion de mysql

Hola a todos, soy nuevo en foros del web, y espero alguien pueda ayudarme, tengo un sitio en el cual debo cambiar el estado de los productos de "Activo" a "Inactivo" de manera masiva. Cuando lo hago de manera individual, para un solo registro funciona bien, cuando lo hago para muchos productos (mas de 300) se realiza el cambio solo en algunos de ellos de manera aleatoria . por ejemplo 270 cambian de estado y 30 se quedan como estan. (el numero varia cada vez que se ejecuta).

Lei algo al respecto y algunos lo atribullen a que se satura el pool de conexiones de windows, otros dicen que es porque no uso mysql_free_results(). Pero lo que intente no me dio resultado.

El codigo lo dejo a continuacion para que alguien pueda ayudarme.
Código PHP:
Ver original
  1. <?php
  2. include("../conexion.php");
  3. include("sqlProducto.php");
  4. $cantidad=$_POST['cantidadTotal'];
  5. $distribuidor=$_POST['disId'];
  6. $proveedor=$_POST['proveId'];
  7. $buscaEstado=$_POST['buscaEstado'];
  8. $chk=$_POST['chk'];
  9.  
  10.  
  11.         foreach($chk as $posicion => $valor){
  12.             $producto=buscaProducto($valor);
  13.             $estado=$producto["proEstado"];
  14.             if($estado=="Activo")
  15.             {
  16.                 $estado="Inactivo";
  17.                 //modificar estadoa inactivo
  18.             }
  19.             else
  20.             {
  21.                 $estado="Activo";
  22.             ///modificar estado a activo
  23.             }
  24.        
  25.         //echo " id: ".$valor." estado: ".$estado;
  26.        
  27.        
  28.         $sql="UPDATE productos SET proEstado='$estado' WHERE proId='$valor'";
  29.         mysql_query($sql,$conID)or die(mysql_error());
  30.         mysql_close();
  31.                            
  32.         }
  33.  
  34. redirect("../home.php",0);
  35.  
  36. ?>

Última edición por gnzsoloyo; 22/10/2014 a las 13:41
  #2 (permalink)  
Antiguo 22/10/2014, 14:32
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: Saturacion de mysql

Estás cerrando la conexión en cada vuelta del foreach y eso no tiene sentido porque la seguis necesitando.
Con un solo registro no falla porque hace lo que tiene que hacer y cierra.
Y en el otro caso me imagino que cambiará los que pueda en lo que tarda en cerrarse la conexión.
Pone el mysql_close() por fuera del foreach y seguramente te va a andar bien.

Código PHP:
<?php
        
foreach($chk as $posicion => $valor){
            
$producto=buscaProducto($valor);
            
$estado=$producto["proEstado"];
            if(
$estado=="Activo")
            {
                
$estado="Inactivo"
                
//modificar estadoa inactivo
            
}
            else
            {
                
$estado="Activo";
            
///modificar estado a activo
            
}
        
        
//echo " id: ".$valor." estado: ".$estado;
        
        
        
$sql="UPDATE productos SET proEstado='$estado' WHERE proId='$valor'";
        
mysql_query($sql,$conID)or die(mysql_error());                            
        }

        
mysql_close();
?>
  #3 (permalink)  
Antiguo 22/10/2014, 17:11
Avatar de matiassebben  
Fecha de Ingreso: octubre-2014
Ubicación: Rosario
Mensajes: 3
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Saturacion de mysql

Hola! GeekGirl.. muchas gracias por tomarte el tiempo de responder. Intente sacando mysql_close(); fuera del foreach, pero el error es el mismo. Las primeras veces que ejecuto la accion, funciona perfectamente, pero si la ejecuto varias veces llega un momento que se "satura" (digo satura porque no se me ocurre una palabra mejor), y empieza a fallar como explique mas arriba, cambiando el estado de algunos, y dejando otros sin modificar.

La verdad es que es un error "sutil" que detecto la persona que utiliza la pagina, ya que cuando el volumen de modificaciones es chico no se produce el error (de todas maneras este error puede dañar la integridad de mi base de datos).

Muchas gracias por todo, y si alguien me puede explicar porque sucede, no cometere el mismo error la proxima vez. Saludos y muchas gracias!
  #4 (permalink)  
Antiguo 22/10/2014, 18:41
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 9 años, 9 meses
Puntos: 44
Respuesta: Saturacion de mysql

Mirá, entonces lo único que se me ocurre para aconsejarte es que uses mysql_free_result() que libera la memoria usada por la consulta.

Que yo sepa hay que usarla con selects que consuman muchos recursos. Nunca la vi aplicada para un update.
Aun así, hace la prueba que no perdes nada:

Código PHP:
<?php
$result 
mysql_query($sql,$conID);
mysql_free_result($result);
?>
Saludos
  #5 (permalink)  
Antiguo 23/10/2014, 03:29
 
Fecha de Ingreso: octubre-2013
Mensajes: 30
Antigüedad: 10 años, 6 meses
Puntos: 3
Respuesta: Saturacion de mysql

Quizá el error esté a la hora de traer los productos, puedes publicar la petición que usaste para sacar los datos del producto de la ddbb? No creo que sea un problema de carga, he cambiado más de 19000 registros de una vez sin problemas.

Y un dato, dices que tienes que cambiar los productos de activo a inactivo, pero tu código lo hace en las dos direcciones, es decir, si encuentra un activo lo vuelve inactivo y si encuentra un inactivo lo vuelve activo, si necesitas solo de activo a inactivo simplemente pon esto:

Código PHP:
<?php
        
foreach($chk as $posicion => $valor){
            
$producto=buscaProducto($valor);
            
$estado=$producto["proEstado"];

            if(
$estado=="Activo")
            {
                
$estado="Inactivo";
                
$sql="UPDATE productos SET proEstado='$estado' WHERE proId='$valor'";
                
mysql_query($sql,$conID)or die(mysql_error());    
            }
                                       
        }

        
mysql_close();
?>
Saludos!

Última edición por Charlie1; 23/10/2014 a las 04:46
  #6 (permalink)  
Antiguo 23/10/2014, 12:06
Avatar de matiassebben  
Fecha de Ingreso: octubre-2014
Ubicación: Rosario
Mensajes: 3
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Saturacion de mysql

Hola, gracias a todos por responder, sus ideas me ayudaron a revisar el codigo y descartar opciones, finalmente pude solucionarlo. El problema como dijo Charlie1 se encontraba en el php.. aparentemente el usuario hacia click en "seleccionar todos" en la pagina de productos, antes de que cargue la pagina, y solo seleccionaba los checkbox creados hasta ese momento. Por eso el arreglo a veces no contenia los valores de todos los "id_producto" y por lo tanto alguno no los ejecutaba. Por lo menos restringiendo el uso del boton hasta que la pagina se cargue por completo funciono. Saludos y muchas gracias.

Etiquetas: mysql, registro, 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 16:32.