全部产品
Search
文档中心

Lindorm:Menggunakan Go untuk mengembangkan aplikasi

更新时间:Nov 10, 2025

Topik ini menjelaskan cara menggunakan paket database/sql yang disediakan oleh Go dan pernyataan SQL untuk mengembangkan aplikasi berbasis LindormTable, serta menyertakan contoh-contohnya.

Prasyarat

  • Go telah diinstal. Kami menyarankan Anda menggunakan Go 1.17 atau versi yang lebih baru. Untuk informasi selengkapnya, lihat Go.

  • Fitur kompatibilitas MySQL telah diaktifkan untuk instans tersebut. Untuk informasi selengkapnya, lihat Mengaktifkan fitur kompatibilitas MySQL.

  • Alamat IP klien Anda telah ditambahkan ke daftar putih instans Lindorm Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi daftar putih.

Pertimbangan

  • Node akses antarmuka depan (frontend) Lindorm SQL menggunakan Server Load Balancer (SLB) untuk mendistribusikan permintaan klien ke berbagai node frontend. Untuk memastikan distribusi permintaan yang merata ke semua node frontend,

    kami menyarankan agar Anda tidak mengatur waktu koneksi tetap hidup (connection keep-alive time) terlalu lama. Anda dapat mengonfigurasi parameter SetConnMaxLifetime untuk memperbarui koneksi secara berkala.

  • Dalam lingkungan jaringan yang kompleks—misalnya saat kinerja gerbang mencapai titik hambatan, tautan jaringan panjang, fluktuasi jaringan tinggi, laju pengiriman ulang meningkat, atau tingkat kehilangan paket tinggi—koneksi mungkin terputus. Kami menyarankan agar Anda mengonfigurasi kolam koneksi secara tepat dan menerapkan mekanisme pengulangan (retry) dalam kode bisnis jika diperlukan.

  • Saat server ditingkatkan dan dimulai ulang, koneksi mungkin terputus sementara. Bahkan dengan kolam koneksi, bisnis Anda mungkin tetap mendeteksi pengecualian. Kami menyarankan agar Anda menangkap pengecualian tersebut dan menerapkan mekanisme pengulangan.

  • Sesuaikan konfigurasi kolam koneksi sesuai kebutuhan dan pastikan konfigurasi tersebut diterapkan dengan benar. Pastikan jumlah koneksi dalam kolam memenuhi kebutuhan bisnis Anda untuk menghindari penundaan akibat kekurangan koneksi, yang dapat meningkatkan waktu respons (RT). Anda dapat mendiagnosis masalah dengan mencetak status kolam koneksi (fmt.Printf("%+v\n", db.Stats())).

Prosedur

  1. Dalam file go.mod proyek Go Anda, tambahkan dependensi Go MySQL Driver.

    require github.com/go-sql-driver/mysql v1.7.1
  2. Konfigurasikan parameter koneksi.

    const ( 
        user = "user"
        password = "test"
        host = "ld-uf6k8yqb741t3****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com"
        port = 33060
        database = "default"
        connectTimeout = "10s"
    )

    Parameter

    Parameter

    Deskripsi

    user

    Jika Anda lupa kata sandi, Anda dapat mengubah kata sandi di sistem manajemen kluster LindormTable. Untuk informasi selengkapnya, lihat Mengelola pengguna.

    password

    host

    LindormTable Endpoint For MySQL. Untuk informasi selengkapnya tentang cara mendapatkan titik akhir tersebut, lihat Melihat titik akhir.

    Penting
    • Jika aplikasi Anda diterapkan pada instance ECS, kami menyarankan agar Anda menggunakan virtual private cloud (VPC) untuk menghubungkan ke instans Lindorm guna memastikan keamanan yang lebih tinggi dan latensi jaringan yang lebih rendah.

    • Jika aplikasi Anda diterapkan pada server lokal dan perlu menghubungkan ke instans Lindorm melalui Internet, Anda dapat melakukan langkah-langkah berikut untuk mengaktifkan titik akhir Internet untuk instans tersebut di Konsol Lindorm: Di konsol, pilih Database Connections > Wide Table Engine, lalu pada tab Wide Table Engine, klik Enable Public Endpoint.

    • Jika Anda mengakses instans Lindorm melalui VPC, atur parameter host ke alamat VPC yang kompatibel dengan MySQL. Jika Anda mengakses instans Lindorm melalui internet, atur parameter host ke alamat Internet yang kompatibel dengan MySQL.

    port

    Port yang digunakan untuk mengakses LindormTable menggunakan MySQL. Nilai parameter ini tetap 33060.

    database

    Nama database yang ingin Anda hubungkan. Secara default, klien Anda terhubung ke database bernama default.

    connectTimeout

    Periode waktu tunggu koneksi database. Satuan: detik (s).

  3. Buat koneksi dan gunakan SQL LindormTable untuk melakukan operasi pada LindormTable. Blok kode berikut memberikan contoh cara menggunakan SQL LindormTable untuk mengkueri semua database:

    url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
    db, err := sql.Open("mysql", url)
    if err != nil {
    	panic(err.Error())
    }
    //Tentukan jumlah maksimum koneksi yang dapat dibuat. Nilai default adalah 0, yang berarti tidak ada batasan jumlah maksimum koneksi. Atur sesuai kebutuhan untuk menghindari menunggu koneksi akibat jumlah koneksi yang tidak mencukupi.
    db.SetMaxOpenConns(20)
    //Tentukan jumlah maksimum koneksi siaga (idle). Nilai default adalah 2. Kami menyarankan mengatur SetMaxIdleConns sama dengan SetMaxOpenConns.
    db.SetMaxIdleConns(20)
    // Tentukan periode siaga maksimum koneksi. Nilai default adalah 0, yang berarti koneksi tidak akan habis waktu. Kami menyarankan mengatur nilai ini menjadi 8 menit.
    db.SetConnMaxIdleTime(8 * time.Minute)
    // Tentukan masa pakai maksimum koneksi untuk menghindari ketidakseimbangan koneksi akibat penggunaan jangka panjang koneksi persisten. Kami menyarankan mengatur nilai ini menjadi 30 menit.
    db.SetConnMaxLifetime(30 * time.Minute)
    
    defer db.Close()
    
    // Kueri semua database
    {
    	rows, err := db.Query("show databases")
    	if err != nil {
    		panic(err.Error())
    	}
        defer rows.Close()
    	for rows.Next() {
    		var dbName string
    		err := rows.Scan(&dbName)
    		if err != nil {
    			panic(err.Error())
    		}
    		fmt.Println(dbName)
    	}
    }

Kode contoh

Kode contoh lengkap adalah sebagai berikut:

package main
import (
    "database/sql"
    "fmt"
    "time"
    _ "github.com/go-sql-driver/mysql"
)
const (
    //Atur user ke nama pengguna yang digunakan untuk mengakses LindormTable
    user = "user"
    //Atur password ke kata sandi yang digunakan untuk mengakses LindormTable
    password = "test"
    //Atur host ke titik akhir LindormTable untuk MySQL
    host = "ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com"
    //Tentukan port yang digunakan untuk mengakses LindormTable menggunakan MySQL. Nomor port tetap 33060
    port = 33060
    //Atur database ke nama database yang ingin Anda hubungkan
    database = "default"
    //Tentukan periode waktu tunggu koneksi database
    connectTimeout = "20s"
)
func main() {
	//Membuat koneksi database
	url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
	db, err := sql.Open("mysql", url)
	if err != nil {
		panic(err.Error())
	}
    
    //Tentukan jumlah maksimum koneksi yang dapat dibuat. Nilai default adalah 0, yang berarti tidak ada batasan jumlah maksimum koneksi. Atur sesuai kebutuhan untuk menghindari menunggu koneksi akibat jumlah koneksi yang tidak mencukupi.
    db.SetMaxOpenConns(20)
    //Tentukan jumlah maksimum koneksi siaga (idle). Nilai default adalah 2. Kami menyarankan mengatur SetMaxIdleConns sama dengan SetMaxOpenConns.
    db.SetMaxIdleConns(20)
    // Tentukan periode siaga maksimum koneksi. Nilai default adalah 0, yang berarti koneksi tidak akan habis waktu. Kami menyarankan mengatur nilai ini menjadi 8 menit.
    db.SetConnMaxIdleTime(8 * time.Minute)
    // Tentukan masa pakai maksimum koneksi untuk menghindari ketidakseimbangan koneksi akibat penggunaan jangka panjang koneksi persisten. Kami menyarankan mengatur nilai ini menjadi 30 menit.
    db.SetConnMaxLifetime(30 * time.Minute)
    
	defer db.Close()

	//Secara berkala mencetak status kolam koneksi untuk mendiagnosis apakah jumlah koneksi mencukupi, apakah ada koneksi yang menunggu, dan berapa banyak koneksi yang telah ditutup
	go func() {
		for {
			fmt.Printf("%+v\n", db.Stats())
			time.Sleep(10 * time.Second)
		}
	}()

    
	//Kueri semua database
	{
		rows, err := db.Query("show databases")
		if err != nil {
			panic(err.Error())
		}
        defer rows.Close()
		for rows.Next() {
			var dbName string
			err := rows.Scan(&dbName)
			if err != nil {
				panic(err.Error())
			}
			fmt.Println(dbName)
		}
	}

	//Membuat tabel
	{
		_, err := db.Exec("create table if not exists user_test(id int, name varchar,age int, primary key(id))")
		if err != nil {
			fmt.Println("kesalahan membuat tabel ", err)
			return
		}
	}

	//Menulis data ke tabel

	//Metode 1: Menulis data langsung ke tabel
	{
		_, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)")
		if err != nil {
			fmt.Println("kesalahan memasukkan data", err)
			return
		}
	}

	//Metode 2: Menulis data ke tabel dengan menentukan parameter
	{
		stmt, err := db.Prepare("upsert into user_test(id,name,age) values(?,?,?)")
		if err != nil {
			fmt.Println("kesalahan prepare", err)
			return
		}
        defer stmt.Close() 
		_, err = stmt.Exec(2, "lisi", 18)
		if err != nil {
			fmt.Println("kesalahan upsert", err)
			return
		}
	}

	//Mengkueri data di tabel

	//Metode 1: Mengkueri data secara langsung

	{
		rows, err := db.Query("select * from user_test")
		if err != nil {
			fmt.Println("kesalahan mengkueri data", err)
			return
		}
		defer rows.Close()
		var id int
		var name string
		var age int
		for rows.Next() {
			err = rows.Scan(&id, &name, &age)
			if err != nil {
				fmt.Println("kesalahan membaca data", err)
				return
			}
			fmt.Println("id:", id, "name:", name, "age:", age)
		}
	}

	// Metode 2: Menjalankan kueri parameterisasi dengan menentukan parameter
	{
		stmt, err := db.Prepare("select * from user_test where id=?")
		if err != nil {
			fmt.Println("kesalahan prepare", err)
			return
		}
        defer stmt.Close()
		rows, err := stmt.Query(1)
		if err != nil {
			fmt.Println("kesalahan mengkueri data", err)
			return
		}
		defer rows.Close()
		var id int
		var name string
		var age int
		for rows.Next() {
			err = rows.Scan(&id, &name, &age)
			if err != nil {
				fmt.Println("kesalahan membaca data", err)
				return
			}
			fmt.Println("id:", id, "name:", name, "age:", age)
		}
	}

	//Menghapus data dari tabel
	{
		_, err = db.Exec("delete from user_test where id=1")
		if err != nil {
			fmt.Println("kesalahan menghapus data", err)
			return
		}
	}
}
Catatan
  • Anda harus memanggil Close untuk menutup rows setelah digunakan.

  • Untuk skenario berkinerja tinggi, Anda dapat menggunakan kembali Stmt.

  • Saat menggunakan antarmuka yang terkait dengan Context, seperti QueryContext dan ExecContext, jika periode waktu tunggu diatur terlalu singkat, koneksi mungkin direset karena jitter Pengumpulan sampah (GC) klien menyebabkan waktu tunggu Context habis, sehingga memengaruhi kinerja sistem.

Jika instans saat ini hanya berisi database bernama default, hasil berikut akan dikembalikan:

default
information_schema
id: 1 name: zhangsan age: 17
id: 2 name: lisi age: 18
id: 1 name: zhangsan age: 17