2017-06-19 98 views
0

我正在測試聲納以確保關閉數據庫連接,並且我有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?
  • 爲什麼沒有任何版本抱怨沒有關閉連接?

感謝

+0

你使用什麼版本的Java插件?聲吶版本可以使用不同版本的java插件 –

+0

6.4沒有警告PreparedStatement的事實表明某些問題在這裏得到修復。 – Henry

+0

我回答了你的問題,你爲什麼看到不同版本的不同結果。我還建議改變標題以反映這一部分。當從'DataSource'中檢索'Connection'時,請發佈另一個關於issue未被提出的問題,它不直接相關。 –

回答

1

爲什麼在最近的版本中未檢測到一些問題的原因是由於靜態分析做分析進行了改進。

用於Java源代碼分析的插件稱爲SonarJava,它具有比SonarQube獨立的發佈週期。您應始終使用最新版本以獲得最佳結果。使用SonarQube服務器上的更新中心更新到最新的可用版本。

+0

嗨@Tibor我'我們來看看。謝謝 – elamas

相關問題