Opsi penyatuan koneksi dengan JDBC: DBCP vs C3P0


312

Apa perpustakaan pooling koneksi terbaik yang tersedia untuk Java / JDBC?

Saya sedang mempertimbangkan 2 kandidat utama (gratis / sumber terbuka):

Saya sudah membaca banyak tentang mereka di blog dan forum lain tetapi tidak bisa mencapai keputusan.

Apakah ada alternatif yang relevan untuk keduanya?

Jawaban:


181

DBCP kedaluwarsa dan bukan tingkat produksi. Beberapa waktu lalu kami melakukan analisis di rumah dari keduanya, menciptakan perlengkapan uji yang menghasilkan beban dan konkurensi terhadap keduanya untuk menilai kesesuaian mereka dalam kondisi kehidupan nyata.

DBCP secara konsisten menghasilkan pengecualian ke dalam aplikasi pengujian kami dan berjuang untuk mencapai tingkat kinerja yang C3P0 lebih dari mampu menangani tanpa pengecualian.

C3P0 juga secara kuat menangani pemutusan DB dan transparan menghubungkan kembali pada resume sedangkan DBCP tidak pernah memulihkan koneksi jika tautan diambil dari bawahnya. Yang lebih buruk lagi, DBCP mengembalikan objek Connection ke aplikasi yang transpor dasarnya telah rusak.

Sejak itu kami telah menggunakan C3P0 dalam 4 aplikasi web konsumen berat dan tidak pernah melihat ke belakang.

UPDATE: Ternyata setelah bertahun-tahun duduk di rak, orang-orang Apache Commons telah mengeluarkan DBCP dari dormansi dan sekarang, sekali lagi, sebuah proyek yang dikembangkan secara aktif. Jadi posting asli saya mungkin kedaluwarsa.

Yang sedang berkata, saya belum mengalami kinerja perpustakaan baru yang ditingkatkan ini, juga belum mendengarnya secara de-facto dalam kerangka kerja aplikasi apa pun, belum.


2
Terima kasih! Bagaimana dengan alternatif Proxool yang disarankan? Versi Hibernate saat ini hadir dengan c3p0 dan Proxool.
Dema

Kami belum mencoba Proxool tapi aku akan pastikan untuk check it out sekarang :)
j Pimmel

5
c3p0 memiliki beberapa kekurangan. terkadang gagal menangani puncak koneksi.
Janning

3
banyak hal telah berubah sejak 4 tahun ketika Anda pertama kali memposting jawaban ini, dapatkah Anda menambahkan pembaruan yang membagikan skenario saat ini, jika memungkinkan?
Rajat Gupta

13
Saya sangat merekomendasikan HikariCP , tetapi kemudian saya membantu menulisnya.
brettw

177

Saya mengundang Anda untuk mencoba BoneCP - gratis, open source, dan lebih cepat daripada alternatif yang tersedia (lihat bagian benchmark).

Penafian: Saya penulis sehingga Anda bisa mengatakan saya bias :-)

PEMBARUAN: Sampai Maret 2010, masih sekitar 35% lebih cepat dari kumpulan baru Apache DBCP ("tomcat jdbc") yang ditulis ulang. Lihat tautan patokan dinamis di bagian patokan.

Pembaruan # 2: (Des '13) Setelah 4 tahun di atas, sekarang ada pesaing yang jauh lebih cepat: https://github.com/brettwooldridge/HikariCP

Pembaruan # 3: (Sep '14) Harap pertimbangkan BoneCP tidak digunakan lagi pada saat ini, rekomendasikan untuk beralih ke HikariCP .

Pembaruan # 4: (April '15) - Saya tidak lagi memiliki domain jolbox.com


1
Akan sangat senang mendapatkan pemecahan masalah menggunakan BoneCP sebagai Datasource Tomcat. Masalah utama yang saya miliki dengan ini adalah bahwa diperlukan Kelas BoneCP di lib dir tomcat, serta kelas log4j dan google. Melakukan hal ini membuat kolam koneksi berfungsi - (tidak berfungsi saat di WAR) - namun bertentangan dengan pengaturan log4j dari Tomcat dan mencegah output log sama sekali dari aplikasi, yang merupakan dealbreaker ...
j pimmel

1
Ini terdengar seperti masalah log4j lebih dari apa pun. Berikan saya baris di forum.jolbox.com dan saya akan membantu Anda melacaknya ASAP.
wwadge

3
1up, BoneCP brilian. Beralih dari C3P0. Bahkan memungkinkan saya untuk menghapus ketergantungan saya pada log4jdbc-remix, karena memungkinkan pernyataan keluar dari kotak!
subes

68
+1 untuk memperbarui tentang sesuatu yang tidak Anda tulis menjadi lebih cepat!
CorayThan

1
@AndrewScottEvans Mungkin yang terbaik untuk kembali ke v0.7.1
wwadge

16

Saya mengalami masalah dengan DBCP ketika koneksi habis sehingga saya menguji coba c3p0. Saya akan merilis ini untuk produksi tetapi kemudian mulai pengujian kinerja. Saya menemukan bahwa c3p0 tampil sangat buruk. Saya tidak bisa mengkonfigurasinya untuk bekerja dengan baik. Saya menemukannya dua kali lebih lambat dari DBCP.

Saya kemudian mencoba pooling koneksi Tomcat .

Ini dua kali lebih cepat dari c3p0 dan memperbaiki masalah lain yang saya alami dengan DBCP. Saya menghabiskan banyak waktu untuk menyelidiki dan menguji 3 kolam. Saran saya jika Anda menggunakan Tomcat adalah menggunakan kolam Tomcat JDBC baru.


14

Untuk masalah koneksi ulang otomatis dengan DBCP, apakah ada yang mencoba menggunakan 2 parameter konfigurasi berikut?

validationQuery="Some Query"

testOnBorrow=true

Mengenai dokumentasi , testOnBorrowmemiliki nilai default true, jadi jika validationQuerydidefinisikan DBCP akan menguji setiap koneksi sebelum diteruskan ke aplikasi.
dma_k


12

Telah menggunakan DBCP selama beberapa tahun sekarang dalam produksi. Itu stabil, selamat dari reboot server DB. Cukup konfigurasikan dengan benar. Ini hanya membutuhkan beberapa parameter yang ditentukan, jadi jangan malas. Berikut ini cuplikan dari kode produksi sistem kami yang mencantumkan parameter yang kami tetapkan secara eksplisit untuk membuatnya berfungsi:

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

Berikut adalah beberapa artikel yang menunjukkan bahwa DBCP memiliki kinerja yang jauh lebih tinggi daripada C3P0 atau Proxool. Juga dalam pengalaman saya sendiri, c3p0 memang memiliki beberapa fitur yang bagus, seperti kumpulan pernyataan yang disiapkan dan lebih dapat dikonfigurasi daripada DBCP, tetapi DBCP jelas lebih cepat di lingkungan mana pun saya menggunakannya.

Perbedaan antara dbcp dan c3p0? Sama sekali tidak ada! (Blog pengembang Sakai) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

Lihat juga suka ke artikel JavaTech "Connection Pool Showdown" di komentar di posting blog.


4
lebih cepat di lingkungan berulir tunggal, mungkin, kereta dan tidak stabil dan hanya rusak di tempat lain.

7

Alternatif lain, Proxool, disebutkan dalam artikel ini .

Anda mungkin dapat mengetahui mengapa Hibernate bundel c3p0 untuk implementasi kumpulan koneksi default?


7

Sayangnya mereka semua ketinggalan zaman. DBCP telah diperbarui sedikit baru-baru ini, dua lainnya berusia 2-3 tahun, dengan banyak bug yang beredar.


Itu benar - rilis terakhir C3PO (pra-rilis 0,9) adalah dari Mei 2007. Rilis terbaru Proxool (0,9 pra-rilis) adalah dari Agustus 2008. Rilis terakhir DBCP juga dari Apr 2007, tetapi setidaknya rilis 1.2 yang stabil. Apakah ada yang benar-benar terawat di sana?
Guss

4
Agar adil ini bukan proyek besar sehingga Anda harus mengharapkan semakin sedikit pembaruan di C3P0 / DBCP dan waktu berlalu.
wwadge

7

Dbcp siap produksi jika dikonfigurasi dengan benar.

Ini misalnya digunakan pada situs web perdagangan 350000 pengunjung / hari dan dengan kumpulan 200 koneksi.

Ini menangani timeout dengan sangat baik asalkan Anda mengkonfigurasinya dengan benar.

Versi 2 sedang dalam proses dan memiliki latar belakang yang membuatnya dapat diandalkan karena Banyak masalah produksi telah ditangani.

Kami menggunakannya untuk solusi server batch kami dan telah menjalankan ratusan batch yang bekerja pada jutaan baris dalam database.

Tes kinerja yang dijalankan oleh tomcat jdbc pool menunjukkan kinerja yang lebih baik daripada cp30.


PACK LOAD UBIK - Kami menggunakan DBCP 1.4 dan menjalankan hang konstan batch tunggal kami dengan 10.000 catatan. Kami menggunakan Spring Batch + JSR 352 dan berpikir untuk beralih ke HikariCP. Ketika Anda mengatakan, 100 dari batch berjalan dengan lancar, maksud Anda menjalankannya dengan DBCP 2.x atau versi lain? Juga, maukah Anda berbagi konfigurasi? Konfigurasi kami adalah maxActive = 150, minIdle = 15, maxIdle = 75, initialSize = 15 tetapi tidak melihat hang hilang. Kami tidak menggunakan Kueri validasi atau testOnBorrow / testOnReturn. Apakah Anda merekomendasikan menggunakannya?
Yogendra

4

Baru saja selesai membuang setengah hari dengan DBCP. Meskipun saya menggunakan rilis DBCP terbaru, saya mengalami masalah yang sama persis seperti j pimmel . Saya tidak akan merekomendasikan DBCP sama sekali, terutama itu adalah kemampuan membuang koneksi keluar dari kolam ketika DB hilang, ketidakmampuan untuk menyambung kembali ketika DB kembali dan ketidakmampuannya untuk secara dinamis menambahkan objek koneksi kembali ke kolam (itu menggantung selamanya di posting JDBCconnect I / O socket baca)

Saya beralih ke C3P0 sekarang. Saya telah menggunakannya dalam proyek-proyek sebelumnya dan itu bekerja dan tampil seperti pesona.


4

c3p0 bagus ketika kita menggunakan proyek mutithreading. Dalam proyek kami, kami menggunakan beberapa eksekusi utas secara bersamaan dengan menggunakan DBCP, lalu kami mendapat batas waktu koneksi jika kami menggunakan lebih banyak eksekusi utas. Jadi kami pergi dengan konfigurasi c3p0.



3

Kami menemukan situasi di mana kami perlu memperkenalkan koneksi pool dan kami memiliki 4 pilihan di depan kami.

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

Kami melakukan beberapa tes dan perbandingan berdasarkan kriteria kami dan memutuskan untuk mengikuti HikariCP. Baca artikel ini yang menjelaskan mengapa kami memilih HikariCP.


1

Untuk Menerapkan C3P0 dengan cara terbaik maka periksa jawaban ini

C3P0 :

Untuk aplikasi perusahaan, C3P0 adalah pendekatan terbaik. C3P0 adalah pustaka yang mudah digunakan untuk menambah driver JDBC (berbasis DriverManager) tradisional dengan JNDI-bindable DataSources, termasuk DataSources yang mengimplementasikan Connection and Statement Pooling, seperti yang dijelaskan oleh spesifikasi jdbc3 dan ekstensi jdbc2 std. C3P0 juga secara kuat menangani pemutusan DB dan transparan menghubungkan kembali pada resume sedangkan DBCP tidak pernah memulihkan koneksi jika tautan diambil dari bawahnya.

Jadi inilah mengapa c3p0 dan kumpulan koneksi lain juga telah menyiapkan cache pernyataan - ini memungkinkan kode aplikasi untuk menghindari berurusan dengan semua ini. Pernyataan biasanya disimpan dalam kumpulan LRU terbatas, sehingga pernyataan umum menggunakan kembali contoh PreparedStatement.

Yang lebih buruk lagi, DBCP mengembalikan objek Connection ke aplikasi yang transpor dasarnya telah rusak. Kasus penggunaan umum untuk c3p0 adalah mengganti kumpulan koneksi DBCP standar yang disertakan dengan Apache Tomcat. Sering kali, seorang programmer akan mengalami situasi di mana koneksi tidak didaur ulang dengan benar di kumpulan koneksi DBCP dan c3p0 adalah pengganti yang berharga dalam kasus ini.

Dalam pembaruan terkini, C3P0 memiliki beberapa fitur cemerlang. itu diberikan di bawah ini:

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

Di sini, max dan min poolsize menentukan batas-batas koneksi yang berarti bagaimana koneksi minimum dan maksimum yang akan diambil aplikasi ini. MaxIdleTime()tentukan kapan akan melepaskan koneksi idle.

DBCP :

Pendekatan ini juga bagus tetapi memiliki beberapa kelemahan seperti koneksi timeout dan koneksi realeasing. C3P0 baik ketika kita menggunakan proyek mutithreading. Dalam proyek kami, kami menggunakan beberapa eksekusi utas secara bersamaan dengan menggunakan DBCP, lalu kami mendapat batas waktu koneksi jika kami menggunakan lebih banyak eksekusi utas. Jadi kami pergi dengan konfigurasi c3p0. Saya tidak akan merekomendasikan DBCP sama sekali, terutama itu adalah kemampuan membuang koneksi keluar dari kolam ketika DB hilang, ketidakmampuan untuk menyambung kembali ketika DB kembali dan ketidakmampuannya untuk secara dinamis menambahkan objek koneksi kembali ke kolam (itu menggantung selamanya di posting JDBCconnect I / O socket baca)

Terima kasih :)


1

rekomendasi saya adalah

hikari> druid> UCP> c3p0> DBCP

Ini didasarkan pada apa yang saya uji - 20190202, di lingkungan pengujian lokal saya (4GB mac / mysql di docker / pool minSize = 1, maxSize = 8), hikari dapat melayani 1024 utas x 1024 kali untuk mendapatkan koneksi, waktu rata-rata untuk setiap utas untuk menyelesaikan adalah 1 atau 2 juta detik, sedangkan c3p0 hanya dapat melayani 256 utas x 1024 kali dan waktu rata-rata untuk setiap utas sudah 21 juta detik. (512 utas gagal).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.