Foros del Web » Programación para mayores de 30 ;) » Java »

Duda sobre conexion a BD en Sistemas WEB

Estas en el tema de Duda sobre conexion a BD en Sistemas WEB en el foro de Java en Foros del Web. Buenas días a todos. Actualmente estoy trabajando con JSP, y con MYSQL. Estoy realizando un sistema WEB de Activos Fijos, ya casi esta terminado, y ...
  #1 (permalink)  
Antiguo 19/01/2009, 11:35
 
Fecha de Ingreso: enero-2009
Mensajes: 3
Antigüedad: 15 años, 3 meses
Puntos: 0
Duda sobre conexion a BD en Sistemas WEB

Buenas días a todos.

Actualmente estoy trabajando con JSP, y con MYSQL. Estoy realizando un sistema WEB de Activos Fijos, ya casi esta terminado, y funciona correctamente, solo que tengo una duda, sobre las conexiones a BD.

Tengo una clase genérica para conectarme a la bd.

Código:
package saaf;
import java.sql.*;
/**
* Clase que permite conectar con la base de datos
*/
public class DbConnection 
{
   // Constantes globales de la clase
   /* Se declaran constantes, porque van a ser siempre los mismos valores
      cada vez que se vaya a crear un objeto de tipo DbConnection
   */
   static String bd = "nameDataBase";
   static String login = "root";
   static String password = "mypassword";
   static String url = "jdbc:mysql://localhost/" + bd;
   // Esta variable va a guardar la conexion
   Connection conn = null;
   /** Constructor de DbConnection 
    *  Se llama constructor porque tiene el mismo nombre que la clase y cuando se crea un nuevo objeto de esta clase
    *  es como se va a inicializar al crear un nuevo objeto de este tipo   
    * */
   public DbConnection() 
   {
      try
      {
         //obtenemos el driver para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         // Si conn no es nulo, significa que si se pudo conectar
         if (conn!=null)
         {
            System.out.println("Conección a base de datos " + bd + " OK");
         }
      }
         catch(SQLException e) // Excepcion ocurrida por la conexion 
         {
            System.out.println("Excepcion conexion.");
            System.out.println(e);
         }
      catch(ClassNotFoundException e) // Excepcion ocurrida por no encontrar el driver
      {
         System.out.println("Excepcion driver.");
         System.out.println(e);
      }
   }
   /**Permite retornar la conexión*/
   public Connection getConnection()
   {
      return conn;
   }
   // Quitamos de memoria la conexion
   public void desconectar()
   {
       if (conn != null) 
       {  
           try 
           {  
                System.out.println("Desconectado de " + bd + " OK");
               conn.close();  
           } 
           catch (SQLException e) 
           {  
               System.out.println(e);  
           }  
       }  
   }
}
Esa clase, la utilizo para conectarte, cada vez que quiero hacer algo sobre la BD.

Un ejemplo de como la utilizo:

Código:
package saaf;
import java.sql.*;
import saaf.Blame.*;
import saaf.DbConnection;
public class Mueble
{
   public Mueble() 
   {
    /** Constructor de Mueble
    *  Lo primero que va a hacer esta clase, es crear un nuevo objeto de tipo conexion a la base de datos
    *  por medio de la clase DbConnection       
    * */
      //cn = new DbConnection();
   }    
    // Metodo para cambiar el estatus de los bienes muebles
   public void cambiarEstatus(int id_mueble,int id_estatus,int id_acceso)
   {
      int registros = 0;
      try
      {
         DbConnection cn = new DbConnection();
       	 Statement stm = cn.getConnection().createStatement();
       	 stm.executeUpdate("BEGIN");
       	 stm.executeUpdate("delete from acceso_tmp");
       	 stm.executeUpdate("insert into acceso_tmp (ID_ACCESO) values ("+id_acceso+")");
   	    stm.executeUpdate("update muebles set ID_ESTATUS="+id_estatus+ " where ID_MUEBLE="+id_mueble);
   	    stm.executeUpdate("delete from acceso_tmp");
   	    stm.executeUpdate("COMMIT");
          stm.close();
          cn.desconectar();
      }
      catch(SQLException e)
      {
         System.out.println(e);
      }
   }  
 public void OtroMetodoDelaClase(parametros)
   {
      int registros = 0;
      try
      {
         DbConnection cn = new DbConnection();
       	 Statement stm = cn.getConnection().createStatement();
       	 stm.executeUpdate("BEGIN");
       	 stm.executeUpdate("delete from acceso_tmp");
       	 stm.executeUpdate("COMMIT");
          stm.close();
          cn.desconectar();
      }
      catch(SQLException e)
      {
         System.out.println(e);
      }
   }
}
Como pueden ver, en mis clases donde hago algo con la BD, tengo metodos, y en cada metodo, como pueden ver, me abro una conexion a la bd, hago in insert, select, delete, update, y en el mismo metodo, cierro la conexion a la BD, eso es en cada metodo.

Mi Pregunta es, es correcto como le hago, es decir conectarme y desconectarme a la bd por cada operacion que hago, o serie mejor abrir una sola conexion, y cerrarla con la sesion WEB de la aplicacion, o alguna otra opcion.

Me gustaria que algun experto, me resolviera esa enorme duda que siempre he tenido con los sistemas WEB.

Saludos,
  #2 (permalink)  
Antiguo 19/01/2009, 22:41
Avatar de stone_neo  
Fecha de Ingreso: abril-2004
Ubicación: Peru
Mensajes: 438
Antigüedad: 20 años
Puntos: 15
Respuesta: Duda sobre conexion a BD en Sistemas WEB

Pues mira lo que tendrias que hacer primero es que los datos para la coneccion a la base de datos la tengas en un archivo properties o uses un datasource, para el properties usa un ResourceBundle, ahora con respecto a los datasources, seria dependediendo de que servidor de aplicaciones uses.

Segundo eso de estar abriendo y cerrando conexiones no es muy recomendable, lo que deberias hacer es tener un pool de conexiones. Y usar una conexion de este pool cada vez que quieras realziar una consulta a la BD.

Tercero utiliza mejor los PreparedStatement en lugar de los Statement, y cuando vayas a realizar alguna transaccion usa el setAutoCommit(), mas o menos de esta manera


Código:
try{
    con.setAutoCommit(false);
    //aqui realizas tu transaccion

   con.commit();
   con.setAutoCommit(true);
}
catch(SQLException e){
   con.rollback();
   con.setAutoCommit(false);
}

Eso seria mas o menos lo básico, ya que si usas algun framework, este te facilita esto.
__________________
Rubén Darío Huamaní Ucharima
Web : http://www.gorilla-soft.com
Usuario Linux #382 100 :-)
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




La zona horaria es GMT -6. Ahora son las 16:59.