在方法中搜索多次出现的变量

时间:2014-01-15 11:53:03

标签: java regex eclipse findbugs code-search

我的Java项目中的游标泄漏存在问题。

典型示例:

private void doSomething() throws Exception {
    String sql1= "some sql statement";
    String sql2= "some other sql statement";        
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {

        Connection con = getConnection();
        ps = con.prepareStatement(sql1);
        rs = ps.executeQuery();
        //do something with the ResultSet rs        
        //[Need to call ps.close here. Otherwise I risk getting ORA-01000.]
        ps = con.prepareStatement(sql2);              
        ps.executeQuery();
    } catch (Exception e) {
    } finally {
        ps.close();
        rs.close();
    }
}

由于我有一个相当大的代码库,我希望能够找到所有方法 有两个或多个名为sql的变量。

另外,在没有使用prepareStatement的两个(或更多)调用的情况下查找方法 在两者之间调用ps.close;

我正在使用Eclipse,文件搜索有一个正则表达式选项。也许这是要走的路? 如果是这样,它会是什么样子?

4 个答案:

答案 0 :(得分:0)

您可以通过使用资源试用来避免手动关闭资源(如果您使用的是至少JDK 7)

try(con=getConnection()){
   try(ps = con.prepareStatement()){
      try(rs=ps.executeQuery()){
         ...
      }
   }
}

任何实现Autoclosable的东西都可以在资源中使用,资源会自动关闭。无需再实施复杂的资源关闭操作。

请参阅Try-with-Resources Tutorial

答案 1 :(得分:0)

您想要做的是一种静态程序分析。由于有专门的工具,您也可以为此特定任务编写自己的工具。 这样,您可以计算包含rs=ps.executeQueryrs.close()的行:

for(File file:sourceFiles) { 
  int openedResultSets = count("rs=ps.executeQuery");
  int closedResultSets = count("rs.close()");
  if (openedResultSets > closedResultSets) {
     log.error(file.getName());
  }
 } 

但它应该更复杂,因为可能不仅在您的项目中使用了此片段。因此,我认为你应该编写一些代码,而不仅仅是一个正则表达式。 虽然在大多数情况下专用工具价格昂贵,但可能一些试用版本对您来说已经足够了。

答案 2 :(得分:0)

Eclipse的最新版本(我使用过Juno [4.2])会在这些行上显示警告:

editor screenshot

您可以在Eclipse首选项中启用此警告:

enter image description here

即使对于较大尺寸的代码库,您也可以过滤此警告的问题视图,以便在代码中找到这些位置。

答案 3 :(得分:0)

FindBugs rules可以找到这个,例如

  • ODR_OPEN_DATABASE_RESOURCE
  • ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH
  • OBL_UNSATISFIED_OBLIGATION
  • 如果您在错误说明
  • 中查找关键字“资源”,请更多

如果您没有专门寻找资源泄漏,而是针对两个或更多名为sql*的变量,您可以write a Checkstyle check找到它们,可能作为LocalVariableNameCheck的子类。这不是一种困难的检查,但需要编码和部署工作。