Patrón Singlenton y conexión BD

Iniciado por gasoft, 23 Septiembre 2011, 22:28 PM

0 Miembros y 1 Visitante están viendo este tema.

gasoft

Hola,

Desde hace algunos días tengo una duda sobre el patrón singlenton y si es buena idea utilizarlo para manejar la forma en como llamo cuando requiero realizar alguna transacción con la base de datos PostgreSQL.  La duda está relacionada  a; cómo se gestionan utilizando este patrón la conexiones que ya se dejaron de usar, es decir si no se cierran en ningún momento o si el Garbage Collector las recicla.  Ya que como pueden ver en la clase  no hay un método que la cierre algo como closeConnection() .

Gracias de antemano por los posibles aportes a esta duda que me embarga.


Código (java) [Seleccionar]
public class bdS {

    //Instancia estatica de la conexion, sino uno llega a existir
    private static Connection connection = null;

    /**
     *
     * @return Devuelve la instancia unica de Conexion
     */
    public static Connection getConexion() {
        //Si la instancia no ha sido creado aun, se crea
        if (bdS.connection == null) {
            contruyendoConexion();
        }
        return bdS.connection;
    }

    //Obtener las instancias de Conexion JDBC
    private static void contruyendoConexion() {
        try {
            Class.forName("org.postgresql.Driver");
            String url = "jdbc:postgresql://localhost:5432/bd";
            String usuario = "postgres";
            String clave = "password";
            bdS.connection = DriverManager.getConnection(url, usuario, clave);
        } catch (ClassNotFoundException e) {
            System.out.println("ClassNotFoundException(contruyendoConexion)  : " + e.getMessage());
            System.gc();
        } catch (SQLException e) {
            System.out.println("SQLException(contruyendoConexion) : " + e.getMessage());
            System.gc();
        } catch (Exception e) {
            System.out.println(" Exception General (contruyendoConexion) : " + e.getMessage());
            System.gc();
        }
    }
}



pianista

La mayoría de los gestores las van cerrando si ven que no se usan, osea que tranquilo por eso, salvo que vayas a montar 2000 y lo tires xD

Respecto a si es bueno tener una conexión, pues depende.

Si vas a tener por ejemplo dos partes del programa, donde una es vital que esté conectada y la otra hace conexiones esporádicas, yo le daría una a cada uno para que no se me machaque una, si la otra se cae. Pero es cuestión de gustos y tampoco soy muy experto.

Saludos

Littlehorse

Usar Singleton o no depende de la arquitectura de aplicacion. Que modulos van a realizar transacciones, cantidad de conexiones, y demas.

NUNCA se depende de lo que pueda llegar a hacer el motor de la base de datos ni de lo que pueda llegar a hacer por debajo la implementacion del conector.  Mucho menos se depende de si el garbage collector recicla o no conexiones, lo que haga el garbage collector es irrelevante, es solo una ayuda en cuestion performance que no tiene que influir en el planteo de los algoritmos, caso contrario podes generar comportamientos impredecibles que despues son muy dificiles de depurar.

Lo que se suele hacer con los manejadores de conexion es que dentro contengan un pool de conexiones y que estas se utilicen on-demand. De esta manera obtenes un desempeño mas optimo que abriendo y cerrando las conexiones constantemente ya que esa es la parte que mas trabajo da.

Si es una sola conexion, se cierra cuando la aplicacion la deje de utilizar. Si son multiples conexiones (pool), se devuelve la conexion al pool para que pueda ser reutilizada y se cierra el pool entero cuando la aplicacion ya no requiera conexiones.

Este tipo de teoria basica es importante, porque luego ayuda a la hora de trabajar con frameworks (como por ejemplo Hibernate)

Saludos!

PD: Evitar el hardcodeo en la medida de lo posible, te va a ahorrar muchos problemas.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.