Uygulamamızdaki c3p0's ConnectionCustomizer
kullanarak veritabanı bağlantılarının oluşturulmasını ve imha edilmesini günlüğe kaydetmeye çalışıyorum. İçinde, şu gibi görünen bir kodum var:C3p0 içinde Kilit Sırası Siparişi
log(C3P0Registry.getPooledDataSources())
Çıkmazlara giriyorum. C3p0'in kütüphanesinde senkronize yöntemler kullanan en az birkaç nesneye sahip olduğunu ve istenen kilit sırasını belirtmediğini keşfettim. Bağlantıları kaydettiğimde, C3P0Registry
üzerinde bir kilit tutuyor ve sonunda PoolBackedDataSource
(yalnızca veri kaynaklarının bir listesini oluşturmak için bir sağlama koduna erişiyor).
Bağlantı sağlayıcının kapatılması (C3P0ConnectionProvider.close()
numaralı telefonu arayarak), kilitlerin karşı sırada çağrılmasına neden olur. Ancak çocuk veri kaynakları kapatılırken, günlüğüm tetikleniyor. Sonuç bir kilitlenme.
Ben olan geçerli, beklenen aramalar c3p0 kütüphaneye yapıyorum hem arama gibi görünüyor:
C3P0ConnectionProvider.close()
C3P0Registry.getPooledDataSources()
Ayrıca gibi görünüyor
(açıkça belgelerinde belirtilmediği sürece) Kendi kilitleme stratejisini yönetmek için kütüphanenin sorumluluğu olmalıdır. (Ben kimseyi suçlamak için söylemiyorum .. sadece en iyi uygulamaları anladığımı onaylamak için)
Bu sorunla nasıl başa çıkmalıyım? C3p0 daha modern bir mekanizma yerine senkronize yöntemler kullandığından, kilitleri gerçekten test edemiyorum.
Benim DataSource
kapanış kodundan, DataSource
'u kapatmadan önce C3P0Registry
kilidi kapabilirim. Kendimi rahat hissettiğimi bilmediğim doğru kilit sırasını tahmin ederdim.
Günlüğe kaydetme çağrısı için kilit sırasını tersine çevirebileceğimi düşünmüyorum.'a ihtiyacım var, DataSources
listesini almak için,'u kilitlemeden, bunlara referans almak için C3P0Registry
'u kilitlemeden.
Başka bir çözüm, elbette, her şeyin üzerinde bir başka, daha yüksek seviye kilit sağlamaktır c3p0. Bir bağlantı havuzu durumunda, bu noktayı yenmek gibi görünüyor.
Şimdilik, günlüğümü geri alıyorum. Herhangi bir yardım için teşekkürler.
Benzer bir şey yaşamak, bu konuda daha fazla bilgi bulup duymadığınızla ilgilenmek. –
Kapanışımla aynı sırada kilitler aldığımı garanti etmek için close() işlevini çağıran kodun etrafında senkronize bir blok ekledim. Özensiz ama yine de, C3p0'daki kilitleme stratejisi de öyle. –