为什么在使用不同版本的SonarQube时会发现不同的问题?

时间:2017-06-19 08:10:40

标签: java sonarqube

我正在测试声纳以确保关闭数据库连接,并且我有一些我不明白的结果。

我正在尝试使用嵌入式maven版本3.3.9从eclipse执行maven目标“sonar:sonar”的两个版本的代码。

我尝试过三个版本的sonarqube服务器:5.6.6,6.2和6.4。

使用此代码

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.InitialContext;
import javax.sql.DataSource;

public class TestClosingResources {
    public static void main(String[] args) {

        Connection con = null;
        ResultSet rsGet = null;
        PreparedStatement psGet = null;
        try {
            DriverManager.registerDriver (new com.mysql.jdbc.Driver());
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "test", "test");              

            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;
        }
    }

}

我有关于关闭资源的这些问题:

sonarqube 5.6.6:

  • 关闭此“连接”
  • 关闭此“PreparedStatement”

sonarqube 6.2:

  • 关闭此“连接”
  • 关闭此“PreparedStatement”

sonarqube 6.4:

  • 关闭此“连接”

我对此代码的疑问是:

  • 为什么5.6.6和6.2会抱怨PreparedStatement 关闭与ResultSet完全相同?

这个代码(只改变我检索连接的方式,无论它是否有效都无关紧要)

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.InitialContext;
import javax.sql.DataSource;

public class TestClosingResources {
    public static void main(String[] args) {

        Connection con = null;
        ResultSet rsGet = null;
        PreparedStatement psGet = null;
        try {
            InitialContext ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/testci");
            con = ds.getConnection();       

            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;
        }
    }

}

sonarqube 5.6.6:

  • 关闭此“PreparedStatement”

sonarqube 6.2:

  • 关闭此“PreparedStatement”

sonarqube 6.4:

  • 没有关闭资源的问题

我对此代码的疑问是:

  • 为什么5.6.6和6.2会抱怨PreparedStatement 关闭与ResultSet完全相同?
  • 为什么没有任何版本抱怨没有关闭连接?

由于

1 个答案:

答案 0 :(得分:1)

在更新版本中未检测到某些问题的原因是由于进行分析的静态分析器得到了改进。

用于Java源代码分析的插件称为SonarJava,它具有独立的发布周期而不是SonarQube。您应始终使用最新版本以获得最佳结果。使用SonarQube服务器上的更新中心更新到最新的可用版本。