首页 > 解决方案 > SQL 不断打开套接字,导致打开文件过多错误。有没有更好的方法来处理 GO 中的 SQL 连接?

问题描述

我在 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"))
}

标签: gogo-echo

解决方案


推荐阅读