Jika aplikasi Anda sering membuat koneksi singkat ke instans ApsaraDB RDS for MySQL atau jumlah maksimum koneksi yang diizinkan tercapai, gunakan fitur kolam koneksi dari database proxy. Fitur ini mengurangi frekuensi koneksi aplikasi ke instans RDS, overhead utama thread instans RDS, serta jumlah total koneksi ke instans RDS.
Pilih jenis kolam koneksi
ApsaraDB RDS for MySQL mendukung pooling koneksi tingkat transaksi dan pooling koneksi tingkat sesi. Pilih jenis pooling koneksi berdasarkan kebutuhan bisnis Anda.
Jenis | Skenario |
Pooling koneksi tingkat transaksi (direkomendasikan) | Koneksi singkat diperlukan dalam beban kerja, koneksi sering dibuat, dan jumlah koneksi mencapai jumlah maksimum koneksi yang didukung oleh instans RDS. Batasan pada pooling koneksi tingkat transaksi tidak memengaruhi beban kerja Anda. Untuk informasi lebih lanjut, lihat Batasan kolam koneksi transaksi. |
Pooling koneksi tingkat sesi | Koneksi singkat diperlukan dalam beban kerja, dan koneksi sering dibuat. Namun, batasan pada pooling koneksi tingkat transaksi memengaruhi beban kerja Anda. |
Pooling koneksi dinonaktifkan | Koneksi persisten diperlukan dalam beban kerja, sejumlah kecil koneksi dibuat, dan kolam koneksi seperti Druid, DBCP, c3p0, dan HikariCP digunakan dalam aplikasi Anda. |
Pengenalan jenis kolam koneksi
Pooling koneksi tingkat transaksi (direkomendasikan)
Skenario
Beban kerja memerlukan banyak koneksi singkat.
Koneksi sering dibuat.
Jumlah koneksi mencapai batas maksimum yang didukung oleh instans RDS.
Manfaat
Mengurangi frekuensi koneksi aplikasi ke instans RDS dan overhead utama thread instans RDS.
Mengurangi jumlah total koneksi ke instans RDS.
Cara kerja
Saat pooling koneksi tingkat transaksi diaktifkan, klien terhubung ke database proxy saat memulai permintaan. Database proxy tidak langsung membuat koneksi backend ke database. Saat permintaan perlu diproses, database proxy mencari kolam koneksi untuk koneksi backend yang tersedia.
Jika nilai parameter user dan dbname sama dengan nilai variabel sistem tertentu, koneksi dianggap tersedia.
Jika koneksi backend tersedia, koneksi tersebut digunakan. Setelah transaksi selesai, koneksi direklaim oleh kolam koneksi.
Jika tidak ada koneksi backend tersedia, koneksi backend baru dibuat.
Pooling koneksi tingkat transaksi memungkinkan beberapa sesi berbagi satu koneksi backend. Koneksi dengan transaksi aktif menempati koneksi backend, sedangkan koneksi dengan transaksi tidak aktif tidak menempati koneksi backend.
Selama periode waktu tertentu, koneksi backend yang sama dapat memproses transaksi dalam beberapa sesi berlangsung. Ini memberikan manfaat sebagai berikut:
Frekuensi koneksi ke database berkurang.
Koneksi backend tetap hidup selama periode waktu tertentu untuk mengurangi frekuensi koneksi dan overhead utama thread database.
Jumlah total koneksi ke database berkurang.
Beberapa sesi berlangsung berbagi koneksi backend. Ini mencegah koneksi idle menempati sumber daya koneksi backend dan mengurangi jumlah total koneksi ke database. Dalam koneksi idle, koneksi frontend menjadi tidak aktif ketika sesi tidak diakhiri.
Fitur database proxy tidak membatasi jumlah maksimum koneksi. Jumlahnya bervariasi berdasarkan spesifikasi instans RDS Anda.
Batasan
Saat melakukan salah satu operasi berikut, koneksi dikunci hingga ditutup. Ini berarti koneksi tidak dapat direklaim oleh kolam koneksinya.
Eksekusi pernyataan PREPARE.
Buat tabel sementara.
Ubah variabel pengguna.
Proses paket besar, seperti paket 16 MB atau ukuran lebih besar.
Eksekusi pernyataan LOCK TABLE.
Jalankan kueri multi-pernyataan.
Panggil prosedur tersimpan.
Fungsi FOUND_ROWS, ROW_COUNT, dan LAST_INSERT_ID tidak didukung. Anda dapat memanggil fungsi-fungsi ini, tetapi hasil yang dikembalikan mungkin tidak akurat.
Jika versi database proxy yang digunakan adalah V1.13.11 atau lebih baru, Anda dapat mengeksekusi pernyataan
SELECT FOUND_ROWS()setelah pernyataanSELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT *. Metode ini tidak lagi direkomendasikan oleh open source MySQL. Sebagai alternatif, ganti pernyataanSELECT FOUND_ROWS()dengan pernyataanSELECT COUNT(*) FROM tb1. Untuk informasi lebih lanjut, lihat FOUND_ROWS().Jika versi database proxy yang digunakan adalah V1.13.11 atau lebih baru, Anda dapat mengeksekusi pernyataan
SELECT LAST_INSERT_ID()setelah pernyataanINSERT. Ini memastikan akurasi hasil kueri.
Catatan penggunaan
Jika Anda mengonfigurasi parameter
wait_timeout, nilai parameterwait_timeoutmungkin tidak berlaku untuk klien Anda. Hal ini karena database proxy memilih koneksi dari kolam koneksi setiap kali klien memulai permintaan. Ketika waktu yang ditentukan oleh parameterwait_timeoutberakhir, hanya koneksi backend yang ditutup, sementara koneksi ke klien tetap terbuka.Pooling koneksi tingkat transaksi mencocokkan variabel berikut dalam permintaan:
sql_mode,character_set_server,collation_server, dantime_zone. Jika permintaan mencakup variabel sistem tingkat sesi lainnya, Anda harus secara eksplisit mengeksekusi pernyataan SET pada klien untuk mengonfigurasi variabel ini setelah koneksi dibuat untuk permintaan. Jika tidak, koneksi yang variabel sistemnya dikonfigurasi ulang mungkin dipilih dari kolam koneksi dan digunakan kembali.Anda dapat mengeksekusi pernyataan
SELECT CONNECTION_ID()untuk memeriksa ID thread koneksi guna menentukan apakah koneksi digunakan kembali.Jika koneksi yang ada digunakan kembali, alamat IP dan nomor port yang dikembalikan oleh pernyataan
SHOW PROCESSLISTatau fitur Penjelajah SQL dan Audit mungkin berbeda dari alamat IP dan nomor port aktual klien Anda. Untuk informasi lebih lanjut, lihat Gunakan Fitur Penjelajah SQL dan Audit.Database proxy menggabungkan hasil yang diperoleh oleh pernyataan
SHOW PROCESSLISTdari semua instans RDS utama, sekunder, dan hanya-baca. Kemudian, database proxy mengembalikan set hasil ke aplikasi Anda. Jika Anda mengaktifkan pooling koneksi tingkat transaksi, ID thread koneksi frontend berbeda dari ID thread koneksi backend. Akibatnya, kesalahan mungkin dikembalikan untuk perintah kill meskipun proses berhasil dihentikan. Dalam hal ini, Anda dapat mengeksekusi pernyataanSHOW PROCESSLIST statementlagi untuk memeriksa apakah proses dihentikan.
Pooling koneksi tingkat sesi
Skenario
Beban kerja memerlukan banyak koneksi singkat.
Koneksi sering dibuat.
Manfaat
Pooling koneksi tingkat sesi mengurangi frekuensi koneksi aplikasi ke instans RDS dan overhead utama thread instans RDS.
Cara kerja
Koneksi Frontend dan Koneksi Backend
Koneksi antara klien dan database dibagi oleh database proxy menjadi dua bagian: koneksi frontend dan koneksi backend. Koneksi frontend mengacu pada koneksi antara klien dan database proxy. Koneksi backend mengacu pada koneksi antara database proxy dan database. Klien bisa berupa aplikasi.
Pembuatan Koneksi dengan Pooling Koneksi Dinonaktifkan
Jika pooling koneksi dinonaktifkan, koneksi frontend dan koneksi backend harus dibuat untuk setiap sesi yang dimulai oleh klien. Ini meningkatkan overhead utama thread database.
Cara Kerja Pooling Koneksi Tingkat Sesi
Jika Anda mengaktifkan pooling koneksi tingkat sesi, koneksi frontend dibuat saat klien memulai sesi. Lalu, sistem mencari kolam koneksi untuk koneksi backend yang tersedia.
Jika nilai parameter user, clientip, dan dbname dari koneksi backend cocok, koneksi backend dianggap tersedia.
Jika koneksi backend tersedia, koneksi tersebut digunakan.
Jika tidak ada koneksi backend tersedia, koneksi backend baru dibuat.
Setelah sesi berakhir, koneksi frontend ditutup dan koneksi backend direklaim oleh kolam koneksi. Saat sesi baru dimulai, koneksi backend dapat langsung digunakan. Ini mengurangi overhead utama thread database.
Gambar berikut menunjukkan proses pembuatan koneksi.
Jika Anda menggunakan pooling koneksi tingkat sesi, satu sesi menempati satu koneksi backend. Koneksi backend direklaim oleh kolam koneksi hanya setelah sesi berakhir.
Batasan
Tidak ada.
Catatan penggunaan
Sebelum sesi berakhir, koneksi backend dari sesi tidak dapat digunakan oleh sesi lain bahkan jika sesi idle dan tidak ada transaksi yang perlu diproses. Akibatnya, jumlah total koneksi ke database tidak berkurang.
Konfigurasikan fitur kolam koneksi
Prasyarat
Fitur database proxy diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan Fitur Database Proxy.
Catatan penggunaan
Fitur kolam koneksi tidak mendukung izin berbasis IP untuk akun. Jika Anda mengaktifkan fitur kolam koneksi dan memberikan izin akses pada database atau tabel kepada akun yang menggunakan alamat IP berbeda, kesalahan izin mungkin terjadi. Misalnya, akun memiliki izin pada database_a saat masuk dari alamat IP 192.xx.xx.1, tetapi akun tidak memiliki izin pada database_a saat masuk dari alamat IP 192.xx.xx.2. Dalam hal ini, kesalahan izin mungkin terjadi saat koneksi yang ada digunakan kembali.
Fitur kolam koneksi yang disediakan dalam database proxy sistem database Anda tidak memengaruhi kolam koneksi yang disediakan dalam aplikasi Anda. Jika aplikasi Anda menyediakan kolam koneksi, Anda tidak perlu mengaktifkan fitur kolam koneksi untuk sistem database Anda.
Fitur kolam koneksi tidak dapat menyelesaikan masalah akumulasi koneksi yang disebabkan oleh sejumlah besar kueri SQL lambat. Kami merekomendasikan agar Anda mengoptimalkan pernyataan SQL terkait atau menangani masalah pada instans RDS.
Jika versi database proxy lebih awal dari 2.9.1, Anda tidak dapat mengonfigurasi kolam koneksi untuk titik akhir proxy database yang memiliki atribut hanya-baca. Jika versi database proxy adalah 2.9.1 atau lebih baru, Anda dapat mengonfigurasi kolam koneksi untuk titik akhir proxy database yang memiliki atribut baca/tulis atau hanya-baca.
Prosedur
Pergi ke halaman Instans. Di bilah navigasi atas, pilih wilayah tempat instans RDS berada. Lalu, temukan instans RDS dan klik ID instans tersebut.
Di panel navigasi sisi kiri, klik Database Proxy.
Di bagian Connection Information, aktifkan fitur kolam koneksi dengan salah satu metode berikut:
CatatanSecara default, fitur kolam koneksi dinonaktifkan.
Setelah jenis kolam koneksi diubah, modifikasi hanya berlaku untuk koneksi baru.
Metode 1: Gerakkan pointer ke ikon
di sebelah kanan titik akhir proxy database yang ingin Anda konfigurasikan untuk kolam koneksi. Di kotak dialog yang muncul, klik Enable Transaction-level Connection Pooling atau Enable Session-level Connection Pooling. Di kotak dialog yang muncul, klik OK.
Metode 2: Temukan titik akhir proxy database yang ingin Anda konfigurasikan untuk kolam koneksi dan klik Modify Configuration di kolom Actions. Di kotak dialog yang muncul, pilih jenis kolam koneksi yang diperlukan di sebelah kanan Connection Pooling.
CatatanJika fitur kolam koneksi diaktifkan, Anda dapat mengubah jenis kolam koneksi.

Operasi terkait
Operasi | Deskripsi |
Mengkueri detail tentang proxy khusus instans ApsaraDB RDS. | |
Mengkueri informasi tentang titik akhir proxy database. | |
Memodifikasi pengaturan koneksi untuk titik akhir proxy database. |
Istilah
Koneksi singkat: koneksi yang hanya terbuka selama periode waktu singkat. Sebagai contoh, koneksi dibuat untuk aplikasi PHP guna mengeksekusi query sederhana, lalu ditutup. Keuntungannya adalah sumber daya koneksi tidak ditempati dalam jangka waktu lama. Kerugiannya adalah koneksi harus dibuat setiap kali klien memulai permintaan, sehingga meningkatkan overhead utas utama dari database Anda.
Koneksi persisten: koneksi yang tetap terbuka untuk jangka waktu panjang. Sebagai contoh, server web atau server aplikasi membuka beberapa koneksi ke server MySQL dan mempertahankannya tetap terbuka hingga server web atau server aplikasi dihentikan. Keuntungannya adalah koneksi dibuat dengan frekuensi lebih rendah, sehingga mengurangi overhead utama thread. Namun, kerugiannya adalah sumber daya koneksi tetap digunakan dalam jangka waktu panjang.
FAQ
Berapa jumlah maksimum koneksi untuk mengaktifkan fitur kolam koneksi?
Jika jumlah koneksi mungkin melebihi jumlah maksimum koneksi yang didukung oleh instans RDS Anda, kami merekomendasikan agar Anda mengaktifkan pooling koneksi tingkat transaksi.
Berapa lama koneksi dalam kolam koneksi dapat tetap hidup?
Koneksi dalam kolam koneksi dapat tetap hidup selama 10 detik.
Apakah fitur kolam koneksi memengaruhi performa instans?
Setelah fitur kolam koneksi diaktifkan, performa instans meningkat sekitar 10% dalam skenario koneksi singkat.
Apa perbedaan antara pooling koneksi tingkat transaksi dan pooling koneksi tingkat sesi?
Pooling koneksi tingkat transaksi tidak hanya mengurangi overhead utama thread instans RDS, tetapi juga mengurangi jumlah total koneksi ke instans RDS.
Pooling koneksi tingkat sesi hanya dapat mengurangi overhead utama thread instans RDS, tetapi tidak dapat mengurangi jumlah total koneksi ke instans RDS.
Bagaimana cara kerja pooling koneksi tingkat transaksi berbeda dari pooling koneksi tingkat sesi?
Jenis | Sesi berbagi koneksi backend | Waktu penggunaan koneksi backend | Waktu pengambilan kembali koneksi backend | Pemetaan antara sesi dan koneksi backend |
Pooling koneksi tingkat transaksi | Ya | Transaksi sedang diproses. | Transaksi selesai. Sesi mungkin belum berakhir. | N:1 |
Pooling koneksi tingkat sesi | Tidak | Sesi sedang dibuat. | Sesi berakhir. | N:N |
Database proxy terputus dari aplikasi saya. Apakah pemutusan ini terjadi karena baik aplikasi maupun database proxy menggunakan fitur kolam koneksi?
Penyebab pemutusan bervariasi berdasarkan kondisi aktual. Tidak selalu disebabkan oleh aplikasi dan database proxy menggunakan fitur kolam koneksi.