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:
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?
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.
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.)
SQL*Plus
und melden Sie sich als SYSTEM
an. Sie sollten wissen, welches Kennwort Sie bei der Installation von Oracle DB XE verwendet haben.alter system set processes=150 scope=spfile;
in SQL * PlusVon hier:
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.
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).
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.