2017-05-24 2 views
0

In unserem Code haben wir die Ergebnissätze in Endblock geschlossen noch zeigt das Sonar, dass es nie geschlossen ist. Bitte helfen Sie. Hier haben wir eine Verbindung mit Spring Datenquellen utils erstellt und die gleichen haben die Verbindungen zum Pool freigegeben.Resultset ist nie geschlossen - Sonarqube Analyse

try { 
    con = DataSourceUtils.getConnection(dataSource); // connection to database using spring 
    stmt = con.createStatement(); 
    rs = stmt.executeQuery("<>"); 
    . 
    . 
} 
catch (Exception e) { 
} 
finally { 
    if (stmt != null && !stmt.isClosed()) { 
    stmt.close(); 
    } 
    if (rs != null && !rs.isClosed()) { 
    rs.close(); 
    } 
    if (con != null) { 
    DataSourceUtils.releaseConnection(con, dataSource); 
    } 
} 
+2

Angesichts des Konstrukts, das Sie gezeigt haben, könnten Sie zu einem 'versuchen mit Ressourcen'-Ansatz konvertieren, dann könnten Sie loswerden, die schließlich blockieren (na ja, meistens). – KevinO

+0

Vertrauen Sie nicht SonarQube; es ist oft falsch und manchmal einfach falsch. – DavidW

+0

Danke Kevin ...! Ab jetzt kann ich diese Option nicht benutzen ...! Ich habe die Lösung gefunden und habe sie unten angegeben !!! es war wirklich schwer zu knacken, was Sonar denkt –

Antwort

1

sollten Sie verwenden die Try-with-Ressource-Anweisung, um Ihren Code Cleanup und richtigen Umgang mit Ressourcen sicherzustellen:

try (final Connection con = DataSourceUtils.getConnection(dataSource); // connection to database using spring 
    final Statement stmt = con.createStatement(); 
    final ResultSet rs = stmt.executeQuery("<>");) { 
    ... 
} catch (Exception e) { 
    // handle Exceptions here 
} 
+0

Danke DPR ... Das war die richtige Option. Aber der Kunde ist nicht bereit, es zu ändern, da es einen etwas größeren Testumfang beinhalten könnte. –

2

Es ist möglich, für

stmt.close(); 

eine SQLException zu werfen. Wenn das passiert, wird

rs.close(); 

wird nie ausgeführt werden. Wie von anderen vorgeschlagen, sollten Sie die Verwendung von try with resource in Betracht ziehen.

0

Endlich fand ich den Grund, warum Sonar den Fehler wirft, obwohl wir die Ressourcen geschlossen haben.

Das Sonar erwartet, dass jede Ressource separat in einem separaten try catch geschlossen wird. Der Grund für sis ist, dass wenn andere Ressourcen geschlossen werden, andere möglicherweise offen bleiben.

Wie diese

finally{ 
try{ 
if(resultset!=null){ 
resultset.close(); 
} 
catch(SQLException e){ 
--- 
--- 
} 
if(connection!=null){ 
connection.close(); 
} 
catch(SQLException e){ 
--- 
--- 
} 
} 

Auch in dem obigen Code, fügen Sie bitte logger.error in Ausnahme eines weiteren Fehler von Sonar zu vermeiden !! ! :) logger.error("", e);

Verwandte Themen