Foro de elhacker.net

Programación => Java => Mensaje iniciado por: gasoft en 23 Septiembre 2011, 22:28 pm



Título: Patrón Singlenton y conexión BD
Publicado por: gasoft en 23 Septiembre 2011, 22:28 pm
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
  1. public class bdS {
  2.  
  3.    //Instancia estatica de la conexion, sino uno llega a existir
  4.    private static Connection connection = null;
  5.  
  6.    /**
  7.      *
  8.      * @return Devuelve la instancia unica de Conexion
  9.      */
  10.    public static Connection getConexion() {
  11.        //Si la instancia no ha sido creado aun, se crea
  12.        if (bdS.connection == null) {
  13.            contruyendoConexion();
  14.        }
  15.        return bdS.connection;
  16.    }
  17.  
  18.    //Obtener las instancias de Conexion JDBC
  19.    private static void contruyendoConexion() {
  20.        try {
  21.            Class.forName("org.postgresql.Driver");
  22.            String url = "jdbc:postgresql://localhost:5432/bd";
  23.            String usuario = "postgres";
  24.            String clave = "password";
  25.            bdS.connection = DriverManager.getConnection(url, usuario, clave);
  26.        } catch (ClassNotFoundException e) {
  27.            System.out.println("ClassNotFoundException(contruyendoConexion)  : " + e.getMessage());
  28.            System.gc();
  29.        } catch (SQLException e) {
  30.            System.out.println("SQLException(contruyendoConexion) : " + e.getMessage());
  31.            System.gc();
  32.        } catch (Exception e) {
  33.            System.out.println(" Exception General (contruyendoConexion) : " + e.getMessage());
  34.            System.gc();
  35.        }
  36.    }
  37. }



Título: Re: Patrón Singlenton y conexión BD
Publicado por: pianista en 25 Septiembre 2011, 16:33 pm
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


Título: Re: Patrón Singlenton y conexión BD
Publicado por: Littlehorse en 28 Septiembre 2011, 00:15 am
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.