## 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)
- 前言
- 第一章 I/O和文件系統
- 常見 I/O 接口
- 使用bytes和strings包
- 操作文件夾和文件
- 使用CSV格式化數據
- 操作臨時文件
- 使用 text/template和HTML/templates包
- 第二章 命令行工具
- 解析命令行flag標識
- 解析命令行參數
- 讀取和設置環境變量
- 操作TOML,YAML和JSON配置文件
- 操做Unix系統下的pipe管道
- 處理信號量
- ANSI命令行著色
- 第三章 數據類型轉換和解析
- 數據類型和接口轉換
- 使用math包和math/big包處理數字類型
- 貨幣轉換和float64注意事項
- 使用指針和SQL Null類型進行編碼和解碼
- 對Go數據編碼和解碼
- Go中的結構體標簽和反射
- 通過閉包實現集合操作
- 第四章 錯誤處理
- 錯誤接口
- 使用第三方errors包
- 使用log包記錄錯誤
- 結構化日志記錄
- 使用context包進行日志記錄
- 使用包級全局變量
- 處理恐慌
- 第五章 數據存儲
- 使用database/sql包操作MySQL
- 執行數據庫事務接口
- SQL的連接池速率限制和超時
- 操作Redis
- 操作MongoDB
- 創建存儲接口以實現數據可移植性
- 第六章 Web客戶端和APIs
- 使用http.Client
- 調用REST API
- 并發操作客戶端請求
- 使用OAuth2
- 實現OAuth2令牌存儲接口
- 封裝http請求客戶端
- 理解GRPC的使用
- 第七章 網絡服務
- 處理Web請求
- 使用閉包進行狀態處理
- 請求參數驗證
- 內容渲染
- 使用中間件
- 構建反向代理
- 將GRPC導出為JSON API
- 第八章 測試
- 使用標準庫進行模擬
- 使用Mockgen包
- 使用表驅動測試
- 使用第三方測試工具
- 模糊測試
- 行為驅動測試
- 第九章 并發和并行
- 第十章 分布式系統
- 第十一章 響應式編程和數據流
- 第十二章 無服務器編程
- 第十三章 性能改進