Разница между Connection.getWarnings () и Statement.getWarnings () в JDBC? - PullRequest
0 голосов
/ 25 февраля 2019

Я не понимаю, в чем разница между Connection.getWarning () и Statement.getWarnings ()?Является ли основное отличие в том, что Connection.getWarning содержит предупреждения для всех операторов, а Statement .getWarnings содержит предупреждения для одного оператора?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Connection.getWarnings возвращает предупреждения на уровне соединения, а Statement.getWarnings возвращает предупреждения на уровне оператора.Существует также ResultSet.getWarnings, который (неожиданно) возвращает предупреждения на уровне набора результатов.Другими словами, если метод, вызванный для Connection, выдает предупреждение, он добавляется в соединение, для метода, вызываемого для Statement в операторе, и для метода ResultSet в наборе результатов.

Как правило, предупреждения, выдаваемые Statement, не должны передаваться на Connection, а предупреждения на ResultSet не должны сообщаться на Statement.См., Например, Statement.getWarnings(), в котором говорится:

Примечание. Если вы обрабатываете объект ResultSet, все предупреждения, связанные с чтениями этого объекта ResultSet, будут связанына нем, а не на Statement объекте, который его создал.

и ResultSet.getWarnings(), который говорит:

Примечание: эта цепочка предупрежденийохватывает только предупреждения, вызванные методами ResultSet.Любое предупреждение, вызванное методами Statement (например, чтение параметров OUT), будет приковано к объекту Statement.

Спецификация JDBC не очень детализирована для предупреждений, она только говорит (* 1037)* JDBC 4.3 , раздел 8.2 SQLWarning):

Когда метод генерирует объект SQLWarning, вызывающему не сообщается, что произошло предупреждение о доступе к данным.Метод getWarnings должен быть вызван на соответствующем объекте для получения объекта SQLWarning.Однако подкласс DataTruncation SQLWarning может быть сгенерирован при некоторых обстоятельствах, для получения более подробной информации см. Раздел 8.3 «Обработка данных» на стр. 8-46.

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

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

и в разделе 8.3 DataTruncation:

Когда происходит усечение данныхпри чтении из источника данных сообщается SQLWarning.

и в разделе 15.1.1 ResultSet Типы :

Если драйвер не поддерживает тип, предоставленный методам createStatement, prepareStatement или prepareCall, он генерирует SQLWarning для Connection объекта, который создает инструкцию.

Подобный текст можно найти в 15.1.2 ResultSet Параллелизм и 15.1.3.1 Определение ResultSet Удерживаемость .

Иногда в документации JDBC API явно упоминаетсяпредупреждения (например, Connection.setClientInfo​(String, String) и ResultSet.next()).

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

0 голосов
/ 25 февраля 2019

Тип объекта, возвращаемый методом getWarnings Connection, Statement, не отличается.Он имеет тип SQLWarning.

Но в зависимости от вызываемого контекста он различается.

  1. Connection.getWarnings будет получать предупреждения, связанные с подключением к базе данных, например, что строка подключения к базе данных не имеетФлаг useSSL (предупреждение зарегистрировано в mysql).
  2. Statement.getWarnings будет извлекать предупреждения, относящиеся к операторам sql, как при выполнении вставки или удаления операторов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...