Como cerrar la conexion correctamente con MySQL en Java al leer desde la base de datos para llenar un JTable

publicado por: Anonymous

Yo solicito en mi programa un Numero teléfono de origen, otro de destino y la duración. Lo guardo en la base de datos, luego debo leer la base de datos para llenar un JTable pero, me esta dando el siguiente error:

mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
No operations allowed after connection closed.

Estoy cerrando las conexiones de manera incorrecta?, qué me hace falta?.

Este es mi código:

// Agregar filas al JTable leyendo la base de datos
Connection conn = conexion.getConnection();
Statement st;

// Creamos un objeto de la clase ResultSet,
// la cual será la encargada de devolvernos los resultados de los registros
ResultSet rs;

// Crear sentencia SQL para seleccionar/obtener en la base de datos
String showTableSQL = "SELECT * FROM llamadas";

                try {
                    // Establecemos la comunicación entre nuestra aplicación java y la base de datos
                    st = conn.createStatement();

                    // Le pasamos al objeto de ResultSet el resultado de ejecutar la sentencia "query"
                    // Con "executeQuery" realizamos una consulta a la base de datos
                    rs = st.executeQuery(showTableSQL);

                    // En este bucle vamos recorriendo valores mientras existan
                    while (rs.next()) {
                        // Obtenemos el modelo del JTable
                        model = (DefaultTableModel) table.getModel();

                        // Agregamos las filas al JTable
                        // Con "getInt" y "getString" obtenemos los valores de las diferentes columnas pasandole el número de columna
                        model.addRow(new Object[]{
                                        Integer.toString(rs.getInt(1)),
                                        rs.getString(2),
                                        rs.getString(3),
                                        rs.getString(4),
                                        rs.getString(5),
                                        Integer.toString(rs.getInt(6)),
                                        Double.toString(rs.getDouble(7))
                                            });
                                        }

                    // Cerramos las conexiones, en orden inverso a su apertura
                    conn.close();
                    rs.close();
                    st.close();
                } catch (SQLException error) {
                    System.out.println("Error!, no se pudo llenar el JTable.n" + error);;
                }

No tengo idea de el por qué dice que la conexión se ha cerrado si estoy solicitando una nueva conexión. Cualquier ayuda es bienvenida, gracias por todo y por su tiempo.

solución

El problema es que si hay una excepción antes, los close() no se ejecutan.

Normalmente se ciera en el finally del try-catch, para asegurarse de que se cierre aunque se lance una excepción.

Además, no está de más cerrar en orden inverso (primero rs, luego st, luego conn).

Asegúrate de que no lance excepción al cerrar. Sería improbable, pero confundiría bastante.

  } catch (SQLException e) {
    ...
  } finally {
    try {
      rs.close();
    } catch (Exception e) {
      // LOG
    }

    try {
      st.close();
    } catch (Exception e) {
      // LOG
    }

    try {
      conn.close();
    } catch (Exception e) {
      // LOG
    }

Si usas Java 7 o posterior, puedes usar el try-with-resources, que ya se encarga de cerrar al salir del try

try (Connection conn = crearConexion();
     Statement st = conn.createStatement();
     ResultSet rs = st.executeQuery(showTableSQL);) {
    ... Leer resultset
} catch (SQLException e) {
    ...
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *