2010-12-22 7 views
0

Wir haben eine Abfrage, die 3 Stunden dauert, um zu beenden. Das war vorher kein Problem. Vorher wird der Code, der diese Abfrage aufruft, in weblogic implementiert und verwendet den eigenen Verbindungspool-Manager des letzteren.Langsam laufende Abfrage

Jetzt, da der Prozess viel Speicher belegt, haben wir diesen Code ausgepackt und auf seinem eigenen Heap-Platz laufen lassen. Die Anfrage zum Aufruf der Anfrage erfolgt über jms. Ich habe auch bemerkt, dass der Verbindungspool-Manager, den wir verwenden, dbcp ist und seine Standardeinstellungen verwendet (max. Verbindungen = 8, min. Verbindungen = 0). Der JMS-Client ist Multithread.

Wenn wir die Abfrage über eine Schnittstelle (TOAD) ausgeführt haben, dauert es nur 2 Sekunden, also habe ich ausgeschlossen, dass die Datenbank "beschuldigt" wird.

Ich fragte mich, welche Schritte ich von hier aus unternehmen könnte, um den Flaschenhals zu finden. Vielleicht etwas mit dem Verbindungspool?

Antwort

3

Sie sollten ein Tool wie VisualVM oder einen Thread-Dump verwenden, um zu überprüfen, was Ihre Threads tun. Warten sie nur auf den Abschluss einiger IO-Operationen? Gibt es einen schlecht synchronisierten Code, der viel länger als nötig wartet? Vielleicht sogar ein Stillstand, der nach einer dreistündigen (oder dreistündigen) Auszeit aufhört?

1

Ich finde es immer wieder sinnvoll, auf das grundlegendste Java-Performance-Tool zurückzugreifen: Thread Dumps. Es gibt viele Möglichkeiten, einen Thread-Dump zu erhalten:

  • Wenn Sie eine Konsole haben, verwenden Sie ctrl-break (win) oder ctrl- \ (* nix)
  • jstack
  • jconsole und den Faden Registerkarten oder verfügbare mBeans, um einen Speicherabzug zu verursachen

Schauen Sie, was Ihr Programm macht. Nimm diese regelmäßig. Es gibt Tools, die Ihnen helfen, große Thread-Dumps wie die Thread Dump Analyzer oder Samurai zu betrachten.

Sie können auch interaktiv mit jconsole oder Visual VM arbeiten, aber ich denke, ein gut entwickeltes Talent zum Lesen von Rohdumps wird Ihnen gut tun.