2017-06-19 82 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

相关问题