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.