Сонар просит «Использовать try-with-resources или закрыть это« Соединение »в предложении« finally ». - PullRequest
1 голос
/ 28 января 2020

Я хочу иметь чистый проект. Поэтому я использовал Sonar для обнаружения потенциальных дефектов, ...

В приведенном ниже методе Sonar просит: Use try-with-resources or close this "Connection" in a "finally" clause..

private Connection createConnection() throws JMSException {
    MQConnectionFactory mqCF = new MQConnectionFactory();
    ...

    Connection connection = mqCF.createConnection(...);
    connection.start();

    return connection;
}

Можете ли вы объяснить мне, что я сделал неправильно и как сделать, чтобы избежать сонара сообщение? Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 января 2020

Connection реализует AutoCloseable, который обнаруживает Sonar (не имеет значения, используете ли вы соединение или какую-либо другую автоматически закрывающуюся вещь).

Не закрытие такого ресурса может привести к утечка ресурсов, поэтому Sonar хочет, чтобы вы сделали что-то вроде этого:

//try-with-resources - the connection will be closed after this block
try(Connection connection = mqCF.createConnection(...)) {
  //use connection here
}

//traditional try - the connection will be closed after the finally block
Connection connection = mqCF.createConnection(...);
try {
  //use connection here
} finally {
   connection.close();
}

Проблема в вашем случае заключается в том, что вы просто создаете соединение, а затем возвращаете его - и я сильно подозреваю, что вы хотите оставить его открытым :)

Сонар не может быть уверен, что вы когда-нибудь закроете соединение, поэтому он будет жаловаться. Могут быть способы заставить Сонар игнорировать подобные вещи (я не пользуюсь им так часто, поэтому я не слишком знаком с опциями здесь), но это все еще потенциальный риск, который вам придется как-то смягчить.

1 голос
/ 28 января 2020

В java, если вы используете ресурс типа FileInptStream, Connection, ResultSet, Input/OutputStream, BufferedReader, PrintWriter, вы должны закрыть его до того, как произойдет сборка мусора. поэтому, в основном, когда объект соединения больше не используется, вы должны закрыть его.

попробуйте ниже фрагмента

Connection c = null;
    try {
        c = mqCF.createConnection(...);
        // do something
    } catch(SomeException e) {
        // log exception
    } finally {
        if(c != null)
           c.close();
    }

//try-with-resources
try(Connection connection = mqCF.createConnection(...)) {
  //use connection here
}

При попытке с ресурсом соединение автоматически закроется через jvm, но интерфейс соединения должен быть расширен с AutoCloseable / Closable интерфейсом.

1 голос
/ 28 января 2020

Приведенный выше код может оставить объект Connection открытым, что может вызвать серьезные проблемы.

Вы можете гарантировать, что Connection закроется, когда закончите с ним в несколько способов:

public Connection createConnection() {
    return connectionFactory.createConnection(...);  // note that this method does not open the connection
}

Затем, когда вы хотите использовать соединение, либо используйте try-catch-finally :

try {
    Connection c = createConnection();
    doSomethingWithPossibleException(c);
} catch(PossibleException e) {
    handleException(e);
} finally {
    // now close the connection
    c.close();
}

, либо вы можете использовать try-with-resources (от Java 7 и далее):

try (Connection c = getConnection()) {
    doSomethingWithPossibleException(c);
} catch (PossibleException e) {
    handle(e);
}

IMO try-with-resources немного более читабелен, хотя вкусы в этом вопросе разные. Обратите внимание, что объект, который вы создаете в try-with-resources , должен реализовывать интерфейс AutoCloseable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...