PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pengecualian Postgres dan java

Tangkap SQLExceptoin lalu gunakan SQLException.getSQLState() dan bandingkan untuk melihat apakah itu yang Anda inginkan.

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

Lihat Kode kesalahan PostgreSQL untuk detail SQLState. (Meskipun sebagian besar kategori dan kode status adalah standar di seluruh DB, tidak semua DB mengimplementasikannya dengan cara yang sama dan membuangnya pada waktu yang sama, dan sebagian besar DB memiliki tambahan yang khusus untuk DB).

Tidak ada cara untuk menangkap pengecualian berdasarkan SQLState. Sayangnya, Anda harus menangkapnya, dan jika itu bukan yang Anda inginkan, bungkus dan lempar kembali. (Jangan hanya melempar kembali tanpa membungkus, Anda akan kehilangan tumpukan aslinya).

Di JDBC 4 ada subclass dari SQLException seperti SQLNonTransientException yang dapat Anda tangkap, tetapi hanya jika driver JDBC melempar subkelas tersebut. Pada saat penulisan, PgJDBC tidak mendukungnya, dan selalu melempar SQLException , jadi jika Anda mencoba menangkapnya, Anda tidak akan pernah menangkap apa pun. (Tambalan dipersilakan!).

Di dunia nyata, Anda biasanya tertarik pada sejumlah kondisi kesalahan yang berbeda dan ingin melakukan hal yang berbeda berdasarkan kondisi tersebut.

Sesuatu yang samar-samar seperti yang belum teruji, tertulis di jendela:

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

... di mana aplikasi Anda tahu untuk menyambung kembali jika melihat koneksi nol, dan menyimpan catatan transaksi yang baru saja dicoba sehingga dapat mencobanya kembali dalam satu lingkaran hingga berhasil jika menemui jalan buntu atau kegagalan serialisasi.

Pada kenyataannya Anda akan lebih pintar dari ini, menambahkan pembatasan kecepatan percobaan ulang, dll. Ini hanyalah contoh sederhana.

Untuk detail selengkapnya, berikan pengecualian ke PSQLException setelah menguji kemampuan cast, atau tangkap sebagai PSQLException di tempat pertama. Kemudian dapatkan detailnya dengan:

ex.getServerErrorMessage()

yang memberi Anda ServerErrorMessage dengan bidang terperinci.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemantauan Kinerja &Audit PostgreSQL - Sumber Daya Teratas

  2. PostgreSQL:Menggunakan pernyataan AND di LEFT JOIN tidak berfungsi seperti yang diharapkan

  3. Bagaimana make_date() Bekerja di PostgreSQL

  4. Instruksi ilegal:4 saat menjalankan Django

  5. Django OperationalError:tidak dapat memotong proses baru untuk koneksi