Sonar: “Close this PreparedStatement”

后端 未结 2 864
情书的邮戳
情书的邮戳 2021-01-22 02:30

Why is SonarQube plugin for Jenkins complaining about the open statement if I close it in the finally block?

(I need to validate database connections in a separate funct

2条回答
  •  醉酒成梦
    2021-01-22 03:17

    I've refactored my code in this way as suggested by @TT and sonar stopped complaining.

    public boolean validateConnection(Connection conn) {
    
        LOGGER.log( LogEntries.PingConn );
    
        try{
    
            if(conn == null){
                LOGGER.log( LogEntries.PingError, "Null connection on PING. Reached max # of connections or network issue. Stats: "+getCacheStatistics() );
                return false;
            }
    
            if(conn.isClosed()){
                LOGGER.log( LogEntries.PingError, "Found closed connection during validation PING." );
                return false;   
            } 
    
            try( PreparedStatement statement = conn.prepareStatement( PING ) ){
    
                 statement.setQueryTimeout(QUERY_TIMEOUT);
    
                 try( ResultSet rs = statement.executeQuery() ){
    
                    if ( rs != null && rs.next() ) {
                        return true;
                    }
                }
            }
    
        }catch(Exception ex){
            LOGGER.log( LogEntries.PingError, ex );
        }
    
        return false;
    }
    

    Without "try-with-resource" the code could be refactored in the following way but in this case Sonar still complains:

    public boolean validateConnection(Connection conn) {
    
        LOGGER.log( LogEntries.PingConn );
    
        PreparedStatement statement = null;
        ResultSet rs = null;
        try{
    
            if(conn == null){
                LOGGER.log( LogEntries.PingError, "Null connection on PING. Reached max # of connections or network issue. Stats: "+getCacheStatistics() );
                return false;
            }
    
            if(conn.isClosed()){
                LOGGER.log( LogEntries.PingError, "Found closed connection during validation PING." );
                return false;   
            } 
    
            statement = conn.prepareStatement( PING );
            statement.setQueryTimeout( QUERY_TIMEOUT );
            rs = statement.executeQuery();
    
            if ( rs != null && rs.next() ) {
                return true;
            }
    
        }catch(Exception ex){
            LOGGER.log( LogEntries.PingError, ex );
        }finally{
            try {
                if(rs!=null){
                    rs.close();
                }
            } catch (SQLException eClosing1) {
                LOGGER.log( LogEntries.PingError, eClosing1 );
            }finally{
                try {
                    if(statement!=null){
                        statement.close();
                    }
                }catch (SQLException eClosing2) {
                    LOGGER.log( LogEntries.PingError, eClosing2 );
                }   
            }
         }
    
        return false;
    }
    

提交回复
热议问题