Abbiamo trovato un bug nel vecchio codice in cui le connessioni non vengono chiuse. È una soluzione semplice, ma mi chiedo come proveremo a correggere. È possibile scegliere di utilizzare un pool di connessioni o meno. Per il pooling, sarebbe facile aggiungere il monitoraggio per il pool, ma quando il pooling delle connessioni non viene utilizzato, come monitoriamo quelle connessioni non chiuse e orfane? È come qualsiasi altra perdita di memoria?Come si traccia le connessioni JDBC orfane che non sono chiuse?
Il bug sembra fondamentalmente un errore di copia e incolla. Abbiamo un paio di classi che gestiscono la connessione DB, in modo che appaia più o meno in questo modo:
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
}
Non so il motivo per cui i programmatori precedenti non solo riutilizzare la connessione originale, ma questo è quello che è
(inizio modifica/aggiungi)
Sì, anche il codice di connessione è nostro e quindi posso utilizzare le risposte fornite.
Tuttavia, non penso di aver posto la domanda giusta, sebbene le risposte seguenti rispondano alla domanda che ho posto. Non sono sicuro di quale sia la cosa giusta da fare sullo stackoverflow; fai un'altra domanda o modifica questa?
Una delle domande che avrei dovuto porre è: in che modo queste connessioni orfane e non chiuse si manifestano nelle prestazioni del sistema? Inoltre, poiché questi oggetti di connessione esistono solo nell'ambito di un determinato metodo, le connessioni non sarebbero idonee per la garbage collection? E poi se sono gc'ed, qual è l'effetto delle connessioni aperte che vengono fatte?
(fine edit)
Lo osserverò da vicino, abbiamo un problema molto simile in molti dei nostri progetti. – Tenner
Per la cronaca, dovrei avere una buona ragione per NON spostarlo in un'implementazione di pool di connessioni mature come DBCP o C3PO - se ne hai l'opportunità - forse dovresti considerare di farlo? – teabot