sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres Undtagelser og java

Fang SQLExceptoin brug derefter SQLException.getSQLSate() og sammenlign det for at se, om det er det, du vil have.

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

Se PostgreSQL-fejlkoder for SQLState-detaljer. (Selvom de fleste af tilstandskategorierne og -koderne er standard på tværs af DB'er, er det ikke alle DB'er, der implementerer dem på samme måde og kaster dem på samme tidspunkt, og de fleste DB'er har ekstramateriale, der er DB-specifikke).

Der er ingen måde at fange en undtagelse baseret på SQLState. Du skal desværre fange det, og hvis det ikke er det du vil pakke det ind og smid det igen. (Ikke bare genkast uden indpakning, du mister den originale stak).

I JDBC 4 er der underklasser af SQLException som SQLNonTransientException som du kan fange, men kun hvis JDBC-driveren kaster disse underklasser. I skrivende stund understøtter PgJDBC ikke disse, og kaster altid bare SQLException , så hvis du prøver at fange dem, fanger du aldrig noget. (Paches er velkomne!).

I den virkelige verden er du normalt interesseret i en række forskellige fejltilstande og ønsker at gøre forskellige ting baseret på dem.

Noget vagt som det utestede, skrevet-i-vinduet:

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

... hvor din app ved at oprette forbindelse igen, hvis den ser en nulforbindelse, og gemmer en registrering af den transaktion, den lige har forsøgt, så den kan prøve den igen i en løkke, indtil den lykkes, hvis den rammer en dødvande eller serialiseringsfejl.

I virkeligheden ville du være klogere end dette ved at tilføje hastighedsbegrænsning af genforsøg osv. Dette er blot et forenklet eksempel.

For flere detaljer, cast undtagelsen til PSQLException efter test for castability, eller fange det som en PSQLEundtagelse til at begynde med. Så få detaljer med:

ex.getServerErrorMessage()

som giver dig en ServerErrorMessage med detaljerede felter.



  1. bundle mislykkedes - Kan ikke finde PostgreSQL-klientbiblioteket (libpq)

  2. Kompilere PHP 5.1.6 med PDO MySQL

  3. GeoIP-tabel forbindes med tabel over IP'er i MySQL

  4. Hvordan konverterer man en dato fra en Datepicker til Mysql DATETIME-format ved hjælp af java?