Cerrar automaticamente los recursos en java con Try-With-Resource

Buenas Lectores.

Normal cuando estamos automatizando encontramos la necesidad de conectarnos a base de datos, al realizar esto, siempre debemos cerrar los recursos abiertos (conexiones).

El código java de la conexión se debe ver algo muy similar al siguiente:


Connection con;

PreparedStatement ps = null;

ResultSet rs = null;

try

{

  // your code with database connections

}

catch ( Exception e )

{

  //Catch and handle any exceptions

}

finally

{

  con.close();

  ps.close();

  rs.close();

}

Se puede observar que tenemos la sentencia finally, donde cerramos las conexiones, si bien se pueden cerrar dentro del try que pasa si el try falla?. Bueno SonarQ nos obliga a que debemos como buena práctica tener el cierre en el finally.

En términos generales, siempre se busca que no olvidemos cerrar las conexiones, es por eso que ahora existe una mejor forma de hacerlo: 


try (   Connection con = getConnection(); PreparedStatement ps = null; ResultSet resultSet = null; )

{

   // your code with database connections

}

catch ( Exception e )

{

   //Catch and handle any exceptions

}

finally

{

   // Instead of closing open resources, you can do anything else in       here

}


El uso de try-with-resources es básicamente este: puede declarar todos los objetos de recursos que se pueden cerrar que va a usar dentro de la cláusula try y Java se encargará de cerrar los recursos por sí mismo.

Tenga en cuenta que solo los objetos que implementan java.lang.AutoCloseablese pueden usar con la instrucción try-with-resources. Esto incluye todas las clases que implementan java.io.Closeable.


Una aplicación real podría ser:


public static UnitVehicles getTapId(String vehicle) {

UnitVehicles vehiclePropierties = null;

try(Connection databaseConnection = JDBCConection.startConectionBD();final Statement sqlStatement = databaseConnection.createStatement();)

    {       

      logger.info("Connected to database");

      ResultSet rs = null;   

      String queryString="select ";

      queryString+="u.TaipID as tapid, ";

      queryString+="from dbo.Unidades as u ";

      queryString+="inner join dbo.vehiculos as v on v.NumeroSerie = u.NumeroSerie ";

      queryString+="where placa = "+"'"+vehicle+"'";             

      rs=sqlStatement.executeQuery(queryString);       

      while (rs.next()){

      vehiclePropierties = printResultSetRow(rs);

      }       

      rs.close();

  logger.info("Closing database connection");

    }

    catch (SQLException err){

    logger.info("Error connecting to the database {}",err);

    System.exit(0);    

    }     

logger.info("Program finished");

return vehiclePropierties;

}


Estamos dejando que nuestro control de excepciones realice todo el trabajo de abrir y cerrar nuestros recursos cuando termina de realizar el proceso, esto hace que nuestro código sea más limpio, entendible, controlable y sobre todo no muestre alertas en SonarQ por no cerrar recursos.


Fuentes:

https://medium.com/@duli.dabare/java-close-your-resources-with-try-with-resource-dec36c73deed

https://www.tutorialspoint.com/how-to-use-try-with-resources-with-jdbc

https://www.programiz.com/java-programming/try-with-resources

https://stackoverflow.com/questions/22671697/try-try-with-resources-and-connection-statement-and-resultset-closing

Comentarios

Entradas populares de este blog

Tiempo de espera "muerto" explicito en Playwright

SerenityBDD - Almacenar valores en memoria (pasar información entre steps)

Subir mi proyecto local a Azure repos