Frage

Wir haben einen Fehler in altem Code gefunden, wo Verbindungen werden nicht geschlossen. Es ist eine einfache Lösung, aber ich frage mich, wie wir gehen zu beweisen, dass es behoben ist. Es gibt eine Auswahl eines Verbindungspool verwenden oder nicht. Für die Bündelung verwenden, es wäre eine einfache Überwachung für den Pool hinzufügen, aber wenn Verbindungen Pooling nicht verwendet wird, wie verfolgen wir diese nicht geschlossene, verwaiste Verbindungen? Ist es genau wie andere Speicherleck?

Der Fehler sieht aus wie im Grunde ein Ausschneiden und Einfügen Fehler. Wir haben ein paar Klassen, die die DB-Verbindung zu verwalten, so sieht es aus in etwa wie folgt aus:

OurDBConn conn1 = ConnectionManager.getConnection();
try {
  // business logic
} catch () {
  //
} finally {
  ConnectionManager.returnConnection(conn1);
}

/// and then later in the same method
OurDBConn conn2 = ConnectionManager.getConnection();
try {
  // business logic
} catch () {
  //
} finally {
  ConnectionManager.returnConnection(conn1); // NOTE Error: conn1 should be conn2
}

Ich weiß nicht, warum die früheren Programmierer einfach nicht die ursprüngliche Verbindung wieder verwenden, aber das ist, was es ist

(beginnen bearbeiten / append)

Ja, der Verbindungscode ist uns so gut und so kann ich die Antworten gegeben.

Aber ich glaube nicht, dass ich die richtige Frage gestellt, obwohl die Antworten unten Antwort die Frage, fragte ich. Ich bin mir nicht sicher, was das richtige Stackoverflow, was zu tun ist; fragen andere Frage, oder diese ein bearbeiten?

Einer der Frage, die ich gefragt haben sollte, ist: wie würden diese verwaist, un geschlossenen Verbindungen manifestieren sich in die Systemleistung? Da auch diese Verbindungsobjekte nur im Rahmen einer bestimmten Methode vorhanden ist, würden nicht die Anschlüsse für die Garbage Collection in Betracht? Und dann, wenn sie gc'ed werden, was die Wirkung der offenen Verbindungen gc'ed werden?

(Ende edit)

War es hilfreich?

Lösung

Unter der Annahme der Verbindungsmanager werden Ihren eigenen Code auch, können Sie die initialisierten Verbindungen speichern (zusammen mit einem Stacktrace) in einer Karte im Verbindungsmanager, und sie dann entfernen, wenn sie zurückgebracht werden. So an jedem Punkt ist die Keyset der Karte die Menge der zurückgekommenen Verbindungen, und Sie können diesen Wert in der Karte, um die Schuldigen Stück Code zu finden suchen, die sie geschaffen hat und sie nie veröffentlicht worden. (Wenn die Verbindung nicht ein geeignete Karte Schlüssel ist, können Sie wahrscheinlich eine Art eindeutiger ID oder Anschlussnummer verwenden, oder was auch immer - der tatsächliche Wert spielt keine Rolle, so viel wie seine Präsenz).

Dann fügen Sie einfach eine geeignete Möglichkeit, diese Karte auf Anfrage für den Zugriff auf und du bist gut. Abhängig von der Umgebung, das Hinzufügen eines Shutdown-Haken, der den Inhalt der Karte in eine Datei-Dump, und / oder das Hinzufügen einer JConsole Schnittstelle den Satz von unclosed Verbindungen zum Nachschlagen in Code ausgeführt wird, könnten beide gute Möglichkeiten sein.

Wenn der Verbindungsmanager nicht Ihr Code ist, könnten Sie noch erreichen wahrscheinlich die gleiche Sache Aspekte verwenden.

Andere Tipps

können Sie implementieren benutzerdefinierte Mini-Rahmen oder verwenden exisitng eine als dünne Hülle auf JDBC-Operationen. Zum Beispiel gibt es eine feder Jdbc Modul ( mavenized ), dass alle der vorformulierten fehleranfälligen Code umfasst von Entwickler.

Sie können prüfen, seine Nutzung Beispiele und sehen, dass es überhaupt auf dem Client-Code keine Initialisierung / Bereinigung ist! Es nutzt ‚Template-Methode‘ Muster, das heißt Sie nur wesentliche Datenverarbeitung schreiben und nicht die Mühe mit Verbindungen / Aussagen / Result Erstellung und Schließen. So ist es nicht möglich, das Problem, das Sie zuerst gesprochen einzuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top