Fortify: не удается освободить ресурс базы данных - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь увидеть уязвимость моего кода с помощью fortify.В отчете говорится, что у меня есть проблема, в которой говорится, что «иногда функция не может освободить выделенный ресурс базы данных».Вот код и в какой строке указана проблема.Я пытался закрыть соединение в блоке finally, но это не решило проблему.Как это исправить?

private AnotherService anotherService;

private void create() {
    Connection conn = null;
    try {
        conn = getCon(); // With fortify, there's an issue which said "the function sometimes fails to release a database resource allocated by", and it refers to this line
        conn.setAutoCommit(false);
        anotherService.myFunction(conn);
        // the conn.commit() is inside anotherService, because I have to make one connection
        // rest of code

    } catch (Exception e) {
        e.printStackTrace;
        if (null != conn) {
            conn.rollback();
        }
    } finally {
        if (null != conn) {
            conn.close();
        }
    }
}

private static Connection getCon() {
    Connection connection = null;
        try {
            Class.forName("org.postgresql.Driver");
            connection = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/dbname",
                    "username",
                    "password");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    return connection;
}

Дополнение: Если я использую try-with-resource (например, try (Connection conn = getCon()), чтобы автоматически закрывать вещи, как я могу вызвать conn.rollback () в блоке catchпроизошло ли какое-либо исключение?Поскольку переменная conn объявлена ​​внутри try-with-resources.

1 Ответ

0 голосов
/ 15 декабря 2018

Что ж, я решаю свою проблему, метод close должен вызываться внутри try-catch в блоке finally, как упомянуто в этой ссылке .

В случае, если ссылка не работает, здеськод, который я использую для решения своей проблемы:

Statement stmt = null;
ResultSet rs = null;
Connection conn = getConnection();
try {
  stmt = conn.createStatement();
  rs = stmt.executeQuery(sqlQuery);
  processResults(rs);
} catch (SQLException e) {
  // Forward to handler
} finally {
  try {
    if (rs != null) {rs.close();}
  } catch (SQLException e) {
    // Forward to handler
  } finally {
    try {
      if (stmt != null) {stmt.close();}
    } catch (SQLException e) {
      // Forward to handler
    } finally {
      try {
        if (conn != null) {conn.close();}
      } catch (SQLException e) {
        // Forward to handler
      }
    }
  }
}
...