2009-10-26 14 views
7

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)

+0

Bunu yakından izleyeceğim, projelerimizin çoğunda çok benzer bir problemimiz var. – Tenner

+1

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

cevap

7

de kendi kod, sen İade edilen bunları kaldırmak daha sonra bağlantı yöneticisi içindeki bir harita (a stacktrace ile birlikte) başlatıldı bağlantılarını saklamak ve olabilir bağlantı yöneticisi olduğu varsayıldığında . Böylece, herhangi bir noktada, haritanın anahtar kümesi geri dönüşsüz bağlantılar kümesidir ve onları oluşturan ve hiçbir zaman serbest bırakmayan suçlu kod bitini bulmak için haritadaki bu değere bakabilirsiniz. (Eğer bağlantı uygun bir harita tuşu değilse, muhtemelen bir çeşit benzersiz ID veya bağlantı numarası kullanabilirsiniz ya da her neyse - gerçek değer onun varlığı kadar önemli değildir).

Sonra sadece talep üzerine bu harita erişmek için bazı uygun şekilde ekleyebilir ve iyisin. Ortamınıza bağlı olarak, haritanın içeriğini bir dosyaya aktaran bir kapatma kancası ekleyerek ve/veya çalıştırma kodundaki kapatılmamış bağlantılar kümesini aramak için bir JConsole arabirimi ekleyerek iyi seçenekler olabilir.

bağlantı yöneticisi kodunuzu değilse

, yine muhtemelen yönlerini kullanarak aynı şeyi elde edebiliriz.

+0

+1 – teabot

+0

Kullandığımız bağlantı havuzu buna benzer bir şey yapar; Geri döndüğü bağlantıları sarar ve kullandıklarında takip tutar inanıyorum. Bağlantı, konfigürasyonda belirttiğimiz belirli bir süreden daha uzun bir süre kullanılmadığında, bağlantı otomatik olarak sonlandırılacak ve bağlantı açıkken kaydedilen yığın izi, günlüğe yazdırılacaktır. – RMorrisey

0

Sen özel mini çerçeveyi uygulamak veya JDBC operasyonlar ince sargı olarak exisitng birini kullanabilirsiniz. Örneğin, geliştiriciden gelen tüm hataya açık hata kodunu kapsayan bir spring-jdbc modülü (mavenized) vardır.

Bunu usage examples kontrol ve hiç müşteri koduna hiçbir başlatma/temizleme olduğunu görebilirsiniz! 'şablon yöntemi' modelini kullanır, yani sadece temel veri işlemlerini yazarsınız ve bağlantılar/ifadeler/resultsets oluşturma ve kapama ile uğraşmayın. Yani, ilk başta konuştuğunuz problemi tanıtmak mümkün olmaz.

İlgili konular