PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изключения на Postgres и java

Хванете SQLExceptoin след това използвайте SQLException.getSQLState() и го сравнете, за да видите дали е това, което искате.

catch (SQLException ex) {
   final String ss = ex.getSQLState();
   //... blah blah ...
}

Вижте кодове за грешки на PostgreSQL за подробности за SQLState. (Докато повечето от категориите и кодовете на състоянието са стандартни за DB, не всички DB ги прилагат по един и същи начин и ги хвърлят по едно и също време, а повечето DB имат екстри, които са специфични за DB).

Няма начин да се хване изключение въз основа на SQLState. За съжаление трябва да го хванете и ако не е това, което искате, увийте го и го хвърлете отново. (Не хвърляйте отново без опаковане, губите оригиналния стек).

В JDBC 4 има подкласове на SQLException като SQLNonTransientException които можете да хванете, но само ако JDBC драйверът хвърли тези подкласове. Към момента на писане PgJDBC не ги поддържа и винаги просто хвърля SQLException , така че ако се опитате да ги хванете, никога няма да хванете нищо. (Пачовете са добре дошли!).

В реалния свят обикновено се интересувате от редица различни условия на грешка и искате да правите различни неща въз основа на тях.

Нещо смътно като нетестваното, написано в прозореца:

} catch (SQLException ex) {
  final String ss = ex.getSQLState();
  if (ss.equals("40001") || ss.equals("40P01")) {      
     /* It is a serialization failure or a deadlock abort. Retry the tx. */
     retry_transaction = true;
  } else if (ss.startsWith("08") || ss.startsWith("53")) {
     /* It is a connection error or resource limit. Reconnect and retry. */
     try {
        conn.close();
     } catch (SQLException ex) { 
        logger.log("Error closing suspected bad connection after SQLState " + ss, ex);
     }
     conn = null; /* App knows to reconnect if it sees a null connection */
     retry_transaction = true;
  } else {
     throw new MyAppException(ex);
  }
}

... където приложението ви знае да се свърже отново, ако види нулева връзка, и пази запис на транзакцията, която току-що е опитало, така че да може да я опита отново в цикъл, докато успее, ако попадне в блокиране или неуспешно сериализиране.

В действителност ще бъдете по-умни от това, като добавите ограничаване на скоростта на повторните опити и т.н. Това е само опростен пример.

За повече подробности прехвърлете изключението към PSQLException след тестване за castability или го хванете като PSQLException на първо място. След това получете подробности с:

ex.getServerErrorMessage()

което ви дава ServerErrorMessage с подробни полета.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изчислим сумата от множество колони в PostgreSQL

  2. PostgreSQL:Експортиране на данни от SQL Server 2008 R2 към PostgreSQL 9.5

  3. Извличане на дата (гггг/мм/дд) от времеви печат в PostgreSQL

  4. Настройка на Django:psycopg2.OperationalError:FATAL:Неуспешно удостоверяване на партньор за потребител indivo

  5. Часова зона с лятно часово време в PostgreSQL