我在 GO 中有一个 API,使用 echo 和 SQL Server 作为数据库。
我db.Ping()
在每个端点的开头使用来检查数据库是否仍然连接,这会不断打开与新套接字的数据库的新连接,最终导致打开文件过多错误。
db.Stats()
返回这个
{"MaxOpenConnections":0,"OpenConnections":413,"InUse":413,"Idle":0,"WaitCount":0,"WaitDuration":0,"MaxIdleClosed":2,"MaxIdleTimeClosed":62,"MaxLifetimeClosed":0}
即使活动请求的数量远低于此,OpenConnections 仍会继续增加。
这是一个示例片段:
package main
import (
"database/sql"
"github.com/labstack/echo/v4"
_ "github.com/denisenkom/go-mssqldb"
)
var db *sql.DB
func main () {
db, err = sql.Open("sqlserver", "sqlserver://username:passwrod@[server]?database=[db]&connection+timeout=1000")
if err != nil {
log.Fatal(err)
}
db.SetConnMaxLifetime(10 * time.Minute)
db.SetConnMaxIdleTime(15 * time.Second)
e := echo.New()
e.GET("/", func(c echo.Context) error {
err := db.Ping()
if err != nil {
return echo.NewHTTPError(500, err)
}
var name string
err = db.QueryRow("select top 1 name from Test_Table;").Scan(&name)
if err != nil {
return echo.NewHTTPError(500, err)
}
return c.HTML(http.StatusOK, name)
})
e.Logger.Fatal(e.Start(":4000"))
}