本文介紹如何使用Golang串連AnalyticDB MySQL版。
前提條件
- 已安裝了Git,並且已將Git路徑添加到Path環境變數中。
- 下載並安裝Golang。
- 安裝Golang MySQL Driver。
- 下載 Golang MySQL Driver。
- 使用Shell中的go工具將驅動包安裝到
$GOPATH
中。go get github.com/go-sql-driver/mysql
串連AnalyticDB MySQL版
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
//user是AnalyticDB MySQL版叢集中的使用者帳號:高許可權帳號或者普通帳號。
user = "adb_test"
//password是AnalyticDB MySQL版叢集中使用者帳號對應的密碼。
password = "xxx"
//host是AnalyticDB MySQL版叢集的串連地址,可以在控制台的叢集資訊頁面擷取串連地址。
host = "127.0.xx.xx"
//3306是連接埠號碼。
port = 3306
//database是AnalyticDB MySQL版叢集中的資料庫名稱。
database = "database_name"
//資料庫連接的逾時時間。
connectTimeout = "10s"
)
func main() {
//開啟資料庫連接。
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())
}
//設定可開啟串連數的最大值,預設值為0,表示不限制。
db.SetMaxOpenConns(2)
//設定最大閑置串連數。
db.SetMaxIdleConns(1)
// 設定串連的最大生命週期,預設串連總是可重用。
// 該設定無法保證串連在串連池中完整存在一小時。
// 該設定項不是空閑逾時時間,即串連會在第一次建立後一小時到期。
// 理論上,串連的最大生命週期越短,從0開始建立串連的頻率就會越高。
db.SetConnMaxLifetime(time.Hour)
// defer the close till after the main function has finished
// executing
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)
}
}
開啟服務端的Prepared Statement
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
const (
//user是AnalyticDB MySQL版叢集中的使用者帳號:高許可權帳號或者普通帳號。
user = "adb_test"
//password是AnalyticDB MySQL版叢集中使用者帳號對應的密碼。
password = "xxx"
//host是AnalyticDB MySQL版叢集的串連地址,可以在控制台的叢集資訊頁面擷取串連地址。
host = "127.0.xx.xx"
//3306是連接埠號碼。
port = 3306
//database是AnalyticDB MySQL版叢集中的資料庫名稱。
database = "database_name"
//資料庫連接的逾時時間。
connectTimeout = "10s"
)
func main() {
// open the database connection
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())
}
// 設定最大開啟的串連數,預設值為0,表示不限制。
db.SetMaxOpenConns(2)
// 設定最大閑置的串連數
db.SetMaxIdleConns(1)
// 設定串連的最大生命週期,預設串連總是可重用。
// 該設定無法保證串連在串連池中完整存在一小時。串連可能會因為某些原因無法使用而自動關閉。
// 該設定項不是空閑逾時時間,即串連會在第一次建立後一小時到期,而不是空閑後一小時到期。
// 理論上,串連的最大生命週期越短,從0開始建立串連的頻率就會越高。
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))
}
}
開啟用戶端的PrepareStatement
在Go MySQL Driver中開啟PrepareStatement時,需要配置參數
interpolateParams=true
開啟用戶端的PrepareStatement,如下所示。重要 db.Prepare和stmt.Query無法感知參數
interpolateParams=true
,必須使用db.Query才可開啟用戶端的PrepareStatement。package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
const (
//user是AnalyticDB MySQL版叢集中的使用者帳號:高許可權帳號或者普通帳號。
user = "adb_test"
//password是AnalyticDB MySQL版叢集中使用者帳號對應的密碼。
password = "xxx"
//host是AnalyticDB MySQL版叢集的串連地址,可以在控制台的叢集資訊頁面擷取串連地址。
host = "127.0.xx.xx"
//3306是連接埠號碼。
port = 3306
//database是AnalyticDB MySQL版叢集中的資料庫名稱。
database = "database_name"
//資料庫連接的逾時時間。
connectTimeout = "10s"
)
func main() {
//開啟資料庫連接。
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())
}
//設定最大開啟的串連數,預設值為0,表示不限制。
db.SetMaxOpenConns(2)
//設定最大閑置的串連數。
db.SetMaxIdleConns(1)
//設定串連的最大生命週期,預設是串連總是可重用。
//該設定無法保證串連在串連池中完整存在一小時。串連可能會因為某些原因無法使用而自動關閉。
//該設定項不是空閑逾時時間,即串連會在第一次建立後一小時到期,而不是空閑後一小時到期。
//理論上,串連的最大生命週期越短,從0開始建立串連的頻率就會越高。
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))
}
}