我正在测试声纳以确保关闭数据库连接,并且我有extrange结果,我不明白。为什么在使用不同版本的SonarQube时发现不同的问题?
我正在尝试两个版本的执行maven目标“sonar:sonar”的eclipse与embeded maven版本3.3.9。
我试过三个版本的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?
- 为什么没有任何版本抱怨没有关闭连接?
感谢
你使用什么版本的Java插件?声呐版本可以使用不同版本的java插件 –
6.4没有警告PreparedStatement的事实表明某些问题在这里得到修复。 – Henry
我回答了你的问题,你为什么看到不同版本的不同结果。我还建议改变标题以反映这一部分。当从'DataSource'中检索'Connection'时,请发布另一个关于issue未被提出的问题,它不直接相关。 –