2017-04-24 2 views
0

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

Répondre

0

PMD n'a actuellement aucun support à utiliser des méthodes d'aide pour fermer les ressources. Même si les méthodes proches peuvent être configurées, elles sont toutes appelées sur la ressource elle-même. Cela pourrait probablement être résolu si PMD faisait du DFA multi-classes, ce qui n'est pas le cas actuellement et ne le sera probablement pas (cela a de grandes implications pour sa capacité à mettre en cache les résultats).

Une solution de contournement améliorée consiste à ajouter un support pour spécifier des méthodes d'assistance proches qui prennent la ressource en tant qu'argument. N'hésitez pas à créer une demande de fonctionnalité sur Github (https://github.com/pmd/pmd); ou encore mieux, soumettre un PR.