一个mysql连接应该在golang中存在多长时间

cli*_*ong 6 mysql go

我正在使用golang和阅读本文档的 mysql .它说

尽管在完成数据库时Close()数据库是惯用的,但sql.DB对象的设计是长期存在的.不经常打开()和关闭()数据库.

我不知道连接应该有多长时间.现在,如有必要,我会打开每个http请求的连接.太频繁了吗?

Iam*_*NaN 14

在同一份文件的下面是:

而是为您需要访问的每个不同数据存储创建一个sql.DB对象,并保留它直到程序完成访问该数据存储.根据需要传递它,或者以某种方式在全球范围内提供它,但保持打开状态.并且不要从短期函数中打开()和关闭().相反,将sql.DB作为参数传递给该短期函数.

如果不将sql.DB视为长期存在的对象,则可能会遇到诸如重用和连接共享不良,可用网络资源不足或偶发故障等问题,因为TIME_WAIT中存在大量TCP连接状态.这些问题表明你没有像设计那样使用数据库/ sql.

打开和关闭数据库连接是一项代价高昂的操作,因此您希望尽可能避免这种情况.你肯定不想在每次请求后关闭连接(除非每天只有几个,即使这样,只要应用程序运行,你就可以保持打开状态)

database/sql包使用连接池,因此您不必担心管理多个连接.


eli*_*rar 7

没有权威的答案,因为它取决于您使用的驱动程序.如果你使用的是:

...那么你根本不应该关闭你sql.DB.在sql.DB这些情况下,代表一个连接池,并在处理器/请求/功能,使用它你只是用从池(如果可用)的连接手段.

例如

var db *sql.DB

func setup() error {
    var err error
    db, err = sql.Open(...)
    if err != nil {
        log.Fatal(err)
    }

    // Other setup-related activities
}

func main()
    err := setup()
    if err != nil {
        log.Fatal(err)
    }

    // No need to call `defer db.Close()` here
    http.ListenAndServe(...)
}

func SomeHandler(w http.ResponseWriter, r *http.Request) {
    u := User{}
    res, err := db.GetThings(&u)
    // No need to close this here - it's just a connection dynamically pulled
    // from our sql.DB connection pool in most cases
}
Run Code Online (Sandbox Code Playgroud)