为了识别代码中的连接泄漏,我使用了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会产生连接未关闭违例和其他违规的输出。
design.xml是一个很好的示例,如果我们在SO上有[嵌套语法高亮显示](http://meta.stackexchange.com/q/203205/205238),将会有所帮助。 :-) –