Bağlantıların kapatılmadığı eski kodda bir hata bulduk. Bu kolay bir çözümdür, ancak bunun düzeltildiğini kanıtlamak için nasıl gideceğimizi merak ediyorum. Bir bağlantı havuzu kullanma seçeneği var veya yok. Havuzlama kullanımı için havuz için izleme eklemek kolay olurdu, ancak bağlantılar havuzlama kullanılmadığında, kapatılmamış, yetim bağlantıları nasıl izleriz? Diğer bellek sızıntısı gibi mi?Kapalı olmayan artık JDBC bağlantılarını nasıl izlerim?
Hata, temelde kesme ve yapıştırma hatası gibi görünüyor. Biz DB bağlantısını yönetmek birkaç sınıfları var, bu yüzden böyle kabaca görünür:
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
}
önceki kodlayıcılar sadece orijinal bağlantıyı yeniden niye bilmiyorum, ama bu
budur(düzenleme başlat/uygula)
Evet, bağlantı kodu da bizimki gibi ve verilen cevapları kullanabilirim.
Ancak, ben cevap aşağıda cevapları soru sordum rağmen, doğru soru soruldu sanmıyorum. Doğru stackoverflow işinin ne olduğundan emin değilim; Başka bir soru sor, ya da bunu düzelt? Ben sormalıydık soru
biri şudur: nasıl bu sahipsiz olur, un-kapalı bağlantıları sistem performansında kendini gösterecektir? Ayrıca, bu bağlantı nesneleri yalnızca belirli bir yöntem kapsamında bulunduğundan, bağlantılar çöp toplama için uygun olmaz mı? Ve eğer onlar gc'ed ise, açık bağlantıların gc'ed olmasının etkisi nedir?
(bitiş düzenleme)
Bunu yakından izleyeceğim, projelerimizin çoğunda çok benzer bir problemimiz var. – Tenner
Kayıt için, DBCP veya C3PO gibi olgun bir bağlantı havuzu uygulamasına taşınmamanın gerçekten iyi bir nedenine sahip olmam gerekiyor - eğer fırsatınız varsa - belki de bunu yapmayı düşünmelisiniz? AOP yaklaşımı için – teabot