2009-03-16 19 views
5

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.

+0

Benzer bir şey yaşamak, bu konuda daha fazla bilgi bulup duymadığınızla ilgilenmek. –

+0

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. –

cevap

0

Kilitleme sorununu nasıl düzeltebileceğimi bilmiyorum, ancak bence buradaki bir adımı atmalı ve orijinal sorunu düşünmelisiniz. "Uygulamamızdaki veritabanı bağlantılarının oluşturulmasını ve imha edilmesini günlüğe kaydetmeye çalışıyorum ..."

Aşağıdakileri öneririm.

Bir sınıf oluşturun ve javax.sql.DataSource uygulamasını uygulayın. Aynı türden bir alan oluşturun ve tüm yöntemleri ona aktarın. getConnection() yönteminde, kendi Bağlantı sınıfınızı yaklaşık java.sql.Connection ve benzeri şekilde döndürün. Daha sonra bu sınıfı orijinal veri kaynağınızın etrafına sarın. Sınıflarınızda artık sadece bir kaydedici oluşturabilir ve günlüğünüzde görmek istediğiniz tüm eylemleri günlüğe kaydedebilirsiniz.