在我们的代码中,我们已经关闭了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);
}
}
答案 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);