当前位置: 首页 > 知识库问答 >
问题:

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

苏法
2023-03-14

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

我正在使用嵌入的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:

  • 关闭此“连接”
  • 关闭此“准备语句”

Sonarqube 6.2:

  • 关闭此“连接”
  • 关闭此“准备语句”

sonarqube 6.4:

  • 关闭此“连接”

我对这段代码的问题是:

  • 为什么5.6.6和6.2在与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:

  • 关闭此“准备语句”

Sonarqube 6.2:

  • 关闭此“准备语句”

sonarqube 6.4:

  • 关闭资源没有问题

我对这段代码的问题是:

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

谢谢

共有1个答案

莫飞翮
2023-03-14

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

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

 类似资料:
  • 我有两个元素,我想让它们淡出,停留3秒,然后使用jQuery一个接一个淡出,但效果是一次应用的。 null null 我尝试使用和方法,但都不起作用。是什么导致了这个问题?有没有更好的方法来实现这个目标?

  • 按照这里和这里的帖子,我必须安装两个不同版本的Java/OpenJDK 现在我有 在两个不同的地方 /usr/local/opt/openjdk/libexec/openjdk.jdk/Contents/Home/bin/ 和<code>openjdk 14</code> 也在两个不同的位置 所以我的问题是 为什么每次安装OpenJDK都有两个不同的位置 如何确定我的系统上是否有更多的JDK安装?

  • 在我维护的包中,有一个包含一个未固定的依赖项。安装我的软件包在本地显示的行为与在Travis上显示的行为不同: 在本地运行包上的将导致安装Pandas版本。 在Travis配置项内运行相同的将导致安装Pandas版本(指向作业的链接)。 在这两种情况下,pip和setuptools的版本是相同的(,)。 我没有指定显式索引(而且在本地我没有全局pip配置),所以我假设两者都应该使用标准PyPI索引

  • 问题内容: 我尝试检查Golang何时返回本地值为nil,然后使用此代码。 输出为0x0 但是当我只是使用println输出值时。 输出更改为0x0(0x93d40,0x0) 谁能解释这种行为的机制?谢谢! 问题答案: 首先,内建是非常不同的问题:在实现和目的上都不同。使用反射处理许多复杂的情况,而仅处理一些基本情况,并且仅用于“引导或调试”(如规范所述)。 在这种情况下,您将打印从返回的。在外观

  • 问题内容: 我试图了解某些“魔术”行为的根本原因,但我无法完全解释,而从阅读ReactJS源代码中看不出来。 当响应输入中的事件而同步调用该方法时,所有操作均按预期进行。输入的“新”值已经存在,因此DOM实际上并未更新。这是非常理想的,因为这意味着光标不会跳到输入框的末尾。 但是,当运行具有完全相同结构但 异步 调用的组件时,输入的“新”值似乎不存在,从而导致ReactJS实际触摸DOM,这将导致

  • 版本号现在不同了 在CVS中,修订版本号是每文件的,这是因为CVS使用RCS文件保存数据,每个文件都在版本库有一个对应的RCS文件,版本库几乎就是根据项目树的结构创建。 在Subversion,版本库看起来像是一个单独的文件系统,每次提交导致一个新的文件系统;本质上,版本库是一堆树,每棵树都有一个单独的修订版本号。当有人谈论“修订版本54”时,他们是在讨论一个特定的树(并且间接来说,文件系统在提交