Câu trả lời lấy từ diễn đàn oracle, tại đây :
java.security.SecureRandom
là một API tiêu chuẩn do sun cung cấp. Trong số các phương thức khác nhau được cung cấp bởi lớp này void nextBytes(byte[])
.
Phương pháp này được sử dụng để tạo các byte ngẫu nhiên. Trình điều khiển Oracle 11g JDBC sử dụng API này để tạo số ngẫu nhiên trong quá trình đăng nhập. Người dùng sử dụng Linux đã gặp phải SQLException("Io exception: Connection reset")
.
Vấn đề là hai vấn đề:
-
JVM cố gắng liệt kê tất cả các tệp trong / tmp (hoặc thư mục tmp thay thế được đặt bởi -Djava.io.tmpdir) khi
SecureRandom.nextBytes(byte[])
Được gọi. Nếu số lượng tệp lớn, themethod sẽ mất nhiều thời gian để phản hồi và do đó khiến máy chủ hết thời gian chờ -
Phương thức
void nextBytes(byte[])
sử dụng / dev / random trên Linux và trên một số máy thiếu phần cứng tạo số ngẫu nhiên, hoạt động sẽ chậm lại đến mức khiến toàn bộ quá trình đăng nhập phải tạm dừng. Cuối cùng thì người dùng gặp phải SQLException ("Io ngoại lệ:Đặt lại kết nối")
Người dùng nâng cấp lên 11g có thể gặp phải sự cố này nếu hệ điều hành cơ bản là Linux đang chạy trên phần cứng bị lỗi.
Nguyên nhân của việc này vẫn chưa được xác định chính xác. Đó có thể là sự cố trong phần cứng hoặc thực tế là vì lý do nào đó mà phần mềm không thể đọc từ dev/random
một giải pháp dường như thêm cài đặt này vào jvm
-Djava.security.egd=file:/dev/./urandom