Membuka koneksi database adalah operasi yang mahal, dan penggabungan koneksi digunakan untuk menjaga koneksi database tetap terbuka sehingga dapat digunakan kembali. Ini menghindari keharusan membuka sesi jaringan berulang kali, mengautentikasi, dan memeriksa otorisasi. Pooling membuat koneksi tetap aktif sehingga, ketika koneksi diminta nanti, salah satu koneksi yang aktif digunakan daripada harus membuatnya dari awal.
Pengumpulan Koneksi
Penyatuan koneksi telah menjadi salah satu metode paling umum untuk menangani koneksi database sebelum permintaan kueri. Kami biasanya berpikir bahwa koneksi ke database cepat tetapi itu tidak terjadi terutama ketika sejumlah besar klien terhubung. Tanpa penyatuan koneksi, permintaan akan memakan waktu hingga 35-50 mdtk untuk terhubung tetapi 1-2 mdtk jika penyatuan koneksi digunakan. Oleh karena itu, penyatuan koneksi adalah pra-alokasi koneksi database, dan kemudian mendaur ulangnya saat klien baru terhubung
Alasan Penyatuan Koneksi
- Untuk menghindari kerusakan pada server Anda. Server PostgreSQL terbatas pada sejumlah klien yang mereka tangani pada suatu waktu tergantung pada parameter memori. Jika angka ini terlampaui, maka Anda akan berakhir dengan crash server. Dengan penggabungan koneksi, klien menggunakan sejumlah koneksi.
- Memfasilitasi pemrosesan kueri. Biasanya, permintaan database dijalankan secara serial dengan kriteria first-in first-out. Dengan sejumlah besar klien, ini akan memakan waktu lama untuk mencapai proses ini. Oleh karena itu pendekatannya harus membuat koneksi tunggal dengan permintaan pipelined yang dapat dijalankan secara bersamaan daripada masing-masing pada satu waktu.
- Meningkatkan keamanan. Seringkali koneksi melibatkan jabat tangan yang mungkin memakan waktu rata-rata 25-35 ms di mana SSL dibuat, kata sandi diperiksa dan berbagi informasi konfigurasi. Semua pekerjaan ini untuk setiap pengguna yang terhubung akan menghasilkan penggunaan memori yang ekstensif. Namun, dengan penggabungan koneksi, jumlah koneksi berkurang sehingga menghemat memori.
Jenis Penyatuan Koneksi
Pada dasarnya ada dua jenis penyatuan koneksi, namun, ada jenis penyelesaian ketiga yang bertindak seperti strategi penyatuan sambungan yang dikenal sebagai sambungan persisten.
Pengumpulan Koneksi Persisten
Pendekatan ini bermaksud untuk menjaga koneksi awal tetap aktif sejak dimulai. Itu tidak sepenuhnya memegang fitur penyatuan koneksi tetapi cukup baik untuk menyediakan beberapa koneksi berkelanjutan. Ini cukup membantu untuk sekumpulan kecil koneksi klien yang overheadnya dapat berkisar antara 25-50 ms. Batasan dengan pendekatan ini adalah terbatas pada sejumlah koneksi ke db dengan biasanya satu koneksi per entri ke server.
Pengumpulan Koneksi Kerangka
Penyatuan koneksi kerangka kerja terjadi pada tingkat aplikasi di mana, setiap kali skrip server Anda dimulai, kumpulan koneksi dibuat untuk menangani permintaan kueri yang akan datang nanti.
Pengumpulan Koneksi Mandiri
Untuk setiap koneksi ke database, memori overhead antara 5 hingga 10 MB digunakan untuk memenuhi permintaan kueri. Ini tidak cukup baik untuk sejumlah besar koneksi. Menggunakan penyatuan koneksi kerangka kerja dapat dibatasi oleh jumlah koneksi ini karena mungkin menghadapi penggunaan ukuran memori yang besar. Oleh karena itu, kami memilih untuk menggunakan penyatuan koneksi Standalone yang dikonfigurasi sesuai dengan sesi, pernyataan, dan transaksi Postgres. Keuntungan inti yang terkait dengan pendekatan ini adalah:biaya overhead minimal sekitar 2 kb untuk setiap koneksi.
Saat Anda membuat kelas penyatuan koneksi, kelas tersebut harus memenuhi faktor berikut untuk meningkatkan kinerja database:
- Alokasikan terlebih dahulu koneksi
- Awasi koneksi yang tersedia
- Tetapkan koneksi baru
- Tunggu hingga koneksi tersedia
- Tutup sambungan
Alokasikan Koneksi terlebih dahulu
Memastikan lebih banyak koneksi terlebih dahulu akan memudahkan penanganan permintaan pada saat aplikasi telah dimulai. Misalnya jika server Anda dikembangkan dengan Java, Anda dapat menggunakan vektor untuk menyimpan koneksi idle yang tersedia menggunakan kode di bawah ini.
availableConnections = new Vector(connections);
busyConnections = new Vector();
for(int i=0; i<connections; i++) {
availableConnections.addElement(makeNewConnection());
}
Mengawasi Koneksi yang Tersedia
Kelas harus dapat memeriksa koneksi idle apa pun dalam daftar koneksi sibuk dan mengembalikannya. Ini pada dasarnya dilakukan untuk menggunakan kembali koneksi atau menutup koneksi yang tidak digunakan. Terkadang waktu koneksi habis maka saat mengembalikan koneksi, sangat penting untuk memeriksa apakah masih terbuka. Jika tidak, Anda harus membuang koneksi ini dan mengulangi prosesnya. Ketika koneksi dibuang, slot dibuka yang dapat digunakan untuk memproses koneksi baru ketika batas telah tercapai. Hal ini dapat dicapai dengan
public synchronized Connection getConnection() throws SQLException {
if (!availableConnections.isEmpty()) { Connection existingConnection =
(Connection)availableConnections.lastElement(); int lastIndex = availableConnections.size() - 1; availableConnections.removeElementAt(lastIndex); if (existingConnection.isClosed()) {
notifyAll(); // Freed up a spot for anybody waiting.
return(getConnection()); // Repeat process. } else {
busyConnections.addElement(existingConnection);
return(existingConnection); }
} }
Menetapkan Koneksi Baru
Anda seharusnya dapat memulai utas latar belakang untuk menetapkan koneksi baru jika tidak ada waktu siaga yang tersedia dan jika batas koneksi hampir tercapai.
if ((totalConnections() < maxConnections) && !connectionPending) { // Pending = connecting in bg
makeBackgroundConnection(); }
try {
wait(); // Give up lock and suspend self.
} catch(InterruptedException ie) {} return(getConnection()); // Try again.
Menunggu Koneksi Baru
Ketika tidak ada koneksi yang menganggur dan batas koneksi telah tercapai, konfigurasi harus dapat menunggu koneksi baru tersedia tanpa penyatuan terus-menerus. Kita dapat melakukannya menggunakan metode tunggu yang menyediakan kunci sinkronisasi utas dan menangguhkan utas hingga pemberitahuan diberikan.
try {
wait();
} catch(InterruptedException ie) {}
return(getConnection());
Untuk etika aplikasi yang baik, klien tidak harus menunggu koneksi secara real time, tetapi Anda akan memberikan pengecualian saat koneksi tidak ada dengan kode di bawah ini:
throw new SQLException("Connection limit reached");
Menutup Koneksi
Ketika koneksi adalah sampah yang dikumpulkan, Anda harus menutupnya daripada melakukannya secara eksplisit. Namun, jika Anda ingin pendekatan eksplisit untuk menutup koneksi, Anda dapat menggunakan:
public synchronized void closeAllConnections() {
// The closeConnections method loops down Vector, calling // close and ignoring any exceptions thrown. closeConnections(availableConnections); availableConnections = new Vector(); closeConnections(busyConnections);
busyConnections = new Vector();
}
Kesimpulan
Penggabungan koneksi untuk PostgreSQL membantu kami mengurangi jumlah sumber daya yang diperlukan untuk menghubungkan ke database dan meningkatkan kecepatan konektivitas ke database. Hal ini dicapai dengan menggabungkan koneksi ke DB, memelihara koneksi ini dan akibatnya mengurangi jumlah koneksi yang harus dibuka.