Golang访问(2.0版)
更新时间:
本文介绍如何使用Golang连接云原生数据仓库 AnalyticDB MySQL 版2.0集群。
前提条件
下载并安装Golang,请参见Golang。
安装Golang MySQL Driver。
下载Golang MySQL Driver,请参见 Golang MySQL Driver。
使用Shell中的go工具将驱动包安装到
$GOPATH
中。go get github.com/go-sql-driver/mysql
说明要求在您的主机和系统的PATH中安装了Git。
连接AnalyticDB for MySQL 2.0
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
const (
user = "xxx"
password = "xxx"
host = "127.0.0.1"
port = 3306
database = "xxx"
// 数据库连接的超时时间
connectTimeout = "10s"
)
func main() {
// 打开数据库连接
//user为AnalyticDB MySQL 2.0集群的用户账号,通常为阿里云AK的AccessKey ID。
//password为AnalyticDB MySQL 2.0集群的用户密码,通常为阿里云AK的Access Key Secret。
//host为AnalyticDB MySQL 2.0集群的访问URL的域名或IP。
//port为AnalyticDB MySQL 2.0集群的访问URL端口。
//database为AnalyticDB MySQL 2.0集群的名称。
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)
// 设置连接的最大生命周期,默认连接总是可重用。
// 不能保证连接将在连接池中存在完整的1小时,很可能由于某种原因连接将变得不可用,并且在此之前自动关闭。
// 这不是空闲超时。连接将在第1次创建后1小时后过期,而不是1小时后变成空闲。
// 理论上,ConnMaxLifetime越短,从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)
}
}
开启客户端的PrepareStatement
目前AnalyticDB for MySQL 2.0不支持服务端预编译,只支持在客户端使用Prepared Statement。
在Go MySQL driver中开启PrepareStatement时,需要配置interpolateParams=true
参数,如下所示。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"time"
)
const (
user = "xxx"
password = "xxx"
host = "127.0.0.1"
port = 3306
database = "xxx"
// 数据库连接的超时时间。
connectTimeout = "10s"
)
func main() {
// open the database connection
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)
// 设置连接的最大生命周期,默认连接总是可重用。
// 不能保证连接将在池中存在完整的1小时,很可能由于某种原因连接将变得不可用,并且在此之前自动关闭。
// 这不是空闲超时。连接将在第1次创建后1小时后过期,而不是1小时后变成空闲。
// 理论上,ConnMaxLifetime越短,从0开始创建连接的频率就越高。
db.SetConnMaxLifetime(time.Hour)
defer db.Close()
rows, err := db.Query("select * from student where student_id = ?", 1)
if err != nil {
panic(err.Error())
}
defer rows.Close()
for rows.Next() {
var schoolId string
var studentId string
var studentName string
err := rows.Scan(&schoolId, &studentId, &studentName)
if err != nil {
panic(err.Error())
}
fmt.Println(fmt.Sprintf("%s, %s, %s", schoolId, studentId, studentName))
}
}
该文章对您有帮助吗?