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

Objeto Connection global

Estas en el tema de Objeto Connection global en el foro de Java en Foros del Web. Saludos. Estoy dando mis primeros pasos en Java y me gustaria que me aclararan o ayudaran en esta cuestion en concreto. Tengo un JFrame diseñado ...
  #1 (permalink)  
Antiguo 06/04/2008, 13:42
 
Fecha de Ingreso: abril-2008
Mensajes: 20
Antigüedad: 16 años
Puntos: 0
Objeto Connection global

Saludos.

Estoy dando mis primeros pasos en Java y me gustaria que me aclararan o ayudaran en esta cuestion en concreto.

Tengo un JFrame diseñado con elementos Swing (jtable, jtexfield, jbutton etc), y me gustaria incluir un objeto Connection para una conexion a una base de datos MySql pero que tenga un alcance global, es decir que este accesible desde cualquier boton del Jframe de forma que no tenga que declararlo nuevamente. En resumen abrirlo al inicio y cerrarlo por ejemplo cuando pulse el boton de Cerrar.

Ahora mismo lo tengo declarado en el MAIN del proyecto y de echo conecta perfectamente, pero cuando intento cerrarlo con la instruccion close() desde el evento cmdCerrarMouseClicked() del jbutton me da error.

public static void main(String args[]) throws Exception {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
// abre el driver Mysql

Connection GLB_db = null;

try
{
Class.forName("com.mysql.jdbc.Driver").newInstance ();
GLB_db = DriverManager.getConnection(url,login,password);

if (GLB_db != null)
{
System.out.println("Conexión a base de datos "+url+" ... Ok");

}
}
catch (InstantiationException ex) {
Logger.getLogger(frmPolizas.class.getName()).log(L evel.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(frmPolizas.class.getName()).log(L evel.SEVERE, null, ex);
} catch(SQLException ex)
{
System.out.println(ex);
}
catch(ClassNotFoundException ex)
{
System.out.println(ex);
}


// resto de instrucciones
new frmPantalla().setVisible(true);

}
});
}


// ESTE ES EL EVENTO DEL JBUTTON DONDE QUIERO CERRAR LA CONEXION.

private void cmdCerrarMouseClicked(java.awt.event.MouseEvent evt) {

// cierra el objeto coneccion de la base de datos
GLB_db.close(); // ME MARCA UN ERROR

// cierra el programa completo
System.exit(0);

}

¿Alguna sugerencia?. Gracias anticipadas
  #2 (permalink)  
Antiguo 06/04/2008, 14:00
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Objeto Connection global

El objeto connection no es buena idea compartirlo globalmente. Como mucho tener una clase que se encargue de usarlo adecuadamente, y lo cierre cuando toque, abre y cierre los statements... Distribuir el manejo de la conexion por distintas partes del programa suele ser dificil de controlar.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 07/04/2008, 00:28
 
Fecha de Ingreso: abril-2008
Mensajes: 20
Antigüedad: 16 años
Puntos: 0
Re: Objeto Connection global

Muchas gracias por tu rápida contestacion.

Entonces, siempre que tenga que realizar una consulta a la base de datos tengo que abrir, consultar (query) y cerrar el objeto Connection?

y en cuanto a meterlo en una clase te refieres a crear una clase independiente y llamarla pasandole algun parametro que fuese por ejemplo la query?

Me gustaria si eres tan amable me dijeses algun ejemplo de como se implementaria esto ultimo.

Gracias nuevamente y disculpa por mi poco nivel.
  #4 (permalink)  
Antiguo 07/04/2008, 01:58
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Objeto Connection global

No hace falta abrir y cerrar cada vez el objeto Connection, pero si es recomedable que cada vez se abra un Statement diferente etc. etc.

En cuanto a la clase diferente, lo que quiero decir es que lo habitual es crear una clase que se encargue de interactuar con la BDD, de la que solo tendras una instancia (a través del patron Singleton o a simplemente teniendo una instancia en la clase principal y llamando a esa) y que todas las demas clases llamen a esa instancia para hacer el trabajo en la BDD.

Además, eso te servirá para tener el SQL y el resto de codigo que accede a la BDD en un solo sitio, lo cual es mas facil de mantener y controlar.

Yo empezaría por programar simplemente la interfaz, siguiendo algun tutorial sencillo para ir cogiendole el tranquillo, antes de meterme ya en saraos de BDD etc. Todo a la vez es demasiado, creo yo.

Suerte!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 07/04/2008, 07:57
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Re: Objeto Connection global

te dejo un ejemplo de q como realizo yo la conexion tengo una clase q se encarga de conectarse y en otro metodo hago la consulta, usa un patron llamado Singleton que lo unico que te permite es tener una unica instancia de la conexion a la bd

Código:
import java.sql.Connection;
import java.sql.DriverManager;

/**
 *
 * @author Agustin Sivoplas  */
public class ConexionBD {
    private Connection con;
    private static ConexionBD instancia=null;
    /** Creates a new instance of ConexionBD */
    private ConexionBD() {
    }
    /**
     *Retorna la instancia de la clase.
     *
     *
     *@return ConexionBD
     */
    
    public static ConexionBD getInstancia(){
        if (instancia==null)
            instancia = new ConexionBD();
        return instancia;
    }
    /**
     *Permite conectarnos a la base de datos
     *
     *
     *@param usr String
     *
     *
     *@param pwd String
     *
     *
     *@param host String
     *
     *
     *@param base String
     *
     *
     *@return Boolean
     */
    public boolean conectar(String usr, String pwd, String host,String base){
        boolean valor=false;
        
        try{
          //  DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://" + host + "/" + base,usr, pwd);
            
            valor=true;
            
        } catch(Exception ex){
            ex.printStackTrace();
            valor=false;
        }
        return valor;
    }
    /**
     *Retorna la conexion.
     *
     *
     *@return Connection
     */
    public Connection getConexion(){
        return con;
    }
    
}
Aca te dejo un metodo para hacer una consulta

Código:
  /**
     *Se conecta con la base de datos para leer todos los
     *cargos de empleado.
     *
     *
     *@return ArrayList
     */
    public ArrayList leerTodos(){
        ArrayList lista= new ArrayList();
        CargoEmpleado c;
        try{
            Connection con=ConexionBD.getInstancia().getConexion();
            Statement st=con.createStatement();
            ResultSet rs=st.executeQuery("select * from cargosempleados where borrado='false' order by idCargo");
            
            while(rs.next()){
                
                String nombre=rs.getString("nombreCargo");
                double por=rs.getDouble("porcentaje");
                int id=rs.getInt("idCargo");
                
                c=new CargoEmpleado();
                c.setNombre(nombre);
                c.setPorcentaje(por);
                c.setId(id);
                
                lista.add(c);
            }
            rs.close();
        }
        
        catch (Exception ex){
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Persistencia_CargoEmpleados",JOptionPane.WARNING_MESSAGE);
        }
        return lista;
    }
Asi para guardar

Código:
    /**
     *Se conecta con la base de datos para guardar un
     *Cargo de Empleado.
     *
     *
     *@param cargo CargoEmpleado
     *
     *
     *@return Boolean
     */
    public boolean guardarCargo(CargoEmpleado cargo){
        boolean resultado=false;
        try {
            Connection con=ConexionBD.getInstancia().getConexion();
            PreparedStatement pst=con.prepareStatement("update cargosempleados set nombreCargo=?, porcentaje=? where idCargo= " + cargo.getId());
            pst.setString(1,cargo.getNombre());
            pst.setDouble(2,cargo.getPorcentaje());
            
            long cont=pst.executeUpdate();
            if(cont==0){
                if(cargo.getId()==0){
                    pst=con.prepareStatement("insert into cargosempleados (nombreCargo,porcentaje) values (?,?)");
                    pst.setString(1,cargo.getNombre());
                    pst.setDouble(2,cargo.getPorcentaje());
                    pst.execute();
                }else{
                    pst=con.prepareStatement("insert into cargosempleados (nombreCargo,porcentaje,idCargo) values (?,?,?)");
                    pst.setString(1,cargo.getNombre());
                    pst.setDouble(2,cargo.getPorcentaje());
                    pst.setInt(3,cargo.getId());
                    pst.execute();
                }
            }
            resultado=true;
        } catch (SQLException ex) {
            ex.printStackTrace();
            resultado=false;
        }
        return resultado;
    }
saludos y espero haberte ayudado
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #6 (permalink)  
Antiguo 04/07/2008, 15:48
 
Fecha de Ingreso: mayo-2008
Mensajes: 6
Antigüedad: 16 años
Puntos: 0
Respuesta: Objeto Connection global

Hola amigo es mu bueno tu ejemplo, no se si tu codigo sirve para usar en uno o mas formularios, he visto ejemplos que le pasan la conexion por parametro, en el caso de tu ejemplo tendria que cerrar y volver a conectarme, como logro conectarme una vez y reutilizar esa conexion ya abierta?, ahh si fueras tan amable de pasarme un ejemplo de tu arrayList que llene un jtable ya que veo que tu lo has llenado como objeto en tu arrayList (excelente), gracias
mi correo es: [email protected]
  #7 (permalink)  
Antiguo 12/11/2008, 21:26
 
Fecha de Ingreso: noviembre-2008
Mensajes: 17
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Objeto Connection global

Hola djagu_26, estuve mirando tu codigo y lo copie en una aplicacion que estoy tratando de hacer, estoy recien comenzando con esto de java y me a costado un monton. Bueno, resulta que al correr la aplicacion no realiza la conexion a la BD. Estaba mirando y la clase ConexionBD tiene los metodos getInstancia, conectar y getConexion. Entiendo que conectar es el que realiza la conexion finalmente, pero en tus ejemplos no lo llamas, solo ejecutas:

Connection con=ConexionBD.getInstancia().getConexion();

Podrias echarme una mano??

Gracias
  #8 (permalink)  
Antiguo 13/11/2008, 06:03
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Objeto Connection global

Lo primero que debes hacer por unica vez es llamar al metodo conectar pasandole como parametros el usuario, el password, el host y el nombre de la base, yo lo que hago es un JFrame como login que es el primero que se ejecuta y ahi pido esos datos, ahora si no quieres crear un login lo que debes hacer es en la clase main antes de llamar tu primera ventana llamas al metodo conectar asi
ConexionBD.getInstancia().conectar("usuario","pass usuario","localhost","nombrebase");

y luego cuando quieras un objeto connection lo llamas de la otra forma
Connection con=ConexionBD.getInstancia().getConexion();

saludos espero haber aclarado algo.
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #9 (permalink)  
Antiguo 13/11/2008, 07:17
 
Fecha de Ingreso: noviembre-2008
Mensajes: 17
Antigüedad: 15 años, 5 meses
Puntos: 0
Mensaje Respuesta: Objeto Connection global

Gracias por tu tiempo. Pero sigue sin funcionarme el tema. No se que pueda ser, segui tus consejos y no paso nada, ..... solo modifique el metodo conectar quitandole los parametros, no creo que sea ese el problema....

Bueno, quede con el sgte codigo...

ConexionBD.getInstancia().conectar();


try{

Connection con=ConexionBD.getInstancia().getConexion();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select * from Usuarios");

// hasta aca se ejecuta, pero luego salta al catch

while(rs.next())
{
System.out.println(rs.getArray(1));
}

rs.close();


}
catch (Exception ex){
JOptionPane.showMessageDialog(null, ex.getMessage(), "Persistencia_CargoEmpleados",JOptionPane.WARNING_ MESSAGE);
}

No se, ya estoy como loco.....
  #10 (permalink)  
Antiguo 13/11/2008, 11:45
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Objeto Connection global

Mmmmm no se que pueda hacer, porq no pones el el catch ex.printStackTrace(); y posteas la excepcion, tambien pon como dejaste el metodo conectar

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #11 (permalink)  
Antiguo 13/11/2008, 16:08
 
Fecha de Ingreso: noviembre-2008
Mensajes: 17
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Objeto Connection global

antes que nada muchas gracias por tu atencion.

la cosa quedo asi...

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {


char [] claveEntrada = jPasswordField1.getPassword();

ConexionBD.getInstancia().conectar();

try{

Connection con=ConexionBD.getInstancia().getConexion();
Statement st=con.createStatement();
System.out.println("stament " +st);
ResultSet rs=st.executeQuery("select * from Usuarios");
System.out.println("resulset " +rs);

while(rs.next())
{
System.out.println(rs.getArray(1));
}
rs.close();


}
catch (Exception ex){
JOptionPane.showMessageDialog(null, ex.getMessage(), "Persistencia_CargoEmpleados",JOptionPane.WARNING_ MESSAGE);

}

}

public class ConexionBD {

private Connection con;
private static ConexionBD instancia = null;


private ConexionBD() {
}


public static ConexionBD getInstancia(){

if (instancia == null)
instancia = new ConexionBD();
return instancia;

}

public boolean conectar(){

boolean valor=false;

try{
Class.forName("org.sqlite.JDBC");
con = DriverManager.getConnection("jdbc:sqlite:MiBase.sq lite","","");
valor=true;


} catch(Exception ex){
ex.printStackTrace();
valor=false;
}
return valor;
}

public Connection getConexion(){
return con;
}

}


y la exepcion que me arroja es "not implemented by SQlite JDBC driver"

Última edición por fernant; 13/11/2008 a las 17:20
  #12 (permalink)  
Antiguo 13/11/2008, 17:18
 
Fecha de Ingreso: noviembre-2008
Mensajes: 17
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Objeto Connection global

antes que nada muchas gracias por tu atencion.

la cosa quedo asi...

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {


char [] claveEntrada = jPasswordField1.getPassword();

ConexionBD.getInstancia().conectar();

try{

Connection con=ConexionBD.getInstancia().getConexion();
Statement st=con.createStatement();
System.out.println("stament " +st);
ResultSet rs=st.executeQuery("select * from Usuarios");
System.out.println("resulset " +rs);

while(rs.next())
{
System.out.println(rs.getArray(1));
}
rs.close();


}
catch (Exception ex){
JOptionPane.showMessageDialog(null, ex.getMessage(), "Persistencia_CargoEmpleados",JOptionPane.WARNING_ MESSAGE);

}

}

public class ConexionBD {

private Connection con;
private static ConexionBD instancia = null;


private ConexionBD() {
}


public static ConexionBD getInstancia(){

if (instancia == null)
instancia = new ConexionBD();
return instancia;

}

public boolean conectar(){

boolean valor=false;

try{
Class.forName("org.sqlite.JDBC");
con = DriverManager.getConnection("jdbc:sqlite:MiBase.sq lite","","");
valor=true;


} catch(Exception ex){
ex.printStackTrace();
valor=false;
}
return valor;
}

public Connection getConexion(){
return con;
}

}


y la exepcion que me arroja es "not implemented by SQlite JDBC driver"
  #13 (permalink)  
Antiguo 15/11/2008, 09:50
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Objeto Connection global

Una consulta no es MiBase.db en vez de MiBase.sqlLite ?

Yo nunca trabaje con este motor pero mirando todos los ejemplos en internet es .db

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #14 (permalink)  
Antiguo 16/11/2008, 08:45
 
Fecha de Ingreso: noviembre-2008
Mensajes: 17
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Objeto Connection global

debe ser sqlite, al colocar db me indica que la tabla usuarios no existe...

Gracias...
  #15 (permalink)  
Antiguo 16/11/2008, 13:54
 
Fecha de Ingreso: noviembre-2008
Mensajes: 17
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Objeto Connection global

Para los interesados en el tema, en bbdd sqlite no se puede utilizar el metodo getArray del objeto Resulset, se debe usar getString....

Gracias Julio.....
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 15:15.