“资源应该关闭”规则如何检查连接是否已关闭?

时间:2017-07-07 08:12:59

标签: java sonarqube

这是一个问题,而不是问题。

我有一个名为DSConnectionUtilExternal的类,其中一个方法用于检索数据库连接,另一个方法用于关闭它。这个类在一个jar文件中。

另一方面,我有一个项目,它包含jar文件作为依赖项。 在这个proyect我有这个代码

Connection con = null;
ResultSet rsGet = null;
PreparedStatement psGet = null;
try {
    con = DSConnectionUtilExternal.openConnection();

    psGet = con.prepareStatement("SELECT * FROM TEST");
    rsGet = psGet.executeQuery();
    int counter = 0;
    while (rsGet.next()) {
        counter++;
        System.err.println(counter);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (rsGet != null) {
            rsGet.close();
        }
    } catch (Exception e2) {
        e2.printStackTrace();
    }
    rsGet = null;
    try {
        if (psGet != null) {
            psGet.close();
        }
    } catch (Exception e2) {
        e2.printStackTrace();
    }
    psGet = null;
    DSConnectionUtilExternal.closeConnection(con);
}

如果我在jar文件中删除方法closeConnection的内容,声纳不会检测到连接未关闭。我认为这是正常的,声纳不反编译jar文件来访问jar文件代码。

所以问题是? “资源应该关闭”规则使用什么标准来确定连接是否在finally子句中关闭?

由于

1 个答案:

答案 0 :(得分:3)

从您的问题中正确假设:目前,SonarJava(刚刚发布的4.11)不进行跨文件分析,也不知道您的closeConnection方法中发生了什么。

但是,关于未关闭资源的规则有一个简单的启发式方法,可以避免在将资源传递给名为close的方法时考虑资源的误报。

SonarJava正准备读取您的jar文件,并了解该资源已关闭,但这是一个复杂的功能,我们希望在不久的将来能够提供它。