Oracle Problem beim Connect gelöst

Heute habe ich mich einer Fehlermeldung beim Connect via jdbc zu einer Oracle Datenbank beschäftigt. Die Fehlermeldung lautet: „“main“ java.lang.Exception: connect to database failed: Io exception: Connection reset“ oder „java.lang.RuntimeException: Timeout reached (30s) for process:“.

Dieses Problem kann damit zusammenhängen, dass es sich um einen Headless Server handelt, der nicht genügend Werte in den entropie pool geschrieben hat. Oracle versucht nämlich anhand dieses Pools einen zufälligen Schlüssel für die Verbindung zu erzeugen.

Nachprüfen kann man das mit

rm /dev/random
ln -s /dev/urandom /dev/random

Falls damit das Problem gelöst ist, liegt das Problem darin begründet, das JDBC nicht genügend Zufallswerte von dev/random bekommt um den connect String zu verschlüsseln. Mit diesen Beiden Kommandos linken Sie random nach urandom mit dem Effekt, dass urandom nicht blockiert, falls keine randow-Wert verfügbar sind.

Achtung! Der Effekt der beiden o.g. genannten Kommandos ist nach einem Reboot wieder verloren.

JDBC benötigt 40 Bytes mit Zufallswerten. Wenn die verfügbare entropie zu klein ist, müssen Sie den Pool vergrössern indem Sie Umgebungsrauschen verursachen (Deshalb entsteht das Problem bei einem Headless server, denn dort fällt das Umgebungsrauschen durch die Maus oder Tastatur weg).

Sie können das Java Programm auch mit -Djava.security.egd=file:///dev/urandom starten um so urandom für die Zufallswerte zu verwenden.

Ein weiterer Grund für den Timeout kann übrigens eine große Anzahl von Dateien in /tmp sein, da jdbs versucht alle Dateien in tmp aufzulisten wenn SecureRandom.nextBytes(byte[]) ausgeführt wird.