Search code examples
javadb4o

Why i get DatabaseClosedException(DB4o) trying to insert/delete/show 2 times in one run?


Im getting this exception when i try to manipulate more than one objects in the DB in one run. No matter what choice i choose the same problem happens again and again. It seems that is related that the connection gets disconnected in some point that im not capable to see it.

Exception:

exception

Main:

public class NotasBDOR {
    
    public static void main(String[] args) {
        
    int menu = 10;
    Scanner sc = new Scanner(System.in);
    GestorDB4o gestor = new GestorDB4o();
        
        do{
            
            System.out.println("1.- Insertar profesor");
            System.out.println("2.- Eliminar profesor");
            System.out.println("3.- Validar la entrada de un profesor");
            System.out.println("4.- Validar la entrdada de un alumno");
            System.out.println("0.- Salir");
            
            menu = sc.nextInt();
            
            switch(menu){
                case 1:
                    Profesor p = new Profesor();
                    String nombreProfesor;
                    String nombreUsuarioProfesor;
                    String passwordProfesor;
                            
                   
                        System.out.println("Introduzca el nombre :");
                        nombreProfesor = sc.next();
                        System.out.println("Introduzca el nombre de usuario: ");
                        nombreUsuarioProfesor = sc.next();
                        System.out.println("Introduzca el password: ");
                        passwordProfesor = sc.next();
                        p = new Profesor(nombreProfesor,nombreUsuarioProfesor,passwordProfesor);   
                        gestor.guardarProfesor(p);
                        gestor.cerrar();
                       
                    
                break;
                case 2:
                    System.out.println("Introduzca el nombre de usuario:");
                    nombreUsuarioProfesor = sc.next();
                    gestor.eliminarProfesor(nombreUsuarioProfesor);
                    gestor.cerrar();
                    

                break;
                case 3:
                    System.out.println("Introduzca el nombre de usuario: ");
                    nombreUsuarioProfesor = sc.next();
                    System.out.println("Introduzca el password: ");
                    passwordProfesor = sc.next();
                        if(gestor.validarProfesor(nombreUsuarioProfesor, passwordProfesor)){
                            System.out.println("Bienvenido "+nombreUsuarioProfesor+" !");
                            
                        }else{
                            System.out.println("Se han introducido unas credenciales incorrectas");
                            
                        }
                        gestor.cerrar();
                    
                break;
                case 4:
                    System.out.println("Introduzca el nombre de usuario: ");
                    String nombreUsuarioAlumno = sc.next();
                    System.out.println("Introduzca el password: ");
                    String passwordAlumno = sc.next();
                        if(gestor.validarAlumno(nombreUsuarioAlumno, passwordAlumno)){
                            System.out.println("Bienvenido "+nombreUsuarioAlumno+" !");
                            
                        }else{
                            System.out.println("Se han introducido unas credenciales incorrectas");
                            
                        }
                        gestor.cerrar();
                break;
                                   
            }
        }while(menu!=0);
        
        
    }
    
}

Profesor:

public class Profesor {
    
    private static AtomicInteger cont = new AtomicInteger();
    private int id;
    private String nombre;
    private String nombre_usuario;
    private String password;
    
    public Profesor(){
        
    }
    
    public Profesor(String nombre, String nombre_usuario, String password){
        this.id = cont.incrementAndGet();
        this.nombre = nombre;
        this.nombre_usuario = nombre_usuario;
        this.password = password;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the nombre_usuario
     */
    public String getNombre_usuario() {
        return nombre_usuario;
    }

    /**
     * @param nombre_usuario the nombre_usuario to set
     */
    public void setNombre_usuario(String nombre_usuario) {
        this.nombre_usuario = nombre_usuario;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
    
    @Override
    public String toString(){
        return "id: "+id+" nombre: "+nombre+" nombre_usuario: "+nombre_usuario;
    }
}

GestorDB4o:


package notaslinkiadb4o;

import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import java.util.List;

/**
 *
 * @author Lluis
 */
public class GestorDB4o {
    
    private ObjectContainer base_datos;
    
    public GestorDB4o(){
        base_datos = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "notaslinkia");
    }
    
    
    public void cerrar(){
        base_datos.close();
    }
    
    
    public void guardarProfesor(Profesor p){
        base_datos.store(p);
        System.out.println("Profesor guardado: "+p.getNombre());
    }
    
    public void guardarAlumno(Alumno a){
        base_datos.store(a);
        System.out.println("Alumno guardado: "+a.getNombre());
    }
    
    public void eliminarProfesor(String nombre_usuario){
        Profesor p = new Profesor(null,nombre_usuario,null);
        ObjectSet result = base_datos.queryByExample(p);
        System.out.println(result.size());
        while(result.hasNext()){
            Profesor found = (Profesor) result.next();
            base_datos.delete(found);
            System.out.println("Profesor borrado: "+found.getNombre_usuario());
        }
    }
    
    public boolean validarProfesor(String nombre_usuario, String password){
        Profesor p = new Profesor(null,nombre_usuario,password);
        ObjectSet result = base_datos.queryByExample(p);
        while(result.hasNext()){
            Profesor found = (Profesor) result.next();
            return true;
        }
        return false;
    }
    
    public boolean validarAlumno(String nombre_usuario, String password){
        Alumno a = new Alumno(0,null,nombre_usuario,password,0,null);
        ObjectSet result = base_datos.queryByExample(a);
        while(result.hasNext()){
            Alumno found = (Alumno) result.next();
            return true;
        }
        return false;
    }
    
    public int tamanoProfesor(){
        List<Profesor> profesores = base_datos.query(Profesor.class);
        return profesores.size();
    }
    
    
    
}

Solution

  • @user207421 is right

    gestor.cerrar() before every break will be close the database connection

    you should new GestorDB4o() in each loop

    like this

    do{
                GestorDB4o gestor = new GestorDB4o();
                
                System.out.println("1.- Insertar profesor");
                System.out.println("2.- Eliminar profesor");
                System.out.println("3.- Validar la entrada de un profesor");
                System.out.println("4.- Validar la entrdada de un alumno");
                System.out.println("0.- Salir");
    
                menu = sc.nextInt();
    
                switch(menu){
                     //....
                }
    }while(menu!=0)
    

    a better way is Do not call gestor.cerrar()