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

Sự cố kết nối gián đoạn Oracle JDBC

Có một giải pháp được cung cấp cho vấn đề này trong một số diễn đàn OTN (https://kr.forums.oracle.com/forums/thread.jspa?messageID=3699989). Nhưng, nguyên nhân gốc rễ của vấn đề vẫn chưa được giải thích. Sau đây là nỗ lực của tôi để giải thích nguyên nhân gốc rễ của vấn đề.

Trình điều khiển Oracle JDBC giao tiếp với máy chủ Oracle một cách an toàn. Trình điều khiển sử dụng java.security.SecureRandom lớp để thu thập entropy để đảm bảo thông tin liên lạc. Lớp này dựa trên sự hỗ trợ của nền tảng gốc để thu thập entropy.

Entropy là tính ngẫu nhiên được thu thập / tạo ra bởi một hệ điều hành hoặc ứng dụng để sử dụng trong mật mã hoặc các mục đích sử dụng khác yêu cầu dữ liệu ngẫu nhiên. Tính ngẫu nhiên này thường được thu thập từ các nguồn phần cứng, hoặc từ tiếng ồn phần cứng, dữ liệu âm thanh, chuyển động của chuột hoặc các bộ tạo ngẫu nhiên được cung cấp đặc biệt. Kernel thu thập entropy và lưu trữ nó là một nhóm entropy và làm cho dữ liệu ký tự ngẫu nhiên có sẵn cho các quy trình hoặc ứng dụng của hệ điều hành thông qua các tệp đặc biệt / dev / random / dev / urandom .

Đọc từ / dev / random rút cạn nhóm entropy với số lượng bit / byte được yêu cầu, cung cấp mức độ ngẫu nhiên cao thường được mong muốn trong các hoạt động mật mã. Trong trường hợp, nếu nhóm entropy đã cạn hoàn toàn và không có đủ entropy, thì thao tác đọc trên / dev / random khối cho đến khi tập hợp thêm entropy. Do đó, các ứng dụng đọc từ / dev / random có thể chặn trong một số khoảng thời gian ngẫu nhiên.

Ngược lại với phần trên, đọc từ / dev / urandom không chặn. Đọc từ / dev / urandom cũng vậy, làm cạn nhóm entropy nhưng khi thiếu entropy đủ, nó không chặn mà sử dụng lại các bit từ dữ liệu ngẫu nhiên được đọc một phần. Điều này được cho là dễ bị tấn công phân tích mật mã. Đây là một khả năng lý thuyết và do đó không khuyến khích đọc từ / dev / urandom để thu thập tính ngẫu nhiên trong các hoạt động mật mã.

java.security.SecureRandom , theo mặc định, đọc từ / dev / random và do đó đôi khi bị chặn trong một khoảng thời gian ngẫu nhiên. Bây giờ, nếu thao tác đọc không trở lại trong một khoảng thời gian cần thiết, máy chủ Oracle sẽ hết thời gian chờ máy khách (trong trường hợp này là các trình điều khiển jdbc) và ngừng giao tiếp bằng cách đóng ổ cắm từ đầu của nó. Máy khách khi cố gắng tiếp tục liên lạc sau khi trở về từ cuộc gọi chặn sẽ gặp phải ngoại lệ IO. Sự cố này có thể xảy ra ngẫu nhiên trên bất kỳ nền tảng nào, đặc biệt là nơi tập hợp entropy từ các tiếng ồn phần cứng.

Theo đề xuất trong diễn đàn OTN, giải pháp cho vấn đề này là ghi đè hành vi mặc định của java.security.SecureRandom lớp sử dụng không chặn được đọc từ / dev / urandom thay vì chặn đọc từ / dev / random . Điều này có thể được thực hiện bằng cách thêm thuộc tính hệ thống sau -Djava.security.egd =file:/// dev / urandom cho JVM. Mặc dù đây là một giải pháp tốt cho các ứng dụng như trình điều khiển JDBC, nhưng không khuyến khích các ứng dụng thực hiện các hoạt động mật mã cốt lõi như tạo khóa mật mã.

Các giải pháp khác có thể là sử dụng các triển khai trình gieo hạt ngẫu nhiên khác nhau có sẵn cho nền tảng không dựa vào tiếng ồn phần cứng để thu thập entropy. Với điều này, bạn vẫn có thể yêu cầu ghi đè hành vi mặc định của java.security.SecureRandom .

Tăng thời gian chờ ổ cắm ở phía máy chủ Oracle cũng có thể là một giải pháp nhưng các tác dụng phụ nên được đánh giá từ quan điểm của máy chủ trước khi thực hiện điều này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cú pháp SQL Oracle:Mã định danh được trích dẫn

  2. Liên kết lại cơ sở hạ tầng lưới

  3. Gửi một mảng giá trị tới thủ tục Oracle để sử dụng trong mệnh đề WHERE IN

  4. Tại sao chuyển đổi không hợp lệ được yêu cầu MÃ LỖI:17132?

  5. Oracle SQL:Cột không được phép