【问题标题】:Identifying Connection not closed in java code using PMD使用PMD识别Java代码中未关闭的连接
【发布时间】:2015-07-31 03:37:34
【问题描述】:

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

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(), 我们调用一个方法并关闭连接,即 ResourceClosureUtil.closeDBConnection 现在在运行 pmd 时,尽管我已经使用 ResourceClosureUtil.closeDBConnection 关闭了连接,但它给出了一个错误 警报,该连接未关闭。

所以我修改了 design.xml(规则集)如下。更改用 ** 突出显示

<?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 会有连接未关闭违例和其他违例的输出。

【问题讨论】:

标签: java jdbc code-analysis pmd


【解决方案1】:

closeTargets 属性在 CloseResource 实现中也是 HashSet&lt;String&gt; 作为 types 属性。因此,理想情况下,以下内容应该适合您:

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

请注意,我仅在 closeTargets 属性中提供用于关闭资源的方法名称。

【讨论】:

  • 赞成。谢谢。有效。正如你所建议的,我已经修改了我的 design.xml。 。我已经删除了逗号后面的空格。 closetargets 可以有全名,即类名.方法,如果它是一个静态方法调用。在我的例子中,closeDBConnection 是 ResourceClosureUtil 类中的一个静态方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2013-05-30
  • 2014-04-23
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多