2010-06-21 8 views
14

, (temel düzeyde) bir araya toplanmasını JDBC Bağlantı bu şekilde çalışır:JDBC Bağlantı Havuzu: Bağlantı Yeniden Kullanılıyor mu? Benim anlayış gereğince

  1. uygulama başlatma sırasında bağlantılarını oluşturmak ve
  2. uygulamasına talep üzerine bu önbelleğe bağlantıları sağlayan bir önbellekte koymak
  3. ayrı iplik benzeri faaliyetleri yerine, Bağlantı Pool korur: (kapalı) kullanılmıştır
    • atma bağlantıları
    • yeni bağlantı oluşturmak s ve bağlantılar

Ama bir JDBC bağlantı havuzu tartışmasında terimini "bağlantı yeniden" duyduğunda, kafam karışıyor belirli bir sayımını muhafaza etmek önbelleğe ekleyin. Bağlantı yeniden ne zaman gerçekleşir?

Bu, Bağlantı Havuzu'nun iki farklı veritabanı etkileşimi için aynı bağlantıyı sağladığı anlamına mı geliyor (kapatmadan)? Veya, bir DB çağrısından sonra kapatıldıktan sonra bile bağlantı kullanmaya devam etmenin bir yolu var mı?

+0

sadece merak ediyorum ama hangi bağlantı havuzu kütüphaneleri havuzu yönetmek için ayrı konuları başlatıyor? Ben commons-dbcp bunu yapmaz - en azından BasicDataSource değil. Bunun yerine, bağlantı denetimi havuzdan –

cevap

12

Bağlantı havuzu, bağlantıları yeniden kullanarak çalışır. Uygulamalar havuzdan bir bağlantıyı "ödünç alır", sonra bitince "geri döndürür". Bağlantı daha sonra uygulamanın başka bir bölümüne veya hatta farklı bir uygulamaya dağıtılır.

Aynı bağlantı, iki iş parçacığı tarafından aynı anda kullanılmadığı sürece, bu tamamen güvenlidir.

Bağlantı havuzlu anahtar nokta, genellikle pahalı bir işlem olduğu için mümkün olan yerlerde yeni bağlantılar oluşturmaktan kaçınmaktır. Bağlantıları yeniden kullanmak, performans için çok önemlidir.

10

Bağlantı havuzu, sürücüden gerçek Bağlantı örneğini sağlamaz, ancak bir sarıcı döndürür. Havuzdan bir Bağlantı örneğinde 'close()' çağırdığınızda, sürücünün Bağlantısını kapatmaz, bunun yerine yeniden kullanılabilen havuza açık bağlantıyı döndürür (skaffman'in yanıtına bakın).

+2

havuzdan kontrol edildiğinde yapıldığını düşünüyorum. Bu, kullandığınız belirli bir bağlantı havuzuna bağlıdır. 'DataSource' veya Commons DBCP stili. Hafif havuzlar sadece 'Bağlantı' ham değerini döndürebilir ve 'close()' diyerek uygulama koduna güvenebilir. – skaffman

+0

Yani, bu, bir havuzdaki JDBC bağlantılarının mutlaka Connection.commit() veya Connection.setAutoCommit (true) belgesine bağlı olduğu anlamına gelir - büyük olasılıkla bu çağrılar Bağlantı sargısının aşırı yüklenmiş() bölümünde yapılır. – haps10

-1

Anlayışım yukarıda belirtilenle aynıdır ve bir hata sayesinde, bunun doğru olduğuna dair kanıtlarım var. Çalıştığım uygulamada bir hata oluştu, geçersiz bir sütun adı olan bir SQL komutu. Uygulamada bir istisna atılır. Bağlantı kapatılırsa, bir bağlantı elde edilir ve bir dahaki sefere doğru SQL kullanılırsa, bir istisna tekrar atılır ve hata mesajı ilk kez aynıdır, ancak yanlış sütun adı, ikinci SQL Dolayısıyla bağlantı açıkça yeniden kullanılıyor. İlk istisna (kötü sütun adı nedeniyle) atıldıktan sonra bağlantı kapatılmazsa, bir sonraki bağlantıda her şey gayet iyi çalışır. Muhtemelen bunun nedeni, ilk bağlantının yeniden kullanılmak üzere havuza geri gönderilmemesidir. (Bu hata, Jave 1.6_30 ve MySQL veritabanına bir bağlantı ile gerçekleşiyor.)

+3

Lütfen metnin duvarlarından kaçının, biçimlendirmenin SO üzerinde yapılması önerilir. – Azulflame

+0

Biçimlendirmenin yanı sıra, cevabınızı zenginleştirmek için aldığınız hatayı olduğu sürece verdiğiniz SQL komutunu eklemeyi düşünün. –

1

Bağlantı havuzu yeniden bağlantıları yeniden kullanıyor. Burada apache dbcp'nin altı çizilir.

Connection poolableConnection= apacheDbcpDataSource.getConnection(); 

Apache DBCP uygulama türü PoolableConnection ait bağlantı sargısı döndürür.Gerçek alınan bağlantı kapatıldı olup olmadığını değil o zaman bağlantı havuzunun (bu durumda GenericObjectPool) içine bu PoolableConnection örneğini dönerse

poolableConnection.close(); 

PoolableConnection.close(), inceler.

if (!isUnderlyingConectionClosed) { 
      // Normal close: underlying connection is still open, so we 
      // simply need to return this proxy to the pool 
      try { 
       genericObjectPool.returnObject(this); //this is PoolableConnection instance in this case 
.... 
       }