Wir haben einen Fehler im alten Code gefunden, bei dem Verbindungen nicht geschlossen werden. Es ist eine einfache Lösung, aber ich frage mich, wie wir beweisen, dass es behoben ist. Es besteht die Möglichkeit, einen Verbindungspool zu verwenden oder nicht. Für die Pooling-Nutzung wäre es einfach, die Überwachung für den Pool hinzuzufügen, aber wenn das Pooling von Verbindungen nicht verwendet wird, wie können wir diese nicht abgeschlossenen, verwaisten Verbindungen verfolgen? Ist es genau wie bei jedem anderen Speicherleck?Wie verfolge ich verwaiste JDBC-Verbindungen, die nicht geschlossen sind?
Der Fehler sieht grundsätzlich wie ein Ausschneiden und Einfügen Fehler aus. Wir haben ein paar Klassen, die die DB-Verbindung zu verwalten, so sieht es ungefähr so:
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
(beginne editieren/anhängen)
Ja, der Verbindungscode gehört auch uns und so kann ich die gegebenen Antworten verwenden.
Allerdings glaube ich nicht, dass ich die richtige Frage gestellt habe, obwohl die Antworten unten die Frage beantworten, die ich gestellt habe. Ich bin mir nicht sicher, was die richtige Stackoverflow-Sache ist. eine andere Frage stellen oder diese bearbeiten?
Eine der Fragen, die ich hätte stellen sollen, ist: Wie würden sich diese verwaisten, nicht geschlossenen Verbindungen in der Systemleistung manifestieren? Da diese Verbindungsobjekte nur im Rahmen einer bestimmten Methode existieren, sind die Verbindungen nicht für die Garbage Collection geeignet? Und dann, wenn sie gc'ed sind, was ist der Effekt der offenen Verbindungen gc'ed?
(Ende edit)
Ich werde diese genau beobachten, wir haben ein sehr ähnliches Problem in mehreren unserer Projekte. – Tenner
Für den Rekord, ich hätte einen wirklich guten Grund, dies nicht zu einer reifen Verbindungspool-Implementierung wie DBCP oder C3PO zu verschieben - wenn Sie die Gelegenheit haben - sollten Sie vielleicht darüber nachdenken? – teabot