Adakah yang bisa memberikan contoh atau tautan tentang cara membuat kumpulan koneksi JDBC?
Dari pencarian google saya melihat banyak cara berbeda untuk melakukan ini dan itu agak membingungkan.
Pada akhirnya saya memerlukan kode untuk mengembalikan java.sql.Connection
objek, tetapi saya mengalami kesulitan untuk memulai .. saran apa pun diterima.
Pembaruan: Apakah tidak javax.sql
atau java.sql
memiliki implementasi koneksi gabungan? Mengapa tidak lebih baik menggunakan ini?
Jawaban:
Jika Anda memerlukan kumpulan koneksi mandiri, preferensi saya pergi ke C3P0 daripada DBCP (yang telah saya sebutkan dalam jawaban sebelumnya ), saya hanya mengalami terlalu banyak masalah dengan DBCP di bawah beban berat. Menggunakan C3P0 sangat sederhana. Dari dokumentasi :
Tetapi jika Anda menjalankan di dalam server aplikasi, saya akan merekomendasikan untuk menggunakan kumpulan koneksi built-in yang disediakannya. Dalam hal ini, Anda harus mengonfigurasinya (lihat dokumentasi server aplikasi Anda) dan untuk mengambil Sumber Data melalui JNDI:
sumber
Biasanya jika Anda memerlukan kumpulan koneksi, Anda menulis aplikasi yang berjalan di beberapa lingkungan yang dikelola, yaitu Anda berjalan di dalam server aplikasi. Jika demikian, pastikan untuk memeriksa fasilitas penggabungan koneksi yang disediakan server aplikasi Anda sebelum mencoba opsi lain.
Solusi out-of-the box akan menjadi yang terbaik yang terintegrasi dengan fasilitas server aplikasi lainnya. Namun jika Anda tidak menjalankan di dalam server aplikasi, saya akan merekomendasikan Komponen DBCP Apache Commons . Ini banyak digunakan dan menyediakan semua fungsionalitas penggabungan dasar yang dibutuhkan sebagian besar aplikasi.
sumber
HikariCP
Ini modern, cepat, sederhana. Saya menggunakannya untuk setiap proyek baru. Saya lebih suka itu daripada C3P0, tidak tahu kolam lain terlalu baik.
sumber
Jangan menemukan kembali roda.
Coba salah satu komponen pihak ketiga yang tersedia:
Apache DBCP hadir dengan contoh berbeda tentang cara menyiapkan javax.sql.DataSource penggabungan . Berikut ini satu contoh yang dapat membantu Anda memulai.
sumber
disclecsia
menjadi lebih baik dari saya. Anda dapat melihat bahwa tautannya benar. :)tomcat-jdbc
. Anda bisa mendapatkannya dari Maven Central ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.org/…Saya akan merekomendasikan menggunakan pustaka commons-dbcp . Ada banyak contoh yang terdaftar tentang cara menggunakannya, berikut adalah tautan ke langkah sederhana . Penggunaannya sangat sederhana:
Anda hanya perlu membuat sumber data satu kali, jadi pastikan Anda membaca dokumentasinya jika tidak tahu cara melakukannya. Jika Anda tidak mengetahui cara menulis pernyataan JDBC dengan benar sehingga Anda tidak membocorkan sumber daya, Anda juga mungkin ingin membaca halaman Wikipedia ini .
sumber
javax.sql.DataSource
definisi antarmuka mengandung sebuah implementasi dari "Connection pooling“(selain itu, saya pikir Anda sudah tahu apa antarmuka JDBC adalah).Di server aplikasi yang kami gunakan tempat saya bekerja (Oracle Application Server 10g, seingat saya), penggabungan ditangani oleh server aplikasi. Kami mengambil
javax.sql.DataSource
menggunakan pencarian JNDI denganjavax.sql.InitialContext
.itu melakukan sesuatu seperti ini
(Kami tidak menulis kode ini, itu disalin dari dokumentasi ini .)
sumber
Kolam
performance
[Dengan menggunakan kembali objek yang sama untuk melakukan tindakan apa pun pada Object-Data] &memory
[mengalokasikan dan mengalokasikan banyak objek menciptakan overhead manajemen memori yang signifikan].«Pooling [
Object
pool,String
Constant Pool,Thread
Pool, Connection pool]Kumpulan string konstan
Contoh: String untuk memverifikasi Objek Unik dari kumpulan.
Kolam koneksi menggunakan Type-4 driver menggunakan perpustakaan pihak ke-3 [
DBCP2
,c3p0
,Tomcat JDBC
]Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wikiDalam mekanisme Connection pool, ketika kelas dimuat, ia mengambil
physical JDBC connection
objek dan menyediakan objek koneksi fisik yang dibungkus kepada pengguna.PoolableConnection
adalah pembungkus di sekitar koneksi yang sebenarnya.getConnection()
pilih salah satu dari koneksi terbungkus bebas dari objectpool koneksi dan mengembalikannya.close()
alih-alih menutupnya, ia mengembalikan koneksi yang dibungkus kembali ke kumpulan.Contoh: Menggunakan ~ DBCP2 Connection Pool dengan Java 7 [
try-with-resources
]jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
Aplikasi Web : Untuk menghindari masalah koneksi ketika semua koneksi ditutup [MySQL "wait_timeout" default 8 jam] untuk membuka kembali koneksi dengan DB yang mendasarinya.
Anda dapat melakukan ini untuk Menguji Setiap Koneksi dengan menyetel testOnBorrow = true dan validationQuery = "SELECT 1" dan jangan menggunakan autoReconnect untuk server MySQL karena sudah usang. isu
Lihat ini juga:
sumber
public class StringPoolTest
hanya memiliki 2 metode void sehingga mereka tidak mengembalikan apa pun. Apakah kode tersebut benar-benar melalui proses pengelolaan kumpulan string? Ia bahkan tidak menggunakan argumen apapun.s1
tidak ditentukan?ConnectionPool
Kelas Anda . Terima kasih banyak.Di akhir 2017 Proxool, BoneCP, C3P0, DBCP sebagian besar tidak berfungsi saat ini. HikariCP (dibuat pada tahun 2012) tampaknya menjanjikan, menutup pintu dari hal lain yang saya ketahui. http://www.baeldung.com/hikaricp
Proxool memiliki sejumlah masalah:
- Di bawah beban berat dapat melebihi jumlah maksimum koneksi dan tidak kembali di bawah max
- Dapat mengatur untuk tidak kembali ke koneksi min bahkan setelah koneksi kedaluwarsa
- Dapat mengunci seluruh kumpulan (dan semua utas server / klien) jika mengalami masalah saat menyambungkan ke database selama utas HouseKeeper (tidak menggunakan .setQueryTimeout)
- utas HouseKeeper, saat memiliki kunci kumpulan koneksi untuk prosesnya, meminta utas Prototyper untuk membuat ulang koneksi (sapuan) yang dapat mengakibatkan kondisi balapan / kemacetan. Dalam panggilan metode ini, parameter terakhir harus selalu sweep: false selama pengulangan, hanya sweep: true di bawahnya.
- HouseKeeper hanya membutuhkan satu sapuan PrototypeController di akhir dan memiliki lebih banyak [disebutkan di atas]
- Thread HouseKeeper memeriksa pengujian koneksi sebelum melihat koneksi apa yang mungkin kedaluwarsa [beberapa risiko pengujian koneksi kedaluwarsa yang mungkin rusak / diakhiri melalui timeout lain ke DB di firewall, dll.]
- Proyek memiliki kode yang belum selesai (properti yang ditentukan tetapi tidak ditindaklanjuti)
- Masa pakai koneksi maks default jika tidak ditentukan adalah 4 jam (berlebihan)
- Utas HouseKeeper berjalan setiap lima detik per kumpulan (berlebihan)
Anda dapat mengubah kode dan melakukan peningkatan ini. Tapi seperti yang dibuat pada tahun 2003, dan diperbarui pada tahun 2008, kurang 10 tahun perbaikan java yang digunakan oleh solusi seperti hikaricp.
sumber
Seperti yang dijawab oleh orang lain, Anda mungkin akan senang dengan Apache Dbcp atau c3p0 . Keduanya populer, dan berfungsi dengan baik.
Tentang keraguan Anda
Mereka tidak menyediakan implementasi, melainkan antarmuka dan beberapa kelas dukungan, hanya relevan bagi pemrogram yang mengimplementasikan pustaka pihak ketiga (kumpulan atau driver). Biasanya Anda bahkan tidak melihat itu. Kode Anda harus menangani koneksi dari pool Anda seperti koneksi "biasa", dengan cara yang transparan.
sumber
Vibur DBCP adalah perpustakaan lain untuk tujuan itu. Beberapa contoh yang menunjukkan bagaimana mengkonfigurasinya untuk digunakan dengan Hibernate, Spring + Hibernate, atau secara programatik, dapat ditemukan di situsnya: http://www.vibur.org/
Lihat juga penafian di sini .
sumber
Apache Commons memiliki perpustakaan untuk tujuan itu: DBCP . Kecuali Anda memiliki persyaratan aneh di sekitar kolam Anda, saya akan menggunakan perpustakaan karena itu pasti lebih rumit dan lebih halus daripada yang Anda harapkan.
sumber
Anda harus mempertimbangkan untuk menggunakan UCP. Universal Connection Pool (UCP) adalah kolam koneksi Java. Ini adalah kumpulan koneksi yang kaya fitur dan terintegrasi erat dengan database Oracle Real Application Clusters (RAC), ADG, DG.
Lihat halaman ini untuk detail lebih lanjut tentang UCP.
sumber
MiniConnectionPoolManager
adalah implementasi satu file java, jika Anda mencari solusi yang dapat disematkan dan tidak terlalu peduli dengan kinerja (meskipun saya belum mengujinya dalam hal itu).Ini adalah EPL multi-lisensi , LGPL dan MPL .
Dokumentasinya juga memberikan alternatif yang layak untuk diperiksa (selain DBCP dan C3P0):
sumber