JDBC ile bağlantı havuzu oluşturma seçenekleri: DBCP vs C3P0


Yanıtlar:


181

DBCP güncel değil, üretim notu değil. Bir süre önce ikisinin kurum içi analizini gerçekleştirdik ve gerçek yaşam koşullarında uygunluklarını değerlendirmek için ikisine karşı yük ve eşzamanlılık üreten bir test fikstürü oluşturduk.

DBCP, test uygulamamızda sürekli olarak istisnalar oluşturdu ve C3P0'ın istisnasız işleyebileceğinden daha fazla performans düzeyine ulaşmak için mücadele etti.

C3P0 ayrıca, DB bağlantılarını ve özgeçmişte şeffaf yeniden bağlantılarını sağlam bir şekilde ele alırken, DBCP bağlantı altından çıkarıldıysa bağlantıları asla kurtarmadı. Daha da kötüsü, DBCP, temel aktarımın bozulduğu uygulamaya Bağlantı nesnelerini döndürüyordu.

O zamandan beri 4 büyük ağır yük tüketici web uygulamasında C3P0 kullandık ve hiç geriye bakmadık.

GÜNCELLEME: Uzun yıllar rafta oturduktan sonra, Apache Commons halkının DBCP'yi uykudan çıkardığı ve şimdi bir kez daha aktif olarak geliştirilen bir proje olduğu ortaya çıktı. Bu nedenle orijinal yazım güncel olmayabilir.

Bununla birlikte, bu yeni yükseltilmiş kütüphanenin performansını henüz deneyimlemedim veya henüz yeni bir uygulama çerçevesinde fiili olmadığını duymadım.


2
Teşekkürler! Önerilen Proxool alternatifine ne dersiniz? Hibernate'in mevcut sürümü hem c3p0 hem de Proxool ile birlikte gelir.
Dema

Proxool'u denemedik ama şimdi kontrol edeceğime emin olacağım :)
j pimmel

5
c3p0'ın bazı dezavantajları vardır. bazen bağlantı zirvelerini işlemez.
Janning

3
Bu yanıtı ilk kez gönderdiğinizde 4 yıldan bu yana çok şey değişti, mümkünse mevcut senaryoyu paylaşan bir güncelleme ekleyebilir misiniz?
Rajat Gupta

13
HikariCP'i tavsiye ederim , ama sonra yazmasına yardımcı oldum.
brettw

177

Sizi BoneCP'yi denemeye davet ediyorum - ücretsiz, açık kaynak ve mevcut alternatiflerden daha hızlı (kıyaslama bölümüne bakın).

Feragatname: Yazar olduğum için önyargılı olduğumu söyleyebilirim :-)

GÜNCELLEME: Mart 2010'dan itibaren, yeniden yazılan Apache DBCP ("tomcat jdbc") havuzundan hala% 35 daha hızlı. Karşılaştırma bölümünde dinamik kıyaslama bağlantısına bakın.

Güncelleme # 2: (Aralık '13) Üstte 4 yıl geçtikten sonra artık çok daha hızlı bir rakip var: https://github.com/brettwooldridge/HikariCP

Güncelleme # 3: (Eylül '14) BoneCP edilecek dikkate alınız kaldırılmış geçiş tavsiye bu noktada HikariCP .

Güncelleme # 4: (Nisan '15) - Artık jolbox.com alan adına sahip değilim


1
Tomcat Datasource olarak BoneCP kullanarak sorun gidermek gerçekten çok isterim. Bununla ilgili temel sorun, tomcat'in lib dir'deki BoneCP Sınıflarını, log4j ve google sınıflarını gerektirmesiydi. Bunu yapmak bağlantı havuzlarının çalışmasını sağladı - (Savaştayken çalışmadı) - Tomcat'in log4j ayarıyla
çakıştı ve bir dağıtıcı

1
Bu her şeyden çok bir log4j sorunu gibi geliyor. Forum.jolbox.com'da bana bir satır bırakın, ben de en kısa sürede izlemenize yardımcı olacağım.
wwadge

3
1up, BoneCP mükemmel. C3P0'dan değiştirildi. Hatta log4jdbc-remix'e olan bağımlılığımı kaldırmama izin verdi, çünkü ifadenin kutudan çıkmasına izin veriyor!
subes

68
Yazmadığınız bir şey hakkında daha hızlı olmak için +1!
CorayThan

1
@AndrewScottEvans Muhtemelen en iyi v0.7.1'e dönmek
wwadge

16

Bağlantılar zaman aşımına uğradı, bu yüzden c3p0 denedim DBCP ile sorun yaşıyordu. Bunu üretime bırakacaktım ama sonra performans testine başladım. C3p0'ın çok iyi performans gösterdiğini gördüm. Hiç iyi performans gösterecek şekilde yapılandıramıyordum. DBCP'nin iki katı kadar yavaş buldum.

Daha sonra Tomcat bağlantı havuzunu denedim .

Bu c3p0 iki kat daha hızlı ve DBCP ile yaşadım diğer sorunları düzeltildi. 3 havuzu araştırmak ve test etmek için çok zaman harcadım. Tomcat'e konuşlandırıyorsanız tavsiyem yeni Tomcat JDBC havuzunu kullanmaktır.


14

DBCP ile otomatik yeniden bağlanma sorunu için, aşağıdaki 2 yapılandırma parametresini kullanmayı denediniz mi?

validationQuery="Some Query"

testOnBorrow=true

Gelince belgeler , testOnBorrowvarsayılan değeri vardır trueeğer öyleyse, validationQueryo uygulamaya geçirilmeden önce DBCP her bağlantıyı test edecek tanımlanır.
dma_k


12

Birkaç yıldır DBCP'yi üretimde kullanıyoruz. Kararlıdır, DB sunucusunun yeniden başlatılmasını sağlar. Sadece doğru şekilde yapılandırın. Tembel olmamanız için yalnızca birkaç parametrenin belirtilmesi gerekir. Sistem üretim kodumuzdan, çalışması için açıkça ayarladığımız parametreleri listeleyen bir snippet:

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");

8

DBCP'nin C3P0 veya Proxool'dan önemli ölçüde yüksek performans gösterdiğini gösteren bazı makaleler. Ayrıca kendi tecrübelerime göre c3p0, hazırlanmış deyim havuzu gibi bazı güzel özelliklere sahip ve DBCP'den daha yapılandırılabilir, ancak DBCP kullandığım herhangi bir ortamda açıkça daha hızlı.

Dbcp ve c3p0 arasındaki fark nedir? Kesinlikle hiçbir şey! (Bir Sakai geliştiricileri blogu) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

Blog yayınındaki yorumlarda bulunan "Bağlantı Havuzu Showdown" JavaTech makalesine benzer.


4
tek dişli ortamlarda daha hızlı, belki, buggy ve istikrarsız ve sadece başka bir yerde düz kırık.

7

Bu makalede başka bir alternatif olan Proxool'den bahsedilmektedir .

Hazırda Bekletme modunu neden varsayılan bağlantı havuzu uygulaması için c3p0 paketlerini bulabilirsin?


7

Ne yazık ki hepsi güncel değil. DBCP son zamanlarda biraz güncellendi, diğer ikisi 2-3 yaşında, birçok olağanüstü hata ile.


Bu doğrudur - C3PO'nun son sürümü (0.9 ön sürüm) Mayıs 2007'den alınmıştır. Proxool'un son sürümü (0.9 ön sürüm) Ağustos 2008'den alınmıştır. DBCP'nin son sürümü de Nisan 2007'den alınmıştır, ancak en azından kararlı bir 1.2 sürümü. Orada gerçekten bir şey var mı?
Guss

4
Adil olmak gerekirse bunlar büyük projeler değildir, bu yüzden C3P0 / DBCP'de daha az ve daha az güncelleme beklemelisiniz ve zaman geçiyor.
wwadge

7

Dbcp düzgün yapılandırılırsa üretime hazırdır.

Örneğin günde 350000 ziyaretçi ve 200 bağlantı havuzlu bir ticaret web sitesinde kullanılmaktadır.

Doğru yapılandırmanız şartıyla çok iyi zaman aşımlarını işler.

Sürüm 2 devam ediyor ve birçok Üretim sorunu ele alındığı için güvenilir bir arka plana sahip.

Toplu sunucu çözümümüz için kullanıyoruz ve veritabanındaki milyonlarca satırda çalışan yüzlerce toplu iş çalıştırıyor.

Tomcat JDBC havuzu tarafından yapılan performans testleri, cp30'dan daha iyi bir performansa sahip olduğunu göstermektedir.


UBIK YÜK PAKETİ - Biz DBCP 1.4 kullanıyoruz ve 10000 kayıt ile tek bir parti sürekli askıya çalışıyor. Spring Batch + JSR 352 kullanıyoruz ve HikariCP'e geçmeyi düşünüyoruz. 100'lü partilerin düzgün çalıştığını söylediğinizde, DBCP 2.x veya başka bir sürümle çalıştığını mı kastediyorsunuz? Ayrıca, yapılandırmaları paylaşmayı düşünür müsünüz? Konfigürasyonumuz maxActive = 150, minIdle = 15, maxIdle = 75, initialSize = 15, ancak askıda kalma durumunu görmedim. Herhangi bir validationQuery veya testOnBorrow / testOnReturn kullanmıyoruz. Kullanmanızı tavsiye eder misiniz?
Yogendra

4

Sadece bir buçuk gün DBCP ile israf yaptık. En son DBCP sürümünü kullanmama rağmen, j pimmel ile aynı problemlerle karşılaştım . Ben DBCP hiç tavsiye etmem, özellikle DB giderken havuzdan bağlantıları atma, bu DB geri geldiğinde yeniden bağlanma yetersizliği ve dinamik olarak havuza geri bağlantı nesneleri eklemek için yetersizlik (sonsuza kadar asılı) JDBCconnect I / O soketinin okunması)

Şimdi C3P0'a geçiyorum. Bunu önceki projelerde kullandım ve bir cazibe gibi çalıştı ve performans gösterdi.


4

Mutingreading projeleri kullanırken c3p0 iyidir. Projelerimizde DBCP kullanarak aynı anda birden çok iş parçacığı yürütmesi kullandık, daha fazla iş parçacığı yürütmesi kullandıysak bağlantı zaman aşımı elde ettik. Bu yüzden c3p0 yapılandırması ile gittik.


3

Kullanımı kolay iyi bir alternatif DBPool'dur .

"Java tabanlı bir veritabanı bağlantısı havuz yardımcı programı, zaman tabanlı sona erme, deyim önbellekleme, bağlantı doğrulama ve bir havuz yöneticisi kullanarak kolay yapılandırma destekleyen."

http://www.snaq.net/java/DBPool/


DBPool ile BoneCP'yi karşılaştırdım. DBPool, getConnection () öğesini diğer şeylerin arasında senkronize hale getirir ve BoneCP'den çok daha yavaştır (bkz: jolbox.com/forum/viewtopic.php?f=3&t=175 ).
wwadge

3

Bağlantı havuzunu tanıtmamız gereken bir durumla karşılaştık ve önümüzde 4 seçenek vardı.

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

Ölçütlerimize göre bazı testler ve karşılaştırmalar yaptık ve HikariCP için gitmeye karar verdik. HikariCP'yi neden seçtiğimizi açıklayan bu makaleyi okuyun .


1

C3P0'ı en iyi şekilde uygulamak için bu cevabı kontrol edin

C3P0 :

Kurumsal uygulama için C3P0 en iyi yaklaşımdır. C3P0, jdbc3 spec ve jdbc2 std uzantısı tarafından açıklandığı gibi Bağlantı ve Bildirim Havuzlaması uygulayan DataSources dahil JNDI ile yüklenebilir DataSources ile geleneksel (DriverManager tabanlı) JDBC sürücülerini artırmak için kullanımı kolay bir kütüphanedir. C3P0 ayrıca, DB bağlantılarını ve özgeçmişte şeffaf yeniden bağlantılarını sağlam bir şekilde ele alırken, DBCP bağlantı altından çıkarıldıysa bağlantıları asla kurtarmadı.

Bu yüzden c3p0 ve diğer bağlantı havuzları da deyim önbellekleri hazırlamıştır - uygulama kodunun tüm bunlarla uğraşmaktan kaçınmasına izin verir. İfadeler genellikle bazı sınırlı LRU havuzunda tutulur, bu nedenle ortak ifadeler PreparedStatement örneğini yeniden kullanır.

Daha da kötüsü, DBCP, temel aktarımın bozulduğu uygulamaya Bağlantı nesnelerini döndürüyordu. C3p0 için yaygın bir kullanım durumu, Apache Tomcat'te bulunan standart DBCP bağlantı havuzunun yerini almaktır. Çoğu zaman, bir programcı DBCP bağlantı havuzunda bağlantıların doğru bir şekilde geri dönüştürülmediği bir durumda çalışır ve bu durumda c3p0 değerli bir alternatiftir.

Mevcut güncellemelerde C3P0'ın bazı mükemmel özellikleri var. bunlar feryat verilir:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

Burada, max ve min havuz boyutu bağlantı sınırlarını tanımlar, bu da bu uygulamanın ne kadar minimum ve maksimum bağlantı alacağı anlamına gelir. MaxIdleTime()boşta bağlantıyı ne zaman serbest bırakacağını tanımlar.

DBCP :

Bu yaklaşım da iyidir ancak bağlantı zaman aşımı ve bağlantı gerçekleştirme gibi bazı dezavantajları vardır. C3P0 mutithreading projeleri kullanırken iyidir. Projelerimizde DBCP kullanarak aynı anda birden çok iş parçacığı yürütmesi kullandık, daha fazla iş parçacığı yürütmesi kullandıysak bağlantı zaman aşımı elde ettik. Bu yüzden c3p0 yapılandırması ile gittik. Ben DBCP hiç tavsiye etmem, özellikle DB giderken havuzdan bağlantıları atma, bu DB geri geldiğinde yeniden bağlanma yetersizliği ve dinamik olarak havuza geri bağlantı nesneleri eklemek için yetersizlik (sonsuza kadar asılı) JDBCconnect I / O soketinin okunması)

Teşekkürler :)


1

benim tavsiyem

hikari> büyücü> UCP> c3p0> DBCP

Test ettiğim şeylere dayanıyor - 20190202, yerel test ortamımda (docker / pool'de 4GB mac / mysql minSize = 1, maxSize = 8), hikari bağlantı almak için 1024 iş parçacığı x 1024 kez hizmet verebilir, her iş parçacığı için ortalama süre c3p0 yalnızca 256 iş parçacığı x 1024 kez hizmet verebilir ve her iş parçacığının ortalama süresi zaten 21 milyon saniyedir. (512 iş parçacığı başarısız oldu).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.