Когда вызывать getWarnings () для соединений, операторов и ResultSets с JDBC? - PullRequest
6 голосов
/ 22 июня 2011

В JDBC типы Connection, Statement и ResultSet имеют метод getWarnings(), который указывается для создания первого предупреждения, связанного с объектами этого типа.Второе и последующие предупреждения, если они существуют, связаны с первым предупреждением (если оно даже существует, null генерируется, если нет предупреждений).

Спецификации говорят, чтопредупреждения, связанные с объектами этих типов, очищаются после определенных действий.Например, предупреждения о ResultSet сбрасываются при чтении каждой новой строки.

Тип SQLWarning является подтипом SQLException.Так будет ли наличие предупреждения указываться исключением?И это исключение будет приковано к связанному объекту, если тип времени выполнения исключения SQLWarning?

Что мне интересно, так это, и это может зависеть от драйвера, как узнать, когда ядолжен вызывать getWarnings() и ожидать не null ответа? Другими словами, присутствует ли предупреждение для объекта JDBC и доступно с getWarnings() только после того, как этот объект вызвал исключение?(а это исключение является предупреждением?)

Должен ли я вызывать getWarnings() для поиска предупреждений после каждой операции JDBC, «просто чтобы быть уверенным», если моя цель - соблюдать каждое предупреждение?

Ответы [ 3 ]

7 голосов
/ 22 июня 2011

SQLWarning объекты являются подклассом SQLException, которые имеют дело с предупреждениями о доступе к базе данных.

Предупреждения не останавливают выполнение приложения, как делают исключения;они просто предупреждают пользователя о том, что что-то произошло не так, как планировалось.

Предупреждение может быть получено для объекта Connection, объекта Statement (включая объекты PreparedStatement и CallableStatement) илиResultSet object.

Каждый из этих классов имеет метод getWarnings, который необходимо вызвать, чтобы увидеть первое предупреждение о вызывающем объекте:

SQLWarning warning = stmt.getWarnings();
if (warning != null)
{
    System.out.println(\"n---Warning---n\");
    while (warning != null)
    {
        System.out.println(\"Message: \" + warning.getMessage());
        System.out.println(\"SQLState: \" + warning.getSQLState());
        System.out.print(\"Vendor error code: \");
        System.out.println(warning.getErrorCode());
        System.out.println(\"\");
        warning = warning.getNextWarning();
    }
}
4 голосов
/ 22 июня 2011

С другой стороны, вы должны явно проверять любые предупреждения SQL, потому что они не распространяются через стандартные механизмы обработки исключений.Для этого вызовите соответствующий метод getWarnings для соответствующего объекта JDBC.

[ссылка]

Честно говоря, я никогда не обнаруживал, что проверяю предупрежденияКогда-либо.Может быть, я никогда не делал ничего серьезного.

3 голосов
/ 22 июня 2011

Да, вам нужно явно получать предупреждения, если вы действительно хотите соблюдать каждое предупреждение.Но зачем вам это делать?

В качестве альтернативы Spring JdbcTemplate дает вам возможность регистрировать предупреждения или выдавать исключение SQLWarningException при наличии предупреждений.Поведение по умолчанию состоит в том, чтобы регистрировать предупреждения, потому что, ну, они являются предупреждениями.Надеюсь, этого достаточно и для ваших целей.

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