Pengalaman tentang rows.Close() di golang

Nipe Setiawan Harefa
PayMyTea
Published in
3 min readMay 20, 2020

Jadi tulisan ini dibuat karena dapat pengalaman baru di Golang terutama yang berhubungan dengan database. Jadi singkat cerita lagi develop satu service mengunakan Go dengan database postgresql, dan salah satu fitur yang ada di service ini ialah management token firebase (FCM) yang digunakan untuk keperluan Push Notification.

Diawal pembuatan fitur ini berjalan baik seperti biasa. Pada saat development tidak terjadi kejanggalan apapun, namun karna perihal deadline maka beberapa code tidak tercoverage oleh unit-test. Dan mungkin ini jadi salah satu pelajaran terpenting juga. Sewaktu rilis di hari pertama memang tidak ada masalah karna memang saat itu request yang diterima juga tidak terlalu banyak.

https://www.bankmandiri.co.id/jacoweek-2019

Namun kejanggalan muncul saat Perusahaan saya mengikuti salah satu event kopi terbesar di Indonesia, Jakarta Coffee Week Tahun 2019. Singkat cerita tentang event itu dimana semua perusahaan dan komunitas pecinta kopi bertemu. Pada saat 2 jam setelah event di hari pertama di mulai service notificationnya mulai sering Down dan restart sendiri. Pada saat itu jujur sangat panik apalagi hari pertama, namun pelan-pelan coba melakukan trace pada down. Hingga acara ini berakhir pun saya masih kebingungan kenapa masih sering down.

Setelah coba meliburkan diri dari coding, maka tiba-tiba teringat akan satu hal yaitu rows.Close(). Coba kembali lihat code yang bermasalah tersebut dan menemukan hal yang janggal, ya kurang lebih potongan code nya seperti ini gambar dibawah.

Sekilas tidak ada yang aneh dari potongan kode tersebut, namun saya baru sadar bahwa pada saat proses querynya berhasil saya tidak memanggil rows.Close().

Sederhananya pada saat melakukan query yang mengambalikan Rows, maka koneksi yang dibuat tidak akan ditutup secara otomatis oleh golang. Hal tersebut yang membuat banyak koneksi baru yang di database. Yang dimana seharusnya setiap koneksi bisa digunakan ulang oleh fungsi lain untuk melakukan query namun karna tidak diakhiri akibatnya query dianggap masih aktif, dan koneksi baru pun bermunculan.

Disaat jumlah koneksi aktif sudah maksimum dari yang ditentukan, maka efeknya adalah jika ada permintaan ke database maka tidak akan bisa di proses.

Dan hal itu yang membuat saya akhirnya mencoba load test dengan menggunakan tool vegeta. Dimana hasilnya yang didapat saat itu adalah 50 request saja sudah down. Saat itu juga saya coba fix dengan menambahkan defer rows.Close(), dan load-test ulang dan akhirnya tidak ada down lagi dan semua request berhasil di proses.

--

--