Odpowiedź pochodzi z forum Oracle, tutaj :
java.security.SecureRandom
to standardowe API dostarczane przez sun. Wśród różnych metod oferowanych przez tę klasę void nextBytes(byte[])
.
Ta metoda służy do generowania losowych bajtów. Sterowniki Oracle 11g JDBC używają tego interfejsu API do generowania liczby losowej podczas logowania. Użytkownicy korzystający z Linuksa napotkali SQLException("Io exception: Connection reset")
.
Problem jest dwojaki:
-
JVM próbuje wyświetlić listę wszystkich plików w /tmp (lub alternatywnym katalogu tmp ustawionym przez -Djava.io.tmpdir), gdy
SecureRandom.nextBytes(byte[])
jest wywoływany. Jeśli liczba plików jest duża, odpowiedź metody zajmuje dużo czasu, co powoduje przekroczenie limitu czasu serwera -
Metoda
void nextBytes(byte[])
używa /dev/random w systemie Linux i na niektórych maszynach, które nie mają sprzętu generującego liczby losowe, operacja spowalnia do tego stopnia, że cały proces logowania zostaje zatrzymany. Ostatecznie użytkownik napotyka wyjątek SQLException("Wyjątek Io:Resetowanie połączenia")
Użytkownicy dokonujący aktualizacji do 11g mogą napotkać ten problem, jeśli podstawowym systemem operacyjnym jest Linux, który działa na wadliwym sprzęcie.
Przyczyna tego nie została jeszcze dokładnie ustalona. Może to być problem sprzętowy lub fakt, że z jakiegoś powodu oprogramowanie nie może czytać z dev/random
rozwiązanie wydaje się, że dodaje to ustawienie do jvm
-Djava.security.egd=file:/dev/./urandom