sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres Undantag och java

Fånga SQLExceptoin använd sedan SQLException.getSQLSate() och jämför det för att se om det är vad du vill ha.

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

Se PostgreSQL-felkoder för SQLState-detaljer. (Även om de flesta tillståndskategorier och koder är standard över DB:er implementerar inte alla DB dem på samma sätt och kastar dem samtidigt, och de flesta DB:er har extrafunktioner som är DB-specifika).

Det finns inget sätt att fånga ett undantag baserat på SQLState. Du måste, tyvärr, fånga den, och om det inte är vad du vill linda in och kasta om den. (Kasta inte bara om utan att linda, du förlorar originalstacken).

I JDBC 4 finns det underklasser av SQLException som SQLNonTransientException som du kan fånga, men bara om JDBC-drivrutinen kastar dessa underklasser. I skrivande stund stöder inte PgJDBC dessa, och kastar alltid helt enkelt SQLException , så om du försöker fånga dem kommer du aldrig att fånga något. (Plåster är välkomna!).

I den verkliga världen är du vanligtvis intresserad av ett antal olika feltillstånd och vill göra olika saker baserat på dem.

Något vagt som det oprövade, skrivet i fönstret:

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

... där din app vet att återansluta om den ser en nollanslutning och sparar transaktionen den just försökte så att den kan försöka igen i en loop tills den lyckas om den hamnar i ett dödläge eller serialiseringsfel.

I verkligheten skulle du vara smartare än så här, lägga till hastighetsbegränsande för försök, etc. Detta är bara ett förenklat exempel.

För mer information, casta undantaget till PSQLException efter att ha testat för castbarhet, eller fånga det som en PSQLException för det första. Få sedan information med:

ex.getServerErrorMessage()

vilket ger dig en ServerErrorMessage med detaljerade fält.



  1. Hämtar länkad lista i MySQL-databas

  2. MySQL Gruppera efter vecka nummer med flera datum kolumn

  3. C#, MySQL - ödesdigert fel påträffades under kommandoexekvering- Kontrollerade andra lösningar, något jag saknar

  4. Hur man gör genomsnittliga produktrecensioner med activerecord och POSTGRES