Saat aplikasi Anda mempertahankan ribuan koneksi bersamaan atau membuat koneksi dengan frekuensi tinggi, PolarDB for PostgreSQL (Compatible with Oracle) mengalami tekanan: setiap koneksi memerlukan proses backend khusus, dan overhead proses tersebut menurunkan performa. Fitur pooling koneksi tingkat transaksi mengarahkan seluruh lalu lintas klien melalui PolarProxy, sehingga beberapa koneksi frontend dapat berbagi satu koneksi backend. Hal ini secara signifikan mengurangi jumlah proses backend dan meningkatkan throughput database.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
PolarProxy V2.3.46 atau yang lebih baru
Cara kerja
PolarProxy berada di antara aplikasi Anda dan database backend. Alih-alih membuat koneksi backend untuk setiap koneksi klien, PolarProxy mempertahankan kolam koneksi backend dan menggunakannya kembali di berbagai transaksi:
Klien terhubung ke PolarProxy.
PolarProxy memeriksa kolam untuk mencari koneksi backend idle yang sesuai dengan pengaturan
user,dbname, dan variabel sistem dari permintaan tersebut.Jika ditemukan koneksi idle yang cocok, PolarProxy menggunakannya kembali. Jika tidak, PolarProxy membuka koneksi backend baru.
Setelah transaksi di-commit, koneksi dikembalikan ke kolam dan tersedia untuk permintaan berikutnya.
Multiplexing ini memungkinkan Anda mempertahankan ribuan koneksi dari klien ke PolarProxy, sementara PolarProxy hanya membuka puluhan hingga ratusan koneksi ke database backend.
PolarProxy tidak membatasi jumlah koneksi klien. Jumlah maksimum koneksi ke titik akhir kluster PolarDB bergantung pada spesifikasi node komputasi database backend. Saat pooling koneksi tingkat transaksi dinonaktifkan, sistem membuat koneksi khusus pada node primary dan setiap node read-only untuk setiap permintaan klien.
Kapan menggunakan pooling koneksi tingkat transaksi
Skenario | Gunakan connection pooling? | Alasan |
Puluhan ribu koneksi bersamaan | Yes | Pooling secara signifikan mengurangi jumlah koneksi backend |
Workload serverless yang diskalakan secara horizontal | Yes | Jumlah koneksi bertambah sebanding dengan skala server; pooling menyerap peningkatan tersebut |
Jumlah koneksi kecil, sebagian besar merupakan koneksi panjang | No | Koneksi panjang sudah mendistribusikan overhead koneksi; pooling tidak memberikan manfaat tambahan |
Aplikasi sudah menggunakan connection pool sendiri | No | Pool sisi klien yang mapan sudah mencapai efek yang sama |
Untuk skenario "Yes" di atas, aktifkan pooling koneksi tingkat transaksi hanya jika layanan Anda tidak berjalan dalam skenario yang dijelaskan di bagian Connection pinning di bawah.
Aktifkan pooling koneksi tingkat transaksi
Login ke Konsol PolarDB.
Klik Clusters di panel navigasi kiri. Di pojok kiri atas halaman Clusters, pilih wilayah tempat kluster berada.
Temukan kluster dan klik ID kluster tersebut.
Di bagian URL, klik Configuration.
Di bagian Connection Pool, atur Connection Pool menjadi Transaction-level.
Klik OK.
Nonaktifkan pooling koneksi tingkat transaksi
Login ke Konsol PolarDB.
Klik Clusters di panel navigasi kiri. Di pojok kiri atas halaman Clusters, pilih wilayah tempat kluster berada.
Temukan kluster dan klik ID kluster tersebut.
Di bagian URL, klik Configuration.
Di bagian Connection Pool, atur Connection Pool menjadi Disable.
Klik OK.
Connection pinning
Beberapa operasi menyebabkan koneksi backend menjadi pinned — terkunci ke sesi klien saat ini hingga sesi tersebut ditutup. Koneksi yang dipinned tidak dikembalikan ke kolam dan tidak dapat digunakan kembali oleh klien lain.
Jika workload Anda sering memicu pinning, kolam tidak dapat melakukan multiplexing koneksi secara efektif. Tinjau operasi di bawah ini dan pertimbangkan untuk menggunakan koneksi langsung sebagai gantinya.
Operasi | Mengapa ini menyebabkan pinning |
Menjalankan pernyataan | Pernyataan yang dipersiapkan (prepared statement) terikat ke proses backend tertentu |
Memproses paket yang lebih besar dari 16 MB | Penanganan paket besar memerlukan status koneksi khusus |
Masuk ke mode copy |
|
Masuk ke mode flush | Mode flush memerlukan status koneksi persisten antar pemanggilan |
Membuat tabel temporary, sequence, atau view | Objek-objek ini terikat ke sesi backend tertentu |
Menggunakan transaksi | Transaksi yang terbuka mempertahankan koneksi hingga |
Mendeklarasikan cursor | Set hasil cursor berada di proses backend yang membukanya |
Menentukan parameter koneksi | Parameter |
Karena koneksi backend dibagikan antar klien,pidyang dikembalikan olehSELECT pg_backend_pid()dapat berubah antar transaksi. Demikian pula, alamat IP dan port klien yang ditampilkan dipg_stat_activitydan SQL Explorer mungkin berbeda dari alamat klien sebenarnya.