结果集永远不会关闭 - Sonarqube分析

时间:2017-05-24 13:46:26

标签: java sonarqube resultset

在我们的代码中,我们已经关闭了finally块中的结果集,但声纳显示它从未关闭。请帮助。我们已经使用Spring数据源工具创建了连接,并使用相同的方法释放了与池的连接。

try {
  con = DataSourceUtils.getConnection(dataSource); // connection to database using spring
  stmt = con.createStatement();
  rs = stmt.executeQuery("<>");
  .
  .
}
catch (Exception e) {
}
finally {
  if (stmt != null && !stmt.isClosed()) {
    stmt.close();
  }
  if (rs != null && !rs.isClosed()) {
    rs.close();
  }
  if (con != null) {
    DataSourceUtils.releaseConnection(con, dataSource);
  }
}

3 个答案:

答案 0 :(得分:2)

有可能

stmt.close();

抛出SQLException。如果发生这种情况,那么

rs.close();

永远不会被执行。正如其他人所建议的那样,请考虑使用try with resource

答案 1 :(得分:1)

您应该使用try-with-resource语句来清理代码并确保正确的资源处理:

try (final Connection con = DataSourceUtils.getConnection(dataSource); // connection to database using spring
    final Statement stmt = con.createStatement();
    final ResultSet rs = stmt.executeQuery("<>");) {
    ...
} catch (Exception e) {
   // handle Exceptions here
}

答案 2 :(得分:0)

最后,我找到了Sonar抛出错误的原因,即使我们已经关闭了资源。

Sonar希望每个资源在单独的try catch中单独关闭。如果一旦资源关闭导致问题,sis背后的原因,其他可能也是开放的。

像这样,

finally{
try{
if(resultset!=null){
resultset.close();
}
catch(SQLException e){
---
---
}
if(connection!=null){
connection.close();
}
catch(SQLException e){
---
---
}
}

再次在上面的代码中,请在异常中添加logger.error以避免Sonar发生另一个错误! ! :) logger.error("", e);