sql >> Database >  >> RDS >> PostgreSQL

Postgres-uitzonderingen en java

Vang SQLExceptoin gebruik dan SQLException.getSQLState() en vergelijk het om te zien of het is wat je wilt.

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

Zie PostgreSQL-foutcodes voor SQLState-details. (Hoewel de meeste statuscategorieën en codes standaard zijn voor DB's, implementeren niet alle DB's ze op dezelfde manier en gooien ze ze op hetzelfde moment, en de meeste DB's hebben extra's die DB-specifiek zijn).

Er is geen manier om een ​​uitzondering te vangen op basis van de SQLState. Je moet het helaas vangen, en als het niet is wat je wilt, wikkel het dan in en gooi het opnieuw. (Gooi niet zomaar terug zonder in te pakken, je verliest de originele stapel).

In JDBC 4 zijn er subklassen van SQLException zoals SQLNonTransientException die je kunt vangen, maar alleen als het JDBC-stuurprogramma die subklassen gooit. Op het moment van schrijven ondersteunt PgJDBC deze niet, en gooit altijd gewoon SQLException , dus als je ze probeert te vangen, vang je nooit iets. (Patches zijn welkom!).

In de echte wereld ben je meestal geïnteresseerd in een aantal verschillende foutcondities en wil je op basis daarvan verschillende dingen doen.

Iets dat vaag lijkt op het niet-geteste, in het venster geschreven:

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

... waar je app weet dat hij opnieuw verbinding moet maken als hij een null-verbinding ziet, en de transactie bijhoudt die hij zojuist heeft geprobeerd, zodat hij het opnieuw kan proberen in een lus totdat het lukt als het een impasse of een serialisatiefout bereikt.

In werkelijkheid zou je slimmer zijn dan dit, door het toevoegen van snelheidsbeperkende pogingen, enz. Dit is slechts een simplistisch voorbeeld.

Voor meer details, cast de uitzondering naar PSQLException na het testen op castability, of vang het als een PSQLException in de eerste plaats. Krijg dan details met:

ex.getServerErrorMessage()

die je een ServerErrorMessage geeft met gedetailleerde velden.



  1. Maakt SQL Server standaard een niet-geclusterde index op alle kolommen van een tabel?

  2. De standaardwaarden van postgresql.conf wijzigen in Openshift

  3. Informatieschema en primaire sleutels

  4. MySQL/SQL eerste 40 karakters van een tekstveld ophalen?