go mysql连接池超时,SQL的连接池速率限制和超时

## SQL的连接池速率限制和超时

尽管database/sql包提供了连接池速率限制和超时,调整默认值以更好地适应数据库配置通常很重要。当你在微服务上进行水平扩展并且不希望保持与数据库的过多活动连接时,这可能很重要。

### 实践

1. 建立 pools.go:

```

package pools

import (

"database/sql"

"fmt"

"os"

_ "github.com/go-sql-driver/mysql"

)

func Setup() (*sql.DB, error) {

db, err := sql.Open("mysql",

fmt.Sprintf("%s:%s@/gocookbook?parseTime=true", os.Getenv("MYSQLUSERNAME"), os.Getenv("MYSQLPASSWORD")))

if err != nil {

return nil, err

}

// 仅开放24个连接

db.SetMaxOpenConns(24)

// MaxIdleConns不可以比SetMaxOpenConns的值小 否则会将SetMaxOpenConns的值作为默认值

db.SetMaxIdleConns(24)

return db, nil

}

```

2. 建立 timeout.go:

```

package pools

import (

"context"

"time"

)

// ExecWithTimeout 使用context来实现超时

func ExecWithTimeout() error {

db, err := Setup()

if err != nil {

return err

}

ctx := context.Background()

// 我们希望立刻超时

ctx, can := context.WithDeadline(ctx, time.Now())

// 在函数完成后调用cancel

defer can()

// 以当前context为参数

_, err = db.BeginTx(ctx, nil)

return err

}

```

3. 建立 main.go:

```

package main

import "github.com/agtorre/go-cookbook/chapter5/pools"

func main() {

if err := pools.ExecWithTimeout(); err != nil {

panic(err)

}

}

```

4. 这会输出:

```

panic: context deadline exceeded

goroutine 1 [running]:

main.main()

/go/src/github.com/agtorre/gocookbook/chapter5/pools/example/main.go:7 +0x4e

exit status 2

```

### 说明

限制数据库连接池深度非常有用,这将保护数据库不会超载,不过更重要的是考虑context在这里的使用。如果你强制限制一定数量的连接并严格的基于上下文的超时,就像我们在示例中所做的那样,在某些情况下,会出现有一些请求经常超时并试图建立过多连接导致程序重载。

这个新加入sql包的函数使得包括查询在内的请求共享超时更加简单。

使用全局配置对象传递给Setup()函数是有意义的,当然我们在这里使用的是环境变量。

* * * *

学识浅薄,错误在所难免。欢迎在群中就本书提出修改意见,以飨后来者,长风拜谢。

Golang中国(211938256)

beego实战(258969317)

Go实践(386056972)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值