2008-10-15 6 views
33

Wir laufen unsere Junit 4 Testsuite gegen Weblogic 9 vor einer Oracle 10 Datenbank (mit Hudson als Continuous Integration Server) und gelegentlich werden wir Erhalte einen ORA-12519-Absturz beim Skript-Teardown. Allerdings ist der Fehler sehr intermittierender:Was kann intermittierenden ORA-12519 (TNS: keine passenden Handler gefunden) Fehler

  • es in der Regel für den gleichen Test-Klasse geschieht
  • Es muss nicht immer für die gleichen Testfälle passieren (manchmal sind sie passieren)
  • Es ist nicht für geschieht die gleiche Anzahl von Testfällen (überall von 3-9)
  • Manchmal ist es gar nicht passieren, alles geht

Während ich kann nicht garantieren, dies nicht lokal geschehen (wenn sie gegen den Lauf dieselbe Datenbank natürlich), ich habe die gleiche Klasse mehrmals ohne Probleme ausgeführt.

Irgendwelche Ideen?

Antwort

33

Ich weiß nicht, ob dies die Antwort aller sein wird, aber nach ein paar Gruben, hier ist, was wir uns ausgedacht haben.

Der Fehler wird offensichtlich durch die Tatsache verursacht, dass der Listener keine Verbindungen akzeptierte, aber warum sollten wir diesen Fehler bekommen, wenn andere Tests eine Verbindung herstellen konnten (wir konnten auch kein Problem über sqlplus herstellen)? Der Schlüssel zum Problem war nicht, dass wir keine Verbindung herstellen können, aber dass es intermittierenden

Nach einigen Untersuchungen war, fanden wir, dass es einige statische Daten war während der Klasse Setup erstellt, die offene Verbindungen für das halten würde Leben der Testklasse, neue schaffen, wie es ging. Nun, obwohl alle Ressourcen korrekt freigegeben wurden, als diese Klasse den Bereich verließ (natürlich über einen finally {} Block), gab es während des Laufs einige Fälle, in denen diese Klasse alle verfügbaren Verbindungen verschlingen würde (okay, schlecht Übungsalarm - dies war ein Komponententestcode, der direkt verbunden war, anstatt einen Pool zu verwenden, sodass das gleiche Problem in der Produktion nicht auftreten konnte.

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

Also, wenn Sie diesen Fehler in Ihren eigenen Anwendungen erhalten, schlagen Sie einen Profiler auf diesen bösen Jungen und sehen, ob Sie ein Verbindungsleck haben könnten. Ich hoffe, das hilft.

+1

Meine Situation war sehr unterschiedlich in den Details, aber es kam zu einem Verbindungsleck auch, also danke, dass Sie mich in die richtige Richtung weisen. –

+0

Das gleiche hier. Ich musste einen Aufruf von 'close()' auf dem Verbindungsobjekt manuell hinzufügen. – Jason

25

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

  • Run SQL*Plus und melden Sie sich als SYSTEM. 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 aus:

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

+1

Der Artikel erwähnt, dass dies ein spezifisches Problem bei Oracle Database XE (Express Edition) ist –

+0

die gleiche Einstellung erscheint auch in Oracle (Vollprodukt), außer dort ist es bei 150 standardmäßig. – jwenting

+2

Dieses Problem tritt auf, wenn jmeter 40 Threads ausführt. Meine Prozesse sind auf 300 gesetzt und haben bisher eine maximale Auslastung von 128. 'select * von v $ resource_limit wo resource_name = 'processes';' = current = 88, max = 128, limit = 300 – wmorrison365

2

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

Dann versuchte ich mit Thread.sleep() Methode nach jedem meiner connection.close();.

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

Wenn jemand es ausprobieren und herausfinden will, wie es funktioniert, dann bitte gehen Sie voran. Ich würde es auch gerne als Anfänger in der Programmierwelt kennenlernen.

0

Ich hatte das ähnliche Problem. Es ist jedes Mal passiert, wenn ich ein Paket von Datenbank (Spring JDBC) -Tests mit SpringJUnit4ClassRunner starte, also löste ich das Problem @DirtiesContext Annotation für jeden Test, um den Anwendungskontext zu bereinigen und alle Ressourcen freizugeben, damit jeder Test mit einer neuen Initialisierung laufen konnte des Anwendungskontextes.

0

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

Ein Thread.sleep (500) im Teardown() meiner Tests hinzugefügt und das Problem wurde behoben. Ich denke, was passiert ist, dass der Verbindungspool stop() die aktiven Verbindungen in einem anderen Thread freigibt, sodass, wenn der Hauptthread Tests ausführt, der/die Bereinigungsthread (s) so weit zurückliegt, dass dem Oracle-Server die Verbindungen ausgehen. Durch Hinzufügen des Schlafs können die Hintergrund-Threads die gepoolten Verbindungen freigeben.

Das ist viel weniger ein Problem in der realen Welt, weil die DB-Server viel größer sind und es eine gesunde Mischung von Operationen gibt (nicht nur endlose DB verbinden/trennen-Operationen).