本文介绍如何使用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))
}
}