Salah satu issue besar yang acapkali menimpa server yg menggunakan MySQL, adalah berhubungan dengan error Too Many Connections. Setidaknya, apa yg gw omongkan di sini bukan hoax -- tanyakanlah itu pada admin Kaskus.us, admin MWN, admin diskusiweb, admin ekomit (hehehe, sumpah bukan gw) -- error Too Many Connection itu bener-bener menyebalkan. SANGAT-SANGAT-SANGAT-SANGAT-MENYEBALKAN.
Sebenarnya, apa sih error Too Many Connections itu? Dan kenapa bisa (sering bangedd) terjadi. Artikel gw kali ini akan mencoba membahasnya.
- terlalu banyak koneksi yang terjadi secara simultan --> cukup sering dijumpai oleh site-site yang emang ramai pengunjung.
- terjadi flooding paket cacat ke port yg dipakae MySQL --> ini bisa di-test dengan melakukan telnet ke 3306, coba aja lakukan beberapa kali : insyaAllah MySQL Server langsung down, ato bisa juga karena terjadi kegagalan koneksi berkali2.
- terlalu banyak koneksi yang udah obsolete, tapi belum di-release / di-free-kan.
Utk habit kedua, terdapat banyaknya paket cacat di pool MySQL, cara nanganinnya adalah dengan melakukan flush menggunakan tools mysqladmin. bikin batch-script yang isinya mysqladmin flush-hosts -- trus pasang sebagai handler di Web Server atau di program desktop (sesuaikan dengan environmentnya) kalo2 menemukan error di MySQL engine dengan kode error SQLSTATE = 08S01 (utk server error yg berhubungan dengan bad packet) atau 46000 (utk server error yg berhubungan dengan koneksi), atau ndeteksi dari kode error ODBC -2147467259 (ni value yg gw trap dari error ADODB makae MyODBC).
Utk habit ketiga, terlalu banyak koneksi yg udah obsolete, tapi belum di-release atau di free-kan -- ini adalah masalah budaya coding juga sih. Code yang jorok, akan meninggalkan banyak junk di cache server. Bagi para coder, mestinya *sadar dikit* tentang cara melakukan koneksi ke DBMS, apakah dengan cara persistent-connection atau non-persistent. Klo cara yang dipakae adalah persistent-connection (kelebihan klo makae teknik ini adalah *memungkinkan utk melakukan transaction-safe queries*) -- perhatikan benar di masalah threading (silakan liat artikel ini utk referensi : http://forums.devshed.com/php-development-5/mysql-pconnect-22495.html).
Utk me-manage dari sisi administrasi server mengenai persistent connection ini, ada 2 variabel server yg perlu diperhatikan.
1. max_connections --> seperti pembahasan pada habit pertama;
2. wait_timeout --> MySQL mengendalikan "umur" sebuah persistent connection melalui variabel ini, dimana nilai default-nya adalah 8 jam. Silakan ubah nilai variabel ini sesuai dengan server-load yg terjadi dalam produksi.
Sedangkan utk handle non-persistent connection, dimana ini adalah teknik umum yg dipakai (klo di PHP, makae mysql_connect() atau liat library yg disediakan oleh connector yg dipakae). Untuk kebersihan code, *always-selalu-musti* lakukan closing terhadap object koneksi klo proses querying selesai. lakukan mysql_close() segera ketika dibutuhkan.
Kekurangan mysql_connect() ini ketimbang mysql_pconnect() dalam persistent connection adalah ngga ada mekanisme utk memakai "existing non-persistent connection" -- jadi, bisa saja dalam satu modul aplikasi yg diakses oleh satu client menjalin 2-3-4-atau lebih koneksi, which is : ini pemborosan jumlah koneksi!
Be aware dengan non-persistent-connection! Kerapian code Anda menentukan kualitas aplikasi Anda sendiri!
Emm...,
Tapi yang namanya programmer itu juga manusia, punya rasa punya hati, -- juga punya khilaf. Kalo *seandainya* koneksi-koneksi non-persistent tersebut di-create asal dan ngga di-close, kan bakal banyak juga tuh koneksi nyangkut. MySQL mengantisipasi masalah ini dengan juga memberikan "umur" koneksi (sama seperti penanganan persistent-connection di atas), hanya saja, variabel server yang dipergunakan adalah interactive_timeout.
Anehnya, settingan default interactive_timeout ini JUGA 8 jam! sama seperti settingan default wait_timeout. Padahal koneksi non-persistent itu ditujukan utk keperluan transaksi query jangka pendek. Sangat-sangat-sangat-pendek, malah. Buka koneksi, kirim query, tunggu bentar, dapat hasil resultset, tutup. Bener-bener singkat, bukan?
Nah, saran gw, ubahlah interactive_timeout ini menjadi 3-5 menit lah (hehehe, jauh banged yak dari settingan standard 8 jam). Ini utk 'an-ti-si-sapi' bro... -- ada banyak sebab kenapa query bisa nyangkut n ngga ketutup walo pakae mysql_close() - terutama pada fase development - misal karena terjadi kegagalan atau kesalahan dalam melakukan query join, ato dapat error "MySQL Server Has Gone Away", atau cursor melakukan infinite loops, atau ... macam-macam dah. Dengan meminimalisasi interactive_timeout ke nilai waktu yang lebih representatif, kemungkinan terjadi error Too Many Connections bisa di-eliminir.
--
Apa yang paling menyebalkan klo kita dapetin error Too Many Connections?
Restart Server!! cuman itu solusinya.
*males bangedd deh...
_______________________
Rizky Prihanto
Software Architect PT Cinox Media Insani