Различие между исключением драйвера JDBC и исключением базы данных

В этом руководстве по Jdbc говорится следующее:

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

В том же учебнике также говорится:

getSQLState(): получает строку XOPEN SQLstate. В случае ошибки драйвера JDBC этот метод не возвращает никакой полезной информации. Для ошибки базы данных возвращается пятизначный код XOPEN SQLstate. Этот метод может возвращать значение null.

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

Я просматривал документы Oracle для SQLException class и учебник по jdbc oracle, в котором говорится следующее о Код SQLState

Код SQLState: эти коды и их соответствующие значения были стандартизированы ISO/ANSI и Open Group (X/Open), хотя некоторые коды зарезервированы для поставщиков баз данных, которые они могут определять сами. Этот объект String состоит из пяти буквенно-цифровых символов. Получите этот код, вызвав метод SQLException.getSQLState.

и о коде ошибки

Код ошибки: это целочисленное значение, определяющее ошибку, вызвавшую создание экземпляра SQLException. Его значение и смысл зависят от реализации и могут быть фактическим кодом ошибки, возвращаемым базовым источником данных. Получите ошибку, вызвав метод SQLException.getErrorCode.

Из этих двух кажется, что код SQLState был бы лучшим кандидатом для различения исключения драйвера и базы данных.

Чтобы различать исключение Diver и исключение базы данных, предложение catch будет работать следующим образом:

   catch (SQLException se) 
   {   
       if(se.getSQLState() != null) 
       {
         System.out.println("Exception occured in the database");

         System.out.println("Database's native Error Code:"+se.getErrorCode());

         try
         {
            if(conn.getMetaData().getSQLStateType() == 1)
            {
                System.out.println("Open Group Error Code : "+ se.getSQLState());
            }
            else if(conn.getMetaData().getSQLStateType() == 2) 
            {
                System.out.println("SQL99 Error Code : "+ se.getSQLState());                    
            }
            else
            {
                System.out.println("Database vendor reserved Code : "+ se.getSQLState());                   
            }
         }  
         catch (SQLException e) 
         {
            e.printStackTrace();
         }
       }
       else 
       {
           System.out.println("Exception occured in the databse driver");

           System.out.println("Datasbe Driver Error Code:"+se.getErrorCode());
       }

       // ***  Code for cleaning up database resources would go here ***
   }

person Chiseled    schedule 31.10.2014    source источник
comment
Итак, официальное руководство говорит об обратном: Когда JDBC обнаруживает ошибку во время взаимодействия с источником данных, он выдает экземпляр SQLException. Таким образом, любое исключение SQLException указывает на то, что с базой данных что-то пошло не так. С точки зрения приложения на самом деле не имеет значения, была ли проблема в драйвере (что бы вы ни думали) или в базе данных.   -  person a_horse_with_no_name    schedule 01.11.2014
comment
В случае ошибки драйвера JDBC этот метод не возвращает никакой полезной информации. просто неверен. В книге SQL CLI задокументирован ряд кодов SQLstate, которые применяются к интерфейсам уровня вызовов (таким как JDBC), а поставщики и драйверы даже могут определять свои собственные состояния sql.   -  person Mark Rotteveel    schedule 01.11.2014


Ответы (1)


Похоже, SQLException может возникнуть как в драйвере, так и в базе данных.

No.

Только драйвер может генерировать SQLException. Это происходит в ответ на ошибку, выдаваемую базой данных. Часть функции драйвера состоит в том, чтобы сопоставить их с SQLExceptions.

Вам следует использовать руководство Oracle JDBC, а не произвольный интернет-мусор. В официальном руководстве говорится следующее: «Когда JDBC обнаруживает ошибку во время взаимодействия с источником данных, он выдает экземпляр SQLException» [курсив мой].

person user207421    schedule 01.11.2014
comment
Я основываюсь на этом руководстве по jdbc: tutorialspoint.com/jdbc/jdbc-exceptions.htm › Я также обновил сообщение, чтобы отразить это. - person Chiseled; 01.11.2014
comment
Ваш источник неверен. База данных почти наверняка написана не на Java и поэтому вообще не может генерировать исключения Java. Смотрите мою правку. - person user207421; 02.11.2014