PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres Wyjątki i java

Złap SQLExceptoin następnie użyj SQLException.getSQLState() i porównaj, aby zobaczyć, czy tego chcesz.

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

Zobacz Kody błędów PostgreSQL dla szczegółów SQLState. (Podczas gdy większość kategorii stanów i kodów jest standardowa we wszystkich bazach danych, nie wszystkie DB implementują je w ten sam sposób i wyrzucają je w tym samym czasie, a większość DB ma dodatki, które są specyficzne dla DB).

Nie ma możliwości przechwycenia wyjątku na podstawie SQLState. Musisz go niestety złapać, a jeśli to nie to, co chcesz zapakować i ponownie rzucić. (Nie rzucaj ponownie bez zawijania, tracisz oryginalny stos).

W JDBC 4 istnieją podklasy SQLException jak SQLNonTransientException które można złapać, ale tylko wtedy, gdy sterownik JDBC zgłasza te podklasy. W chwili pisania tego tekstu PgJDBC ich nie obsługuje i zawsze po prostu wyrzuca SQLException , więc jeśli spróbujesz je złapać, nigdy niczego nie złapiesz. (Płatki są mile widziane!).

W prawdziwym świecie zwykle interesuje Cię wiele różnych warunków błędów i chcesz na ich podstawie robić różne rzeczy.

Coś trochę podobnego do nieprzetestowanego, napisanego w oknie:

} 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);
  }
}

... gdzie Twoja aplikacja wie, że musi połączyć się ponownie, jeśli wykryje zerowe połączenie, i zapisuje transakcję, której właśnie próbowała, dzięki czemu może ponowić próbę w pętli, dopóki się nie powiedzie, jeśli dojdzie do zakleszczenia lub niepowodzenia serializacji.

W rzeczywistości byłbyś mądrzejszy, dodając ograniczenie szybkości ponownych prób itp. To tylko uproszczony przykład.

Aby uzyskać więcej informacji, rzutuj wyjątek na PSQLException po przetestowaniu rzutowalności lub przechwyć jako PSQLException na pierwszym miejscu. Następnie uzyskaj szczegółowe informacje za pomocą:

ex.getServerErrorMessage()

co daje ServerErrorMessage ze szczegółowymi polami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy możemy zdefiniować funkcję GROUP_CONCAT w PostgreSQL?

  2. Jak typy dat są obsługiwane przez sterownik JDBC?

  3. Czy istnieje sposób na rzucenie typu danych postgresql 9.3, aby mógł wpływać tylko na jedną stronę?

  4. SpringBoot+Kotlin+Postgres i JSONB:org.hibernate.MappingException:Brak mapowania dialektu dla typu JDBC

  5. Hibernować. PSQLException:zła wartość dla typu int :admin