PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Ngoại lệ Postgres và java

Bắt SQLExceptoin sau đó sử dụng SQLException.getSQLState() và so sánh xem đó có phải là thứ bạn muốn không.

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

Xem Mã lỗi PostgreSQL để biết thông tin chi tiết về SQLState. (Mặc dù hầu hết các danh mục và mã trạng thái là tiêu chuẩn trên các DB nhưng không phải tất cả các DB đều triển khai chúng theo cách giống nhau và ném chúng vào cùng một thời điểm và hầu hết các DB đều có các tính năng bổ sung dành riêng cho DB).

Không có cách nào để bắt một ngoại lệ dựa trên SQLState. Thật không may, bạn phải nắm bắt nó, và nếu nó không phải là thứ bạn muốn, hãy bọc và ném lại nó. (Đừng chỉ ném lại mà không gói, bạn sẽ mất ngăn xếp ban đầu).

Trong JDBC 4 có các lớp con của SQLException như SQLNonTransientException mà bạn có thể nắm bắt, nhưng chỉ khi trình điều khiển JDBC ném các lớp con đó. Tại thời điểm viết bài, PgJDBC không hỗ trợ những thứ đó và luôn chỉ cần ném SQLException , vì vậy nếu bạn cố gắng bắt chúng, bạn sẽ không bao giờ bắt được bất cứ thứ gì. (Các bản vá được chào đón!).

Trong thế giới thực, bạn thường quan tâm đến một số điều kiện lỗi khác nhau và muốn thực hiện những điều khác nhau dựa trên chúng.

Một cái gì đó mơ hồ giống như một cái gì đó chưa được kiểm tra, được viết trong cửa sổ:

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

... nơi ứng dụng của bạn biết để kết nối lại nếu thấy kết nối rỗng và lưu bản ghi về giao dịch mà ứng dụng vừa thực hiện để ứng dụng có thể thử lại trong vòng lặp cho đến khi thành công nếu gặp sự cố bế tắc hoặc thất bại tuần tự.

Trong thực tế, bạn sẽ thông minh hơn điều này, thêm giới hạn tỷ lệ số lần thử lại, v.v. Đây chỉ là một ví dụ đơn giản.

Để biết thêm chi tiết, hãy bỏ ngoại lệ cho PSQLException sau khi kiểm tra khả năng truyền hoặc bắt nó dưới dạng PSQLException ngay từ đầu. Sau đó, nhận thông tin chi tiết với:

ex.getServerErrorMessage()

cung cấp cho bạn một ServerErrorMessage với các trường chi tiết.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Docker &Postgres:Không liên kết được địa chỉ tcp 0.0.0.0:5432 đã được sử dụng

  2. Postgresql trích xuất hàng cuối cùng cho mỗi id

  3. PostgreSQL:giữa với datetime

  4. Sử dụng phép nối để kết hợp dữ liệu từ các bảng khác nhau trong PostgreSQL

  5. Làm cách nào để nhập tệp .sql vào cơ sở dữ liệu Heroku postgres của tôi?