全部产品
Search
文档中心

AnalyticDB:Go

更新时间:Jun 26, 2025

Topik ini menjelaskan cara menggunakan Go untuk terhubung ke kluster AnalyticDB for MySQL.

Prasyarat

  • Git telah diinstal dan jalurnya telah ditambahkan ke variabel lingkungan Path.
  • Go telah diunduh dan diinstal. Untuk informasi lebih lanjut, lihat Unduh dan instal.
  • Go MySQL Driver telah diinstal.
    1. Unduh Go MySQL Driver dari go-sql-driver/mysql.
    2. Gunakan alat go dalam skrip shell untuk menginstal paket ke $GOPATH.
      go get github.com/go-sql-driver/mysql

Terhubung ke kluster AnalyticDB for MySQL

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)
const (
   // user: akun yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL. AnalyticDB for MySQL menawarkan jenis akun berikut: akun istimewa dan akun standar.
    user = "adb_test"
    // password: kata sandi akun yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL.
    password = "xxx"
    // host: alamat IP kluster AnalyticDB for MySQL. Anda dapat memperoleh alamat IP pada halaman Informasi Kluster di konsol AnalyticDB for MySQL.
    host = "127.0.xx.xx"
    // 3306: port yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL.
    port = 3306
    // database: nama database dalam kluster AnalyticDB for MySQL.
    database = "nama_database"
    // connectTimeout: periode timeout koneksi database.
    connectTimeout = "10s"
)
func main() {
    // Aktifkan 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())
    }
    // Tetapkan jumlah maksimum koneksi yang diaktifkan. Nilai default adalah 0, yang menunjukkan tidak ada batasan pada jumlah maksimum koneksi yang diaktifkan.
    db.SetMaxOpenConns(2)
    // Tetapkan jumlah maksimum koneksi idle.
    db.SetMaxIdleConns(1)
    // Tetapkan durasi maksimum koneksi. Secara default, tidak ada batasan pada durasi koneksi, dan koneksi selalu dipertahankan tetap hidup.
    // Pengaturan ini tidak dapat menjamin bahwa koneksi dalam pool koneksi bertahan selama satu jam penuh. Koneksi mungkin menjadi tidak tersedia dan ditutup secara otomatis karena beberapa alasan.
    // Pengaturan ini bukan tentang periode timeout untuk koneksi idle. Koneksi tidak kedaluwarsa setelah menjadi idle selama satu jam, tetapi kedaluwarsa satu jam setelah dibuat pertama kali.
    // Secara teori, durasi maksimum koneksi yang lebih pendek menunjukkan frekuensi pembuatan koneksi dari awal yang lebih tinggi.
    db.SetConnMaxLifetime(time.Hour)
    // tunda penutupan hingga setelah fungsi utama selesai dieksekusi
    defer db.Close()
    rows, err := db.Query("show tables")
    if err != nil {
        panic(err.Error())
    }
    for rows.Next() {
        var tableName string
        err := rows.Scan(&tableName)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(tableName)
    }
}

Aktifkan pernyataan yang disiapkan untuk server

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)
const (
   // user: akun yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL. AnalyticDB for MySQL menawarkan jenis akun berikut: akun istimewa dan akun standar.
    user = "adb_test"
    // password: kata sandi akun yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL.
    password = "xxx"
    // host: alamat IP kluster AnalyticDB for MySQL. Anda dapat memperoleh alamat IP pada halaman Informasi Kluster di konsol AnalyticDB for MySQL.
    host = "127.0.xx.xx"
    // 3306: port yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL.
    port = 3306
    // database: nama database dalam kluster AnalyticDB for MySQL.
    database = "nama_database"
    // connectTimeout: periode timeout koneksi database.
    connectTimeout = "10s"
)
func main() {
    // buka 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())
    }
    // Tetapkan jumlah maksimum koneksi yang diaktifkan. Nilai default adalah 0, yang menunjukkan tidak ada batasan pada jumlah maksimum koneksi yang diaktifkan.
    db.SetMaxOpenConns(2)
    // Tetapkan jumlah maksimum koneksi idle.
    db.SetMaxIdleConns(1)
    // Tetapkan durasi maksimum koneksi. Secara default, tidak ada batasan pada durasi koneksi, dan koneksi selalu dipertahankan tetap hidup.
    // Pengaturan ini tidak dapat menjamin bahwa koneksi dalam pool koneksi bertahan selama satu jam penuh. Koneksi mungkin menjadi tidak tersedia dan ditutup secara otomatis karena beberapa alasan.
    // Pengaturan ini bukan tentang periode timeout untuk koneksi idle. Koneksi tidak kedaluwarsa setelah menjadi idle selama satu jam, tetapi kedaluwarsa satu jam setelah dibuat pertama kali.
    // Secara teori, durasi maksimum koneksi yang lebih pendek menunjukkan frekuensi pembuatan koneksi dari awal yang lebih tinggi.
    db.SetConnMaxLifetime(time.Hour)
    defer db.Close()
    stmt, err := db.Prepare("select * from student where id = ?")
    if err != nil {
        panic(err.Error())
    }
    defer stmt.Close()
    rows, err := stmt.Query(9)
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()
    for rows.Next() {
        var id string
        var name string
        var unit string
        err := rows.Scan(&id, &name, &unit)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(fmt.Sprintf("%s, %s, %s", id, name, unit))
    }
}

Aktifkan pernyataan persiapan untuk klien

Anda harus mengatur interpolateParams ke true pada klien untuk mengaktifkan pernyataan persiapan untuk Go MySQL Driver.
Penting db.Prepare dan stmt.Query tidak dapat mengidentifikasi apakah interpolateParams diatur ke true. Anda harus menggunakan db.Query untuk mengaktifkan pernyataan persiapan untuk klien.
package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)
const (
    // user: akun yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL. AnalyticDB for MySQL menawarkan jenis akun berikut: akun istimewa dan akun standar.
    user = "adb_test"
    // password: kata sandi akun yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL.
    password = "xxx"
    // host: alamat IP kluster AnalyticDB for MySQL. Anda dapat memperoleh alamat IP pada halaman Informasi Kluster di konsol AnalyticDB for MySQL.
    host = "127.0.xx.xx"
    // 3306: port yang digunakan untuk terhubung ke kluster AnalyticDB for MySQL.
    port = 3306
    // database: nama database dalam kluster AnalyticDB for MySQL.
    database = "nama_database"
    // connectTimeout: periode timeout koneksi database.
    connectTimeout = "10s"
)
func main() {
    // Aktifkan koneksi database.
    url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s&interpolateParams=true", user, password, host, port, database, connectTimeout)
    db, err := sql.Open("mysql", url)
    if err != nil {
        panic(err.Error())
    }
    // Tetapkan jumlah maksimum koneksi yang diaktifkan. Nilai default adalah 0, yang menunjukkan tidak ada batasan pada jumlah maksimum koneksi yang diaktifkan.
    db.SetMaxOpenConns(2)
    // Tetapkan jumlah maksimum koneksi idle.
    db.SetMaxIdleConns(1)
    // Tetapkan durasi maksimum koneksi. Secara default, tidak ada batasan pada durasi koneksi, dan koneksi selalu dipertahankan tetap hidup.
    // Pengaturan ini tidak dapat menjamin bahwa koneksi dalam pool koneksi bertahan selama satu jam penuh. Koneksi mungkin menjadi tidak tersedia dan ditutup secara otomatis karena beberapa alasan.
    // Pengaturan ini bukan tentang periode timeout untuk koneksi idle. Koneksi tidak kedaluwarsa setelah menjadi idle selama satu jam, tetapi kedaluwarsa satu jam setelah dibuat pertama kali.
    // Secara teori, durasi maksimum koneksi yang lebih pendek menunjukkan frekuensi pembuatan koneksi dari awal yang lebih tinggi.
    db.SetConnMaxLifetime(time.Hour)
    defer db.Close()
    rows, err := db.Query("select * from student where id = ?", 9)
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()
    for rows.Next() {
        var id string
        var name string
        var unit string
        err := rows.Scan(&id, &name, &unit)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(fmt.Sprintf("%s, %s, %s", id, name, unit))
    }
}