Estuve leyendo los post que recomiendas y estas son las conlusiones que saco
1.- La conexión si se cierra según palabras de Genesys Rondon ( en el siguiente enlace: https://app.aluracursos.com/forum/topico-duda-cierre-de-conexion-para-otras-consultas-175209) y dado que estamos usando try-with-resources la cual se encarga de cerrar la conexión automáticamente y no lo digo yo si no la misma documentación la cual la puedes leer acá: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html y dice explicitamente lo siguiente La try-with-resources statement garantiza que cada recurso se cierre al final de la declaración. Cualquier objeto que implemente java.lang.AutoCloseable, que incluye todos los objetos que implementen java.io.Closeable, puede usarse como recurso.
2.- Lo que hicieron mis compañero en la solución no le veo caso dado que ya esta implementado en el codigo
*En nuestra clase ControlDeStockFrame se creo un objeto de la clase ProductoController con el nombre productoController el cual es instanciado en el constructor de esta clase
*Como consecuencia de haber instanciado este objeto hicimos llamado del constructor de este mismo que se encuentra en la clase ProductoController, ahí mismo podrás notar que ya se encuentra implementando el siguiente código:
public ProductoController() {
this.productoDAO = new ProductoDAO(new ConnectionFactory().recuperaConexion());
}
Es importante entender esto, dado que lo que se esta haciendo es crear un nuevo objeto de la clase ProductoDOA, la clase ProductoDOA tiene un constructor que pide una conexión y lo que se puede ver en el código es que se inicializa este nuevo objeto con una nueva conexion, pero en este caso no con una conexión si no mas bien con un pool de conexión por la implementacion que se llevo acabo en la clase ConnectionFactory
public ProductoDAO(Connection con) {
this.con = con;
}
Volvamos a nuestra clase ControlDeStockFrame
Ahí podras notar que hacemos uso de nuestro objeto productoController en cada uno de los métodos, este es el usado en el metodo modificar
var filasModificadas = this.productoController.modificar(nombre, descripcion, id, cantidad);
El cual ya se a instanciado y ya ha creado una conexión por todo lo antes mencionado, en este ejemplo lo que hace es llamar al metodo modificar de la clase ProductoController la que a su vez hace un llamado al metodo modficar de la clase ProductoDOA y el cual tiene todo el codigo y por supuesto la implementación try-with-resources statement que a su vez se encarga de cerrar automáticamente la conexion.
Lo que veo en lo cual se están confundiendo es que ustedes piensan que la conexión se mantiene abierta porque ya no la volvemos a instanciar después de que se cerro, pero lo que se están olvidando es del pool de conexiones, el cual cito:
"Un pool de conexiones a base de datos es una forma de llevar un control de las mismas de modo que al desocupar una conexión, en lugar de cerrar la conexión la tengamos a la mano y se entregue al siguiente objeto que necesite una conexión.
Si bien esto puede sonar innecesario debe de recordar que crear una conexión a base de datos es una de las operaciones mas pesadas que puede efectuar y que las conexiones expiran automáticamente después de un tiempo sin uso, ambas cosas que pueden afectar el rendimiento o estabilidad de su aplicación.
Ahí es donde entra el pool de conexiones ya que este se encargara de reducir el numero de veces que necesite crear una nueva conexión y en caso que esta expire crea una nueva si es necesario." y pueden saber mas en la siguiente pagina: https://hashblogeando.wordpress.com/2016/04/25/pooling-de-conexiones-a-base-de-datos-con-c3p0-y-java/
A mi entender lo que se esta haciendo es que al cerrar la conexión lo que hace el pool es rehusarla y es ahí donde todos se estan confundiendo