Нестабильное соединение с Oracle Database для Java-проекта - PullRequest
0 голосов
/ 10 июня 2018

Я студент, и одним из наших заданий является создание веб-проекта на Java на локальном веб-сервере GlassFish 5.База данных, используемая для этого проекта - OracleDB, работающая локально в контейнере Docker.

Я почти закончил свой проект, но некоторые страницы продолжают падать (NullPointerException).Я должен получить записи базы данных и сохранить их в ArrayList.Но иногда SQLConnection ничего не возвращает (но записи действительно существуют), и мой код пытается предварительно выполнить действия для этого пустого ArrayList.

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

Это действительно расстраивает, и я не могу продолжать работать над этим проектом без стабильного соединения с базой данных.Поэтому я был бы признателен людям, у которых есть опыт: -)

Спасибо, что уделили время.

Код для выполнения запроса:

protected ResultSet getRecords(String query) {
        try {
            Connection connection = DriverManager.getConnection(url, login, password);
            Statement statement = connection.createStatement();
            return (ResultSet) statement.executeQuery(query);
        } catch (SQLException e) {
            e.getStackTrace();
        } 
        return null;
    }

Код сзапрос:

List<Uitlening> uitleningen = new ArrayList<Uitlening>();

        try {
            ResultSet resultSet = getRecords("SELECT * FROM uitlening");

            while(resultSet.next()) { //Here the code crashes because the ResultSet can sometimes be empty.

Я думаю, что это фактическое сообщение об ошибке: слушатель отклонил соединение со следующей ошибкой: ORA-12519, TNS: не найден соответствующий обработчик службы

Но я нене совсем понимаю, что мне теперь делать ..

 try {
        ResultSet resultSet = getRecords("SELECT * FROM uitlening");

        while(resultSet.next()) { 
            Uitlening uitlening = new Uitlening();
            uitlening.setNr(resultSet.getInt("nr"));                
            uitleningen.add(uitlening);
        }
    } catch (SQLException e) {
        e.addSuppressed(e);
    } 
    return uitleningen;

Это может быть ничто, но похоже, что ошибка возникает только тогда, когда я запускаю 2 запроса почти сразу после друг друга.Возможно ли, что закрытие соединения займет некоторое время?

1 Ответ

0 голосов
/ 10 июня 2018

Скорее всего, вы столкнетесь с проблемой соединения с базой данных, поскольку ваш код неправильно закрывает соединения с базой данных, а также операторы и наборы результатов.

Оператор также закроет свой активный набор результатов.Большинство JDBC также закроет оператор, если соединение закрыто.

Таким образом, закрытие соединения является наиболее важной частью.Это не может быть достигнуто с вашей текущей структурой кода, потому что вы создаете его во внутреннем методе и не возвращаете его.

Также было упомянуто, что обработка исключений плохая, потому что вы игнорируете исключения и возвращаете null вместо этого вызывает, по-видимому, несвязанные сбои позже.Во многих случаях может быть проще объявить, что метод выдает SQLException.

Возможно, вы захотите изменить свой код следующим образом:

List<Uitlening> retrieveData() {
    final String query = "SELECT * FROM uitlening";
    try (Connection connection = DriverManager.getConnection(url, login, password);
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery(query)) {
        return processResultSet(resultSet);
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
}

List<Uitlening> processResultSet(ResultSet resultSet) throws SQLException {
    List<Uitlening> uitleningen = new ArrayList<>();
    while (resultSet.next()) {
        Uitlening uitlening = new Uitlening();
        uitlening.setNr(resultSet.getInt("nr"));
        uitleningen.add(uitlening);
    }
    return uitleningen;
}

Он закрывает соединение, оператор инабор результатов с использованием блоков try / catch, которые используют AutoClosable s (в данном случае: Connection, Statement, ResultSet).

Метод processResultSet объявляет SQLException поэтому он не должен обрабатывать его.

Код переупорядочен, поэтому данные полностью обрабатываются, прежде чем код покидает блок try / catch, закрывающий соединение.

...