2014-04-02 36 views
1

为了识别代码中的连接泄漏,我使用了PMD。 现在使用PMD,它将识别所有收集泄漏,并显示以下错误(如果未找到connection.close())。识别连接未在使用PMD的java代码中关闭

C:\raghu\Harmony\branch\GlobalSKUPhase1A\source\Java\DataLoadServiceApp\src\dell\harmony\data\JdoServer.java:861: Ensure that resources like this Connection object are closed after use 

然而,与我们的项目代码,我们还可以使用,而不是使用connection.close()时, 我们调用的方法和关闭连接IE)ResourceClosureUtil.closeDBConnection 现在虽然很多定制的连接关闭,即)正在运行pmd,尽管我已经使用ResourceClosureUtil.closeDBConnection关闭了连接,但它提供了一个错误的 警报,该连接未关闭。

所以我修改了design.xml(ruleset),如下所示。变化是强调了与**

<?xml version="1.0"?> 

<ruleset name="Design" 
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> 

    <description> 
The Design ruleset contains rules that flag suboptimal code implementations. Alternate approaches 
are suggested. 
    </description> 

    <rule name="CloseResource" 
      since="1.2.2" 
     message="Ensure that resources like this {0} object are closed after use" 
     class="net.sourceforge.pmd.lang.java.rule.design.CloseResourceRule" 
      externalInfoUrl="http://pmd.sourceforge.net/pmd-5.0.5/rules/java/design.html#CloseResource"> 
    <description> 
Ensure that resources (like Connection, Statement, and ResultSet objects) are always closed after use. 
    </description> 
    <priority>3</priority> 
    <properties> 
    <property name="types" value="Connection,Statement,ResultSet"/> 
     **<property name="closeTargets" value="ResourceClosureUtil.closeDBConnection"/>** 
    </properties> 
    <example> 
<![CDATA[ 
public class Bar { 
    public void foo() { 
    Connection c = pool.getConnection(); 
    try { 
     // do stuff 
    } catch (SQLException ex) { 
    // handle exception 
    } finally { 
     // oops, should close the connection using 'close'! 
     // c.close(); 
    } 
    } 
} 
]]> 
    </example> 
    </rule> 

</ruleset> 

现在这种变化也没有给予任何虚假报警功能,当连接与ResourceClosureUtil.closeDBConnection关闭。

现在我们有很多自定义的关闭方法,比如“ClosureUtil.closeConnection”,“Resource.close”,如何用这些方法停止虚警的 ?为了解决,我修改了closeTargets属性来包含所有这些方法。变化强调了与**

<property name="types" value="Connection,Statement,ResultSet"/> 
    **<property name="closeTargets" value="ResourceClosureUtil.closeDBConnection"/> 
    <property name="closeTargets" value="ClosureUtil.closeConnection"/> 
    <property name="closeTargets" value="Resource.close"/>** 
</properties> 

<property name="types" value="Connection,Statement,ResultSet"/> 
    <property name="closeTargets" 
     value="ResourceClosureUtil.closeDBConnection,ClosureUtil.closeConnection,Resource.close"/> 
</properties> 

但预期它不工作。它仍在发出虚惊。当我有一个自定义的闭包方法,它不会发出虚惊,但是当我有很多这样的方法,它不工作,当我在closetargets属性中包含所有这些方法。

我不想看到任何这些自定义连接关闭(例如ResourceClosureUtil.closeDBConnection,ClosureUtil.closeConnection,Resource.close)的任何虚警。 如何用PMD解决这个问题(虚警:多重连接关闭)? 如何更改为closetargets属性以包含多个方法?

仅供参考:我从命令提示符运行它,以确定连接泄漏。

pmd -d C:\raghu\Harmony\branch\GlobalSKUPhase1A\source\Java\DataLoadServiceApp\src -f text 
-R rulesets/java/unusedcode.xml,rulesets/java/controversial.xml,rulesets/java/basic.xml,rulesets/java/strings.xml,rulesets/java/design.xml,rulesets/java/naming.xml,rulesets/java/finalizers.xml,rulesets/java/braces.xml,rulesets/java/clone.xml,rulesets/java/codesize.xml,rulesets/java/imports.xml,rulesets/java/javabeans.xml,rulesets/java/logging-jakarta-commons.xml,rulesets/java/logging-java.xml,rulesets/java/migrating.xml,rulesets/java/optimizations.xml,rulesets/java/strictexception.xml,rulesets/java/sunsecure.xml,rulesets/java/coupling.xml > allexceptions.txt 

command: pmd -d codesource -f output -R Ruleset > allexception.txt 

allexception.txt会产生连接未关闭违例和其他违规的输出。

+0

design.xml是一个很好的示例,如果我们在SO上有[嵌套语法高亮显示](http://meta.stackexchange.com/q/203205/205238),将会有所帮助。 :-) –

回答

2

closeTargets属性也是HashSet<String>作为types财产CloseResource执行。因此,理想情况下面应该为你工作:

<properties> 
    <property name="types" value="Connection,Statement,ResultSet"/> 
    <property name="closeTargets" value="closeDBConnection, closeConnection, close"/> 
</properties> 

请注意,我只是在其中用于关闭资源closeTargets物业提供的方法名。

+1

upvoted。谢谢。有效。正如你所建议的,我修改了我的design.xml。 。我已经删除逗号后的空格。 closetargets可以具有fullname即)classname.method,如果它是静态方法调用。在我的情况下,closeDBConnection是ResourceClosureUtil类中的静态方法。 – Raghu