データベース接続を閉じるためにソナーをテストしていますが、理解できない結果を得ています。異なるバージョンのSonarQubeを使用しているときに異なる問題が発生するのはなぜですか?
私は埋め込み済みのMavenバージョン3.3.9を使用してEclipseから "sonar:sonar"という目的を実行する2つのバージョンのコードを試しています。
私は3つのバージョンのsonarqubeサーバーを試しました:5.6.6,6.2、および6.4。
sonarqube 5.6.6:
- 閉じるこの "接続"
- 閉じるこの "PreparedStatementの" このコード
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 6.2:
- 閉じるこの "PreparedStatementの"
sonarqube 6.4を
- 閉じるこの "接続"
このコードで私の質問は:
- それは が正確にResultSetのと同じ閉じていたときに、なぜ5.6.6と6.2はPreparedStatementの文句を言うのでしょうか?
そして、このコードwhith(私だけが接続を取得する方法を変更し、それが仕事をしたりしませんならば、それは問題ではない)
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プラグインのバージョンを使用しますか? Sonarのバージョンでは異なるバージョンのJavaプラグインを使用できます –
6.4ではPreparedStatementについて警告しないという事実は、ここでいくつかの問題が修正されたことを示しています。 – Henry
あなたの質問に、異なるバージョンで異なる結果が出ているのはなぜですか?私はまた、この部分を反映するタイトルの変更を提案しました。 'DataSource'から' Connection'を取得したときに発生しなかった問題については別の質問を投稿してください。直接関連していません。 –