entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Consulta persistente a MySQL desde CodeIgniter

Buenos Días, tengo solamente 5 conexiones recurrentes y ya he aligerado bastante mis peticiones, pero quiero hacer mi último arreglo en el modelo de conexión a mi base de datos. Por ejemplo yo tengo este método en una clase modelo dentro de mi CodeIgniter con este código:

function BuscarNoticias($url){
    $this->db->open();
    $this->db->where("Publicar", "Si");
    $this->db->where("url_amigable", $url);
    $query = $this->db->get('php_ws_notices');
    $a =$query->result();        
    $this->db->update("php_ws_notices",array("Visitas"=>$a[0]->Visitas + 1),array("url_amigable"=>$url));
    $this->db->close();
    return $a;
} 

Quiero que cuando esta consulta no se pueda realizar porque el db server tiene cinco consultas recurrentes, esta consulta espere unos segundos como poniéndose en cola en Standby y se vuelva a repetir hasta obtener resultado a no ser que el servidor este caído completamente no vaya a ser que se queden 100 usuarios haciendo conexión o esperando y lo que suceda es que le server esta offline o desconectado.
Alguien me pueda ayudar. Saludos Dairon

0voto

dairon comentado

Lo puse así ahora, y no sé si funcione del todo bien, pero puede crear problemas si el server esta offline y el método se queda insistiendo
function BuscarNoticias($url){

    $this->db->where("Publicar", "Si");
    $this->db->where("url_amigable", $url);
    $query = $this->db->get('php_ws_notices');
    $a =$query->result();             
    while (empty($a)) {           
        $a =$query->result();
      }        
    $this->db->update("php_ws_notices",array("Visitas"=>$a[0]->Visitas + 1),array("url_amigable"=>$url));
    $this->db->close();
    return $a;
} 

saludos Dairon

0voto

dairon comentado

le agregué un contador que hará que el bucle se detenga cuando la condicional sea valida así evito un ciclo de por vida.

$i = 0;           
        while (empty($a)) {           
            $a =$query->result();
            $i++;
            if ($i > 30) {
              return $a;
            }
          }  

1 Respuesta

3votos

carlossevi Puntos63580

Hola Dairon, antes de tomar una medida tan límite, un par de comprobaciones en CI, aunque quizá ya lo tengas implementado:

¿Has desactivado el autoload de la base de datos? Se hace con la siguiente línea:

$db['xxx']['autoinit'] = FALSE; 

Evita que CI haga un intento de conexión para comprobar que la configuración es correcta.

Por otro lado ¿Has activado el caché a nivel de base de datos? Almacena los resultados y evita crear conexiones para repetir la misma consulta (sólo funciona para SELECT).

Es incómodo porque la caché la tienes que ir eliminando tú (manual o programáticamente) porque CI no se encarga de caducarla, pero reduce drásticamente la conexiones: https://ellislab.com/codeigniter/user-guide/database/caching.html

La opción que tu planteas la veo como un parche. Si de verdad quieres hacer que las consultas se reintenten de manera generalizada yo no haría ese apaño manualmente en cada controlador sino que investigaría cómo extender la funcionalidad de la clase que conecta con la base de datos para incorporarlo en un nivel inferior de tu aplicación.

0voto

dairon comentado

Realmente ese es el método más inferior del llamado a la base de datos el Modelo de mi MVC, cada vez que un usuario quiera ver una noticia en específico, él llama a este método y se puede quedar colgado por error 500 o de conexión a la db server, entonces tengo que hacerle este parche persistente, pero si el server está offline se me queda así insistiendo y quiero que se detenga si el server esta offline.

0voto

carlossevi comentado

En realidad me refería a modificar el comportamiento del core de Codeigniter para implementar estos reintentos en la conexión a la base de datos en lugar de en el modelo del MVC. Yo le veo más sentido pero en realidad creo que no me metería en una modificación tran grande.

No veo que el comportamiento que quieres conseguir sea algo característico al modelo, sino que está en un nivel inferior.

0voto

dairon comentado

Tienes razón, más que un MVC es algo del core ya que se debe aplicar a cada consulta que se haga a la base de datos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta