Skip to content

Mengoptimalkan Koneksi Database dengan pg.Pool di Node.js

Updated: at 14.42

Halo! Pernah mengembangkan aplikasi web atau perangkat lunak lain yang membutuhkan query database secara berkala? Jika ya, maka Kita perlu mengenal pg.Pool. Dalam artikel ini, kita akan menyelami keajaiban pg.Pool dan bagaimana ia dapat membantu Kita mengoptimalkan koneksi database dalam aplikasi Node.js Anda.

Apa itu pg.Pool?

pg.Pool adalah kelas dalam library node-postgres yang merepresentasikan sekumpulan koneksi ke database PostgreSQL. Bayangkan pg.Pool sebagai manajer yang cerdas dan efisien yang mengatur koneksi database untuk Anda. Alih-alih membuat koneksi baru setiap kali Kita membutuhkannya, pg.Pool mempertahankan sekelompok koneksi yang siap digunakan kapan saja.

Mengapa Menggunakan pg.Pool?

Berikut adalah beberapa alasan mengapa menggunakan pg.Pool sangat penting:

  1. Performa: Membuat koneksi baru ke server PostgreSQL memerlukan handshake yang dapat memakan waktu 20-30 milidetik. Selama waktu ini, dilakukan negosiasi kata sandi, pembentukan SSL (jika digunakan), dan pertukaran informasi konfigurasi antara klien dan server. Jika kita harus mengeluarkan biaya ini setiap kali ingin mengeksekusi query, performa aplikasi kita akan menurun secara signifikan.

  2. Keterbatasan Jumlah Koneksi: Server PostgreSQL hanya dapat menangani sejumlah terbatas klien pada satu waktu. Bergantung pada memori yang tersedia pada server PostgreSQL Anda, terlalu banyak koneksi bahkan dapat menyebabkan crash pada server. Pernah suatu kali saya tidak sengaja membuat crash pada sebuah server PostgreSQL produksi di RDS karena membuka koneksi baru tanpa menutupnya dalam sebuah aplikasi Python. Pengalaman yang tidak menyenangkan!

  3. Eksekusi Query Secara Serial: PostgreSQL hanya dapat memproses satu query pada satu waktu untuk satu klien yang terhubung, dengan menggunakan metode first-in first-out (FIFO). Jika aplikasi web multi-tenant Kita hanya menggunakan satu klien yang terhubung, semua query dari semua permintaan yang bersamaan akan dijalankan secara serial, satu per satu. Tidak efisien!

Kabar Baiknya

node-postgres hadir dengan fitur connection pooling bawaan melalui modul pg-pool. Kita dapat memiliki sekelompok klien yang dapat dipinjam, digunakan, dan dikembalikan. Umumnya, Kita hanya membutuhkan sejumlah terbatas pool dalam aplikasi Anda, biasanya cukup satu saja. Membuat terlalu banyak pool justru menghilangkan manfaat dari pooling itu sendiri.

Contoh Penggunaan pg.Pool

Meminjam, Menggunakan, dan Mengembalikan Klien

import { Pool } from "pg";

const pool = new Pool();

// Pool akan memancarkan error atas nama klien idle yang ada di dalamnya
// jika terjadi kesalahan backend atau partisi jaringan
pool.on("error", (err, client) => {
  console.error("Unexpected error on idle client", err);
  process.exit(-1);
});

const client = await pool.connect();
const res = await client.query("SELECT * FROM users WHERE id = $1", [1]);
console.log(res.rows[0]);
client.release();

⚠️ Peringatan Penting!

Anda harus selalu mengembalikan klien ke pool jika berhasil meminjamnya, terlepas dari apakah terjadi kesalahan pada query yang Kita jalankan atau tidak.

Jika Kita tidak mengembalikan klien, aplikasi Kita akan mengalami kebocoran klien dan pada akhirnya pool Kita akan kosong selamanya. Semua permintaan di masa depan untuk meminjam klien dari pool akan menunggu tanpa batas.

Eksekusi Single Query

Jika Kita hanya perlu menjalankan satu query dan tidak membutuhkan transaksi, pg.Pool menyediakan metode praktis untuk mengeksekusi query pada klien mana pun yang tersedia dalam pool. Ini adalah cara yang direkomendasikan untuk melakukan query dengan node-postgres jika memungkinkan, karena menghilangkan risiko kebocoran klien.

import { Pool } from "pg";

const pool = new Pool();

const res = await pool.query("SELECT * FROM users WHERE id = $1", [1]);
console.log("user:", res.rows[0]);

Mematikan Pool

Untuk mematikan pool, panggil metode pool.end(). Metode ini akan menunggu hingga semua klien yang dipinjam dikembalikan, kemudian mematikan semua klien dan timer pool.

import { Pool } from "pg";

const pool = new Pool();

console.log("starting async query");
const result = await pool.query("SELECT NOW()");
console.log("async query finished");

console.log("starting callback query");
pool.query("SELECT NOW()", (err, res) => {
  console.log("callback query finished");
});

console.log("calling end");
await pool.end();
console.log("pool has drained");

Output dari kode di atas akan menjadi:

starting async query
async query finished
starting callback query
calling end
callback query finished
pool has drained

Tips dan Best Practice

Untuk memaksimalkan penggunaan pg.Pool, perhatikan tips dan best practice berikut:

  1. Atur jumlah koneksi: Sesuaikan nilai max sesuai dengan kebutuhan aplikasi Anda. Terlalu banyak koneksi dapat mempengaruhi performa database, sementara terlalu sedikit dapat menyebabkan bottleneck.

  2. Gunakan environment variable: Simpan konfigurasi koneksi database dalam environment variable untuk memudahkan manajemen dan meningkatkan keamanan.

  3. Jangan gunakan pool.query dalam transaksi: Untuk transaksi, gunakan pg.Client secara langsung dengan satu koneksi yang sama untuk semua pernyataan dalam transaksi.

  4. Tangani kesalahan dengan hati-hati: Pastikan Kita menangani kesalahan yang mungkin terjadi saat mengeksekusi query. Berikan pesan kesalahan yang informatif untuk memudahkan debugging.

  5. Pantau performa: Gunakan alat monitoring untuk melacak penggunaan koneksi, waktu respon, dan metrik performa lainnya. Ini akan membantu Kita mengidentifikasi bottleneck dan mengoptimalkan aplikasi Anda.

Kesimpulan

Selamat! Kita sekarang telah menguasai seni menggunakan pg.Pool dalam aplikasi Node.js Anda. Dengan memanfaatkan kekuatan pool koneksi, Kita dapat mengoptimalkan performa, meningkatkan skalabilitas, dan menyederhanakan manajemen koneksi database.

Ingatlah untuk selalu menggunakan parameter dalam query, menangani kesalahan dengan hati-hati, dan menyesuaikan konfigurasi pool sesuai kebutuhan aplikasi Anda. Dengan pengetahuan ini di tangan Anda, Kita siap untuk mengembangkan aplikasi Node.js yang luar biasa dengan PostgreSQL sebagai fondasi data yang kuat.

Jadi, selami lebih dalam, eksplorasilah, dan nikmati kemudahan yang ditawarkan oleh pg.Pool!

Happy coding! 🚀