Programación Web y Scripting > PHP
Error De Conexión Con Mysql
shadow_rev:
Bueno chicos, he aquí un bug que tengo en un proyectico...
Resulta que me piden que cargue un archivo CSV en 3 tablas de una base de datos, para eso recurro a una serie de ciclos que obtienen cada registro del archivo, y cada registro lo almacena en la base de datos. Cuando el archivo es bastante grande (digamos que > 5000 registros), eventualmente empiezan a salir warnings de este tipo:
--- Código: Text ---Can't connect to MySQL server on 'localhost' (10048) in (no creo que necesiten conocer el nombre del archivo) on line 56 y obviamente se salta el registro.
Alguien tiene una idea de como depurar este "bonito" bicho :scream: ? O sea, puede ser memoria ? bug del conector de MySQL ?
De antemano, gracias
LeGatoRojo:
Tal vez el código podría servir de muchisima ayuda, pero por lo que veo, tal vez estes en un bucle repitiendo la conexión, bueno como sea, el código¿?
shadow_rev:
Bueno, no creo que ayude mucho (son muchas operaciones que hay detrás de cada inserción y no quiero llenar 4 páginas de código que hay distribuidos en 3 .php distintos, es la forma en que se trabaja OO en la oficina), pero ahí les va lo que se ejecuta en cada iteración.
Esto en un archivo que se llama FachadaBD.php
--- Código: Text ---class FachadaBD{ var $_obj_fachada_bd; //Objeto que se encarga de realizar todas las operaciones en la base de datos ya sea con MYSQL o Postgres var $_obj_DB_oci8; var $_con_transaccion;//flag para manejar si la operación a ejecutar esta siendo ejecutada en una transacción ... function insertar ($datos_a_insertar) { //print_r($datos_a_insertar); //Intenta abrir la conexión a la BD o recuperar el id de la conexión si es con transacción if ($this->conectar()==false) { $this->desconectarOCancelarTransaccion(); // Termina la ejecución $this->asignarError(0); return 0; } $atributos_tabla=$this->_obj_fachada_bd->obtenerAtributos(); $nombre_tabla=$this->_obj_fachada_bd->obtenerNombreTabla(); if($nombre_tabla==null) { $this->desconectarOCancelarTransaccion(); $this->asignarError(-1); return -1; } if($atributos_tabla==null) { $this->desconectarOCancelarTransaccion(); $this->asignarError(-2); return -2; } //Construcción de la instrucción SQL $sql=$this->construirSQLDeInsertar($datos_a_insertar,$atributos_tabla,$nombre_tabla); //echo $sql."<br>"; if($sql=="") { $this->desconectarOCancelarTransaccion(); $this->asignarError(-5); return -5; } // Ejecutar la Instrucción SQL en el SMBD $resultado_operacion=$this->ejecutarOperacion($sql); //Hubo un error entre el SMBD y la instrucción SQL ingresada if( $resultado_operacion==false) { $this->desconectarOCancelarTransaccion(); $this->asignarError(-3); return -3; } if (!($this->_con_transaccion))//No se manejo transacción { $this->desconectar(); } return 1; }//Fin insertar() ... }
Y este es del archivo FachadaBDMySQL.php (una clase cuya instancia se encuentra en FachadaBD bajo el nombre de _obj_fachada_bd):
--- Código: Text ---class FachadaBDMySQL{ var $resultado_conexion; var $mensaje_de_error; var $atributos_tabla; var $nombre_tabla; var $nombre_secuencia;... function conectar ($host,$nombre_bd,$usuario_bd,$password_bd) { $this->resultado_conexion = mysql_connect($host, $usuario_bd, $password_bd); if($this->resultado_conexion==false) { return false; } $seleccion_bd=mysql_select_db($nombre_bd,$this->resultado_conexion); if($seleccion_bd==false) { return false; } return $this->resultado_conexion; }//Fin conectar() ... }
Los parámetros $host, $nombre_bd, $usuario_bd y $password_bd son variables globales que se declaran en un archivo Config.php.
Creo que con esto es suficiente para ilustrar la operación que se realiza iterativamente. Por si las moscas, pongo a su disposición los 2 archivos mencionados.
LeGatoRojo:
Solo tengo una pregunta, mandas a llamr la funcion insertar por cada dato que lees, o todos los almacenas en un array y despues mandas a llamar insertar, de no ser como el ultimo caso creo que es por que mandas muchas veces a conectar.
shadow_rev:
Bueno... 2 días después, pero aquí toy B)
--- Cita de: "Darktigerhell" --- Solo tengo una pregunta, mandas a llamr la funcion insertar por cada dato que lees, o todos los almacenas en un array y despues mandas a llamar insertar, de no ser como el ultimo caso creo que es por que mandas muchas veces a conectar.
--- Fin de la cita ---
Se hace de la primera forma (un insertar por cada dato leído).
Te cuento que ya solucioné el problema... y funciona perfecto en MySQL
--- Código: Text ---insert into nombre_tabla (nombre_dato1, nombre_dato2, ....) values (dato1, dato2, ....), (otro_dato1, otro_dato2, ....), .... Me doy cuenta que esos scripts son bastante ineficientes cuando se trata de gestionar una cantidad gigante de datos <_< . Voy a jalarle las orejas a mi jefe :devil:
Navegación
[#] Página Siguiente
Ir a la versión completa