2017-06-19 12 views
0

データベース接続を閉じるためにソナーをテストしていますが、理解できない結果を得ています。異なるバージョンの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よりも?
    • なぜ、どのバージョンでも接続を終了しないと文句を言わないのですか?

    おかげ

  • +0

    どのJavaプラグインのバージョンを使用しますか? Sonarのバージョンでは異なるバージョンのJavaプラグインを使用できます –

    +0

    6.4ではPreparedStatementについて警告しないという事実は、ここでいくつかの問題が修正されたことを示しています。 – Henry

    +0

    あなたの質問に、異なるバージョンで異なる結果が出ているのはなぜですか?私はまた、この部分を反映するタイトルの変更を提案しました。 'DataSource'から' Connection'を取得したときに発生しなかった問題については別の質問を投稿してください。直接関連していません。 –

    答えて

    1

    いくつかの問題が最近のバージョンでは検出されていない理由は、分析を行う静的アナライザは、改善されたという事実によるものです。

    Javaソースコード解析に使用されるプラグインはSonarJavaと呼ばれ、SonarQubeより独立したリリースサイクルを持ちます。最良の結果を得るには、常に最新のリリースを使用する必要があります。 SonarQubeサーバーの更新センターを使用して、最新のリリースに更新してください。

    +0

    こんにちは@Tibor私は、見てみましょう。ありがとう – elamas

    関連する問題