我的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,文件搜索有一个正则表达式选项。也许这是要走的路? 如果是这样,它会是什么样子?
答案 0 :(得分:0)
您可以通过使用资源试用来避免手动关闭资源(如果您使用的是至少JDK 7)
try(con=getConnection()){
try(ps = con.prepareStatement()){
try(rs=ps.executeQuery()){
...
}
}
}
任何实现Autoclosable的东西都可以在资源中使用,资源会自动关闭。无需再实施复杂的资源关闭操作。
答案 1 :(得分:0)
您想要做的是一种静态程序分析。由于有专门的工具,您也可以为此特定任务编写自己的工具。
这样,您可以计算包含rs=ps.executeQuery
和rs.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])会在这些行上显示警告:
您可以在Eclipse首选项中启用此警告:
即使对于较大尺寸的代码库,您也可以过滤此警告的问题视图,以便在代码中找到这些位置。
答案 3 :(得分:0)
有FindBugs rules可以找到这个,例如
如果您没有专门寻找资源泄漏,而是针对两个或更多名为sql*
的变量,您可以write a Checkstyle check找到它们,可能作为LocalVariableNameCheck的子类。这不是一种困难的检查,但需要编码和部署工作。