Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

[Duda] Conexiones Cerradas luego de implementar el DAO

Buenas culminando con el capítulo 5 - Capa de Persistena de DAO del curso de Java y JDBC: Trabajando con una base de datos

Me di cuenta que al implementar el DAO no podía realizar ninguna transacción es decir comenzaba a correr la aplicación y listaba los productos pero luego cuando quería agregar, modificar o eliminar me arrojaba el siguiente error.

Error al momento de guardar un registro

Entonces comencé a releer el código y vi el siguiente fragmento en el constructor de ControlDeStockFrame:

 public ControlDeStockFrame() {
        super("Productos");

        this.categoriaController = new CategoriaController();
        this.productoController = new ProductoController();

        Container container = getContentPane();
        setLayout(null);

        configurarCamposDelFormulario(container);

        configurarTablaDeContenido(container);

        configurarAccionesDelFormulario();
    }

De repente me equivoco, sin embargo, creo que al inicializar el productoController en el constructor tanto el método modificar, cargar, listar o eliminar usan la misma conexión a la base de datos, y al iniciar la aplicación el método Listar comienza a ejecutarse y al terminar cierra la conexión y luego esta ya no es abierta por ningun otro método. La manera que encontré de solucionarlo es en cada inicio del método volver a iniciar el ProductoController:

// Método modificar de ControlDeStockFrame
private void modificar() {
        
        this.productoController = new ProductoController();
        
        ...
}

// Método eliminar de ControlDeStockFrame
private void eliminar() {
        
        this.productoController = new ProductoController();
        
        ...
}

// Método cargarTabla de ControlDeStockFrame
private void cargarTabla() {
        
        this.productoController = new ProductoController();
        
        ...
}

// Método guardar de ControlDeStockFrame
private void guardar() {
        
        this.productoController = new ProductoController();
        
        ....
}

Quisiera saber si hay una mejor manera de resolver este inconveniente.

1 respuesta
solución!

Hola Angel,

El problema que estás enfrentando está relacionado con la gestión de las conexiones a la base de datos en tu aplicación. El enfoque de recrear la instancia de ProductoController en cada uno de los métodos para resolver el problema de la conexión cerrada puede no ser la solución más eficiente ni elegante.

Lo que estás observando es que, al cerrar la conexión después de cada método, no puedes usar la misma instancia de ProductoController en métodos posteriores, ya que la conexión se cierra y no se puede reabrir. Esto es un efecto secundario no deseado.

Una mejor manera de manejar la gestión de conexiones es asegurarte de que cada método en ProductoController utilice una conexión independiente, y no depender de mantener una instancia de ProductoController durante toda la duración de la clase que lo utiliza. Una forma común de hacer esto es implementar un patrón de diseño llamado "Unidad de Trabajo" o "UnitOfWork", que se encarga de manejar las conexiones y transacciones de manera coherente.

A continuación, te proporciono una idea de cómo podrías abordar este problema utilizando el patrón "Unidad de Trabajo":

Crear una clase de Unidad de Trabajo: Crea una clase que se encargue de manejar las conexiones y transacciones. Esta clase podría tener métodos para abrir y cerrar conexiones, comenzar y confirmar transacciones, etc.

Modificar los controladores: En lugar de tener una instancia de ProductoController que maneje la conexión, haz que los métodos en ProductoController reciban una instancia de la Unidad de Trabajo como parámetro. Esto permite que cada método pueda manejar sus propias conexiones y transacciones sin interferir con otros métodos.

Utilizar la Unidad de Trabajo: En tu clase ControlDeStockFrame, crea una instancia de la Unidad de Trabajo y pásala como parámetro a los métodos que interactúan con la base de datos. De esta manera, cada método puede trabajar con su propia conexión y transacción.

Administrar conexiones: Asegúrate de abrir y cerrar las conexiones de manera adecuada utilizando la Unidad de Trabajo. Por ejemplo, podrías abrir una conexión en el inicio del método y cerrarla al final, o utilizar bloques try-finally para garantizar que la conexión se cierre incluso si ocurre una excepción.

Este enfoque es más flexible y modular, ya que permite que cada método maneje su propia conexión sin depender de la instancia de ProductoController. También facilita la administración de las transacciones y evita los problemas de conexiones cerradas.

Espero que las informaciones sea útil. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios.