бросить исключение зависает управление потоком - PullRequest
1 голос
/ 05 января 2011

Недавно у меня возникла проблема с выдачей исключения в теме JDBC.

Я синхронизировал объект подключения с помощью двух синхронизированных методов: getConnection () и releaseConnection ().Затем другой метод, который удаляет строку из базы данных следующим образом:

public void removeItem(int itemID) throws ItemNotFound {
    PreparedStatement ps = null;
    String query = "DELETE * FROM Student.Book WHERE id = ?";
    getConnection();
    try {
      ps = con.prepareStatement(query);
      ps.setInt(1, bookID);
      ps.executeUpdate();
    } catch (SQLException sqle) {
      this.close(null, null, ps);  // method to close PreparedStatement and ResultSet
      releaseConnection();
      throw new BookNotFoundException("Book not found!");
    } finally {
      this.close(null, null, ps);
      releaseConnection();
    }
}

Все работает хорошо, если не возникает исключение.В случае возникновения исключения в блоке catch после метода releaseConnection () выдается новое BookNotFoundException («Книга не найдена!»).Если я прокомментирую метод releaseConnection (), то он выбрасывает нормально?

Ответы [ 4 ]

5 голосов
/ 05 января 2011

releaseConnection(); как в конечном итоге, так и в вашем улове.Я не думаю, что вы хотите это в вашем блоке улова.

1 голос
/ 05 января 2011

Вы выпускаете дважды.с параметром finally это выглядит так в исключительном случае:

ps = con.prepareStatement(query);      
ps.setInt(1, bookID);      
ps.executeUpdate();
// catch
this.close(null, null, ps);
releaseConnection();     
// finally
this.close(null, null, ps);      
releaseConnection(); 
// exception flow
throw new BookNotFoundException("Book not found!");

, что, вероятно, не то, что вам нужно.

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

1 голос
/ 05 января 2011

Вы освобождаете соединение дважды. Блок finally будет работать всегда , даже если выполняется блок catch. Я предполагаю, что он выполняет throw, затем запускает блок finally, который пытается разорвать соединение во второй раз. Я не уверен, как вы реализовали releaseConnection(), но если это блокирует, когда соединение уже было разорвано, то это объяснит проблему.

Я думаю, что если вы просто удалите close и releaseConnection из блока catch, он будет работать нормально.

0 голосов
/ 05 января 2011

при выдаче исключения метод releaseConnection () вызывается дважды; один раз в обработчике исключений и один раз в окончательном.

Попробуйте вариант этого:

 public void removeItem(int itemID) throws ItemNotFound
    {
        PreparedStatement ps = null;
        String query = "DELETE * FROM Student.Book WHERE id = ?";
        getConnection();
        try
        {
            ps = con.prepareStatement(query);
            ps.setInt(1, bookID);
            ps.executeUpdate();
        }
        catch (SQLException sqle)
        {
            this.close(null, null, ps); // method to close PreparedStatement and
                                                                    // ResultSet
            releaseConnection();
            throw new BookNotFoundException("Book not found!");
        }
        finally
        {
            if (isOpen())
            {
                this.close(null, null, ps);
                releaseConnection();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...