J'essaye d'utiliser maven pmd plugin pour détecter toutes les fuites de connexion à travers le projet. Nous fermons la connexion en utilisant BaseSqlUtl.close, donc de toute façon si nous pouvons utiliser PMD pour trouver que quiconque a ouvert une connexion a utilisé cette méthode pour fermer, nous pouvons détecter les fuites de connexion. Comme nous utilisons des classes personnalisées pour la fermeture de la connexion, j'ai créé un ensemble de règles modifiées avec ** dans le ruleset.xml suivant.Détection de la connexion non fermée dans le code java en utilisant PMD maven
<?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="closeStatementQuietly,closeResultSetQuietly,commitAndCloseQuietly,rollbackAndCloseQuietly,closeQuietly,sqlUtil.closeQuietly,resetAndCloseQuietly"/>**
</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>
Maintenant, cela fonctionne très bien pour les méthodes unparametrised comme commitAndCloseQuietly() mais malheureusement pour les autres méthodes qui accepte la connexion en tant que paramètre comme « sqlUtil.closeQuietly (connexion) », ses fausses alarmes donnant.
J'ai essayé se référant à la même question posée mais ne pouvait pas être d'aide sur ce scénario spécifique: Identifying Connection not closed in java code using PMD