2017-05-24 66 views
0

在我们的代码中,我们已经关闭了结果集,最后仍然阻止声纳表明它永远不会关闭。请帮助。我们已经使用Spring数据源实用程序创建了连接,并使用相同的连接释放了连接池。结果集从未关闭 - Sonarqube分析

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); 
    } 
} 
+2

鉴于你已经显示的构造,你可以转换为使用'尝试与资源'的方法,那么你可以摆脱finally块(主要是)。 – KevinO

+0

不要相信SonarQube;它往往是错误的,有时甚至是错误的。 – DavidW

+0

谢谢凯文......!截至目前,我无法使用该选项...!我找到了解决方案,并已在下面给出它!它真的很难破解什么声纳认为 –

回答

1

你应该使用try-与资源语句来清理你的代码,并确保正确的资源处理:

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 
} 
+0

谢谢DPR ..这是正确的选择。但客户还没有准备好改变它,因为它可能涉及更大的测试范围。 –

2

这可能

stmt.close(); 

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

rs.close(); 

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

0

最后我发现了为什么Sonar会抛出错误,即使我们已经关闭了资源。

Sonar希望每个资源在单独的尝试捕获中分别关闭。 sis背后的原因是,如果一旦资源关闭导致问题,其他人可能会被打开。

这样,

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

再在上面的代码,请在例外添加logger.error避免声纳另一个错误! ! :) logger.error("", e);