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.
- Unduh Go MySQL Driver dari go-sql-driver/mysql.
- 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))
}
}