【发布时间】: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 会有连接未关闭违例和其他违例的输出。
【问题讨论】:
-
design.xml 是一个很好的例子,如果我们在 SO 上有 nested syntax highlighting 将会受益。 :-)
标签: java jdbc code-analysis pmd