我正在測試聲納以確保關閉數據庫連接,並且我有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未被提出的問題,它不直接相關。 –