Foros del Web » Programando para Internet » PHP »

PHP OO Singleton, para conexion a BD

Estas en el tema de Singleton, para conexion a BD en el foro de PHP en Foros del Web. En mi sitio estoy implementando singleton para conectarme a una base oracle, pero como realmente no tengo mucha experiencia con este patrón, ¿Como podría asegurarme ...
  #1 (permalink)  
Antiguo 01/09/2011, 08:05
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 12 años, 3 meses
Puntos: 194
Singleton, para conexion a BD

En mi sitio estoy implementando singleton para conectarme a una base oracle, pero como realmente no tengo mucha experiencia con este patrón, ¿Como podría asegurarme que realmente se esta generando una sola conexión?
Hasta ahora puedo ver que siempre me trae un source, pero no se si siempre es el mismo

Últimamente se cuelga por momentos el apache y sospecho que puede ser esta clase la que genera el problema.

De paso, si es que esta razonablemente bien, podría servir como aporte, cambiándole el oci_connect, por un mysql o cualquier otro, sirve para cualquier motor.

Código PHP:
<?php

/**
 * Clase de conexion
 * Implementada con patron de diseño singleton
 *
 * @author leswider
 */
class Conexion {

    private 
$_oLinkId//objeto resource que indicara si se ha conectado
    
private $_sServidor;
    private 
$_sNombreBD;
    private 
$_sUsuario;
    private 
$_sClave;
    private 
$_sPuerto;
    public static 
$sMensaje;
    private static 
$_oSelf null//Almacenara un objeto de tipo Conexion
    
    /**
     * 
     * @param string Nombre del usuario a conectarse.
     * @param string Password de conexión.
     * @param string Nombre de la base de datos.
     * @param string Nombre del servidor.
     */
    
private function __construct($user$pass$base$servidor) {
        
$this->_sServidor $servidor;
        
$this->_sNombreBD $base;
        
$this->_sUsuario $user;
        
$this->_sClave $pass;
        
$this->_sPuerto PUERTO;
        
$this->sMensaje "";
    }

    
/**
     * Este es el pseudo constructor singleton
     * Comprueba si la variable privada $_oSelf tiene un objeto
     * de esta misma clase, si no lo tiene lo crea y lo guarda
     * @static
     * @param string Nombre del usuario a conectarse (Por defecto la constante NOMBRE del archivo conf.inc.php)
     * @param string Clave de conexión. (Por defecto la constante PASSWORD del archivo conf.inc.php)
     * @param string Nombre de la base de datos (Por defecto la constante BASE del archivo conf.inc.php)
     * @param string Nombre del servidor (Por defecto la constante SERVIDOR del archivo conf.inc.php)
     * @return resource
     */
    
public static function getInstancia($user USUARIO$pass PASSWORD$base BASE$servidor SERVIDOR) {

        if (!
self::$_oSelf instanceof self) {
            
$instancia = new self($user$pass$base$servidor); //new self ejecuta __construct()
            
self::$_oSelf $instancia;
            if (!
is_resource($instancia->conectar())) {
                
self::$_oSelf null;
            }
        }
        
$conex self::$_oSelf;
        return 
$conex->_oLinkId//Se devuelve el link a la conexion
    
}

    
/**
     * Realiza la conexion
     * @return link para exito, o false
     */
    
private function conectar() {

        
$this->_oLinkId = @oci_connect($this->_sUsuario$this->_sClave"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=" $this->_sServidor ")(PORT=" $this->_sPuerto "))(CONNECT_DATA=(SERVICE_NAME=" $this->_sNombreBD ")))");
        if (
is_resource($this->_oLinkId)) {
            
self::$sMensaje "Conexion exitosa!";
        } else {
            
self::$sMensaje "ERROR: No se puede conectar a la base de datos..!";
        }
        return 
$this->_oLinkId;
    }

    
/**
     * Este método verifica si había una conexión abierta anteriormenete. Si había la cierra.
     * 
     * @static
     * @return boolean true si existía la conexión, false si no existía.
     */
    
public static function desconectar() {

        
$conexion_activa false;
        if (
self::$_oSelf instanceof self) {
            
$bandera true;
            
$instancia self::$_oSelf;
            
oci_close($instancia->_oLinkId); //cierro la conexion activa
            
self::$_oSelf null//destruyo el objeto
        
}
        return 
$conexion_activa;
    }

}

?>
Código PHP:
if(is_source(Conexion::getInstancia())){
    echo 
"tengo un source";
} else {
    echo 
"error";
}
Conexion::desconectar
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #2 (permalink)  
Antiguo 01/09/2011, 08:28
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 11 años, 10 meses
Puntos: 845
Respuesta: Singleton, para conexion a BD

El foro sufre de singletonitis últimamente :P , ahora en serio, mas allá del problema puntual que puedas tener, Singleton para la conexión es una muy mala idea, podes googlear o buscar en el foro que hay bastante info sobre el tema y te sugiero que a no ser que trabajes con PHP 4, utilices PDO.

Y ten en cuenta que para ser realmente Singleton la clase debe sobrescribir __clone ;)

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 01/09/2011 a las 08:34
  #3 (permalink)  
Antiguo 01/09/2011, 08:38
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 12 años, 3 meses
Puntos: 194
Respuesta: Singleton, para conexion a BD

Cita:
Singleton para la conexión es una muy mala idea
Esto es por si en el futuro requiero mas de una conexion? o por algo mas que se me esta escapando?

Supongo que seguiré el consejo de implementar PDO
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #4 (permalink)  
Antiguo 01/09/2011, 08:42
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 10 años, 1 mes
Puntos: 334
Respuesta: Singleton, para conexion a BD

Yo por lo menos uso PDO + Patrón Factory para gestionar mi conexión a la base de datos.
y en su momento para revisar si estaba todo bien pues hise una prueba
Código PHP:
        $db Khaus_Db_Conection::getInstance();
        
var_dump($db); // object(Khaus_Db_PDOInstance)#8 (0) { }
        
$db Khaus_Db_Conection::getInstance();
        
var_dump($db); // object(Khaus_Db_PDOInstance)#8 (0) { }
        
        
$db = new Khaus_Db_PDOInstance(
                
Khaus_Config::database('driver'),
                
Khaus_Config::database('hostname'),
                
Khaus_Config::database('databaseName'),
                
Khaus_Config::database('username'),
                
Khaus_Config::database('password')
            );
        
        
var_dump($db); // object(Khaus_Db_PDOInstance)#9 (0) { } 

como vez.. el recurso retornado es diferente.. lo cual quiere decir que es una nueva conexión.

saludos.
__________________
More about me...
~ @rhyudek1
~ Github
  #5 (permalink)  
Antiguo 01/09/2011, 08:47
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 12 años, 3 meses
Puntos: 194
Respuesta: Singleton, para conexion a BD

Cita:
Iniciado por Hidek1 Ver Mensaje
Yo por lo menos uso PDO + Patrón Factory para gestionar mi conexión a la base de datos.
y en su momento para revisar si estaba todo bien pues hise una prueba
Código PHP:
        $db Khaus_Db_Conection::getInstance();
        
var_dump($db); // object(Khaus_Db_PDOInstance)#8 (0) { }
        
$db Khaus_Db_Conection::getInstance();
        
var_dump($db); // object(Khaus_Db_PDOInstance)#8 (0) { }
        
        
$db = new Khaus_Db_PDOInstance(
                
Khaus_Config::database('driver'),
                
Khaus_Config::database('hostname'),
                
Khaus_Config::database('databaseName'),
                
Khaus_Config::database('username'),
                
Khaus_Config::database('password')
            );
        
        
var_dump($db); // object(Khaus_Db_PDOInstance)#9 (0) { } 

como vez.. el recurso retornado es diferente.. lo cual quiere decir que es una nueva conexión.

saludos.
Creo que esta idea esta orientada a lo que necesito, voy a implementarlo. Muchas gracias

Edit: en mi caso es critico determinar que exista solo una conexion y obligar con el singleton que esto ocurra. Por otro lado, lot endre en cuenta para futuros desarrollos
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives

Última edición por h2swider; 01/09/2011 a las 14:46

Etiquetas: bd, conexion, mysql, singleton, variables, usuarios
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:11.