我正在测试 Sonar 以确保关闭数据库连接,但我得到了我不明白的奇怪结果。
我正在尝试使用嵌入式 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;
}
}
}
我对关闭资源有以下问题:
Sonar 库5.6.6:
- 关闭此“连接”
- 关闭此“PreparedStatement”
Sonar 库6.2:
- 关闭此“连接”
- 关闭此“PreparedStatement”
Sonar 库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;
}
}
}
Sonar 库5.6.6:
- 关闭此“PreparedStatement”
Sonar 库6.2:
- 关闭此“PreparedStatement”
Sonar 库6.4:
- 没有关闭资源的问题
我对这段代码的疑问是:
- 为什么5.6.6和6.2会提示PreparedStatement,当它是 关闭与 ResultSet 完全相同?
- 为什么没有任何版本提示未关闭连接?
谢谢
最佳答案
在较新的版本中未检测到某些问题的原因是由于进行分析的静态分析器得到了改进。
用于Java源代码分析的插件名为SonarJava,它比SonarQube有独立的发布周期。您应该始终使用最新版本以获得最佳结果。使用 SonarQube 服务器上的更新中心更新到最新的可用版本。
关于java - 为什么使用不同版本的SonarQube时会发现不同的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44625337/