本文介绍如何使用Golang连接AnalyticDB for MySQL。

前提条件

  • 下载并安装Golang
  • 安装Golang MySQL Driver。
    1. 下载 Golang MySQL Driver
    2. 使用Shell中的go工具将驱动包安装到$GOPATH中。
      go get github.com/go-sql-driver/mysql
      说明 要求在您的主机和系统的PATH中安装了Git。

连接AnalyticDB for MySQL

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)
const (
   //user是AnalyticDB for MySQL集群中的用户账号:高权限账号或者普通账号。
    user = "xxx"
    //password是AnalyticDB for MySQL集群中用户账号对应的密码。
    password = "xxx"
    //host是AnalyticDB for MySQL集群的连接地址,可以在控制台的集群信息页面获取连接地址。
    host = "127.0.0.1"
    //3306是端口号。
    port = 3306
    //database是AnalyticDB for 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)
    // 设置连接的最大生命周期,默认连接总是可重用。
    // 无法保证数据库连接在连接池中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)
    }
}

开启服务端的Prepared Statement

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)
const (
   //user是AnalyticDB for MySQL集群中的用户账号:高权限账号或者普通账号。
    user = "xxx"
    //password是AnalyticDB for MySQL集群中用户账号对应的密码。
    password = "xxx"
    //host是AnalyticDB for MySQL集群的连接地址,可以在控制台的集群信息页面获取连接地址。
    host = "127.0.0.1"
    //3306是端口号。
    port = 3306
    //database是AnalyticDB for MySQL集群中的数据库名称。
    database = "xxx"
    //数据库连接的超时时间。
    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)
    // 设置连接的最大生命周期,默认连接总是可重用。
    // 不能保证连接将在池中存在完整的一小时;很可能由于某种原因连接将变得不可用,并且在此之前自动关闭.
    // 这不是空闲超时。连接将在第1次创建后1小时后过期,而不是1小时后变成空闲。
    // 理论上,ConnMaxLifetime越短,从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,如下所示。

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)
const (
    //user是AnalyticDB for MySQL集群中的用户账号:高权限账号或者普通账号。
    user = "xxx"
    //password是AnalyticDB for MySQL集群中用户账号对应的密码。
    password = "xxx"
    //host是AnalyticDB for MySQL集群的连接地址,可以在控制台的集群信息页面获取连接地址。
    host = "127.0.0.1"
    //3306是端口号。
    port = 3306
    //database是AnalyticDB for MySQL集群中的数据库名称。
    database = "xxx"
    //数据库连接的超时时间。
    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)
    //设置连接的最大生命周期,默认是连接总是可重用。
    //不能保证连接将在池中存在完整的1个小时,很可能由于某种原因连接将变得不可用,并且在此之前自动关闭。
    //不是空闲超时。连接将在第1次创建后1小时后过期,而不是1小时后变成空闲。
    //理论上,ConnMaxLifetime越短,从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))
    }
}