gpt4 book ai didi

java - 使用 PMD 识别 java 代码中未关闭的连接

转载 作者:行者123 更新时间:2023-11-30 03:57:30 25 4
gpt4 key购买 nike

为了识别代码中的连接泄漏,我使用 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 关闭了连接,但它给出了 false警报,该连接未关闭。

所以我修改了 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 将包含连接未关闭违规和其他违规的输出。

最佳答案

closeTargets属性也是HashSet<String>types属性(property) CloseResource执行。因此,理想情况下,以下内容应该适合您:

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

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

关于java - 使用 PMD 识别 java 代码中未关闭的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com