it-swarm.com.de

Was kann zu zeitweiligen ORA-12519-Fehlern (TNS: kein geeigneter Handler gefunden) führen?

Wir führen unsere Junit 4-Testsuite gegen Weblogic 9 vor einer Oracle 10-Datenbank aus (unter Verwendung von Hudson als Server für kontinuierliche Integration) und gelegentlich kommt es während des Herunterfahrens von Skripten zu einem Absturz von ORA-12519. Der Fehler tritt jedoch sehr sporadisch auf:

  • Dies geschieht normalerweise für dieselbe Testklasse
  • Es passiert nicht immer für die gleichen Testfälle (manchmal bestehen sie)
  • Es passiert nicht bei der gleichen Anzahl von Testfällen (zwischen 3 und 9)
  • Manchmal passiert es gar nicht, alles vergeht

Obwohl ich nicht garantieren kann, dass dies nicht lokal geschieht (natürlich bei der Ausführung mit derselben Datenbank), habe ich dieselbe Klassensuite mehrere Male ohne Probleme ausgeführt.

Irgendwelche Ideen?

41
cynicalman

Ich weiß nicht, ob das die Antwort aller sein wird, aber nach einigem Graben haben wir uns Folgendes ausgedacht.

Der Fehler wird offensichtlich durch die Tatsache verursacht, dass der Listener keine Verbindungen akzeptierte. Warum wird dieser Fehler angezeigt, wenn andere Tests eine einwandfreie Verbindung herstellen können (über sqlplus ist auch keine Verbindung möglich)? Der Schlüssel zu dem Problem war nicht, dass wir keine Verbindung herstellen konnten, sondern dass es intermittierend war

Nach einigen Untersuchungen stellten wir fest, dass beim Einrichten der Klasse statische Daten erstellt wurden, die die Verbindungen für die gesamte Lebensdauer der Testklasse offen hielten und im Laufe der Zeit neue Verbindungen herstellten. Obwohl alle Ressourcen ordnungsgemäß freigegeben wurden, als diese Klasse den Gültigkeitsbereich verließ (natürlich über einen finally {} -Block), gab es einige Fälle, in denen diese Klasse während der Ausführung alle verfügbaren Verbindungen verschluckte (okay, schlecht) Übungsalarm - Dies war ein Unit-Test-Code, der eine direkte Verbindung herstellte, anstatt einen Pool zu verwenden, sodass dasselbe Problem in der Produktion nicht auftreten konnte.

Das Update bestand darin, diese Klasse nicht statisch zu machen und in der Klasseneinrichtung auszuführen, sondern sie stattdessen in den Methoden setUp und tearDown pro Methode zu verwenden.

Wenn dieser Fehler in Ihren eigenen Apps auftritt, schlagen Sie einen Profiler auf diesen bösen Jungen und prüfen Sie, ob möglicherweise ein Verbindungsleck vorliegt. Ich hoffe, das hilft.

39
cynicalman

Eine andere Lösung, die ich für einen ähnlichen Fehler gefunden habe, aber die gleiche Fehlermeldung ist, die Anzahl der gefundenen Service-Handler zu erhöhen. (Meine Instanz dieses Fehlers wurde durch zu viele Verbindungen in den Weblogic Portal-Verbindungspools verursacht.)

  • Lauf SQL*Plus und melden Sie sich als SYSTEM an. Sie sollten wissen, welches Kennwort Sie bei der Installation von Oracle DB XE verwendet haben.
  • Führen Sie den Befehl alter system set processes=150 scope=spfile; in SQL * Plus
  • SEHR WICHTIG: Starten Sie die Datenbank neu.

Von hier:

http://www.atpeaz.com/index.php/2010/fixing-the-ora-12519-tnsno-reference-service-handler-found-error/

26
edwardsmatt

Ich hatte auch das gleiche Problem, ich suchte an vielen Stellen nach den Antworten. Ich habe viele ähnliche Antworten erhalten, um die Anzahl der Prozess-/Servicehandler zu ändern. Aber ich dachte, was wäre, wenn ich vergessen hätte, es zurückzusetzen?

Dann habe ich versucht, die Thread.sleep() -Methode nach jeder meiner connection.close(); zu verwenden.

Ich weiß nicht wie, aber es funktioniert zumindest für mich.

Wenn jemand es ausprobieren und herausfinden möchte, wie es funktioniert, dann machen Sie bitte weiter. Ich würde es auch gerne wissen, da ich ein Anfänger in der Programmierwelt bin.

3

Ich hatte dieses Problem in einem Komponententest, der viele Verbindungen zur Datenbank über einen Verbindungspool öffnete und dann den Verbindungspool "stoppte" (ManagedDataSource tatsächlich), um die Verbindungen am Ende jedes Tests freizugeben. Irgendwann in der Testsuite gingen mir immer die Verbindungen aus.

Fügte ein Thread.sleep (500) im teardown () meiner Tests hinzu und dies löste das Problem. Ich denke, was geschah, war, dass der Verbindungspool stop () die aktiven Verbindungen in einem anderen Thread freigibt, so dass, wenn der Hauptthread weiterhin Tests ausführt, die Bereinigungsthreads so weit dahinter stecken, dass dem Oracle-Server die Verbindungen ausgehen. Durch Hinzufügen des Ruhezustands können die Hintergrundthreads die zusammengefassten Verbindungen freigeben.

Dies ist in der Praxis weitaus weniger ein Problem, da die DB-Server viel größer sind und eine gute Mischung von Vorgängen vorliegt (nicht nur endlose DB-Verbindungsvorgänge/-Trennvorgänge).

1
Andrew McGregor

Ich hatte das ähnliche Problem. Es geschah jedes Mal, wenn ich ein Paket von Datenbank-Tests (Spring JDBC) mit SpringJUnit4ClassRunner, also habe ich das Problem gelöst, indem ich @DirtiesContext Annotation für jeden Test, um den Anwendungskontext zu bereinigen und alle Ressourcen freizugeben, sodass jeder Test mit einer neuen Initialisierung des Anwendungskontexts ausgeführt werden kann.

1
Shendor