首页  >  文章  >  后端开发  >  如何在 Go 中的多个 HTTP goroutine 之间共享 MySQL 连接?

如何在 Go 中的多个 HTTP goroutine 之间共享 MySQL 连接?

Linda Hamilton
Linda Hamilton原创
2024-11-10 09:56:02548浏览

How do I share a MySQL connection across multiple HTTP goroutines in Go?

在 Go HTTP Goroutines 中共享 MySQL 连接

在 Go 中使用 HTTP Goroutines 时,通过共享数据库连接来优化性能至关重要。本文演示了如何在多个 HTTP 处理程序之间建立和共享 MySQL 连接。

数据库连接管理

在 Go 中,database/sql 包自动处理连接池。当调用 sql.Open(...) 时,会创建一个连接池而不是单个连接。这意味着如果所有连接都已在使用中,database/sql 包将自动从池中获取连接。

代码实现

要在 HTTP goroutine 中共享 MySQL 连接,请按照以下步骤操作步骤:

  1. 初始化数据库连接:

    • 使用 sql.Open("mysql", "")。

    示例:

    db, err := sql.Open("mysql", "root:@/mydb?charset=utf8")
    if err != nil {
        log.Fatalf("Error opening database: %v", err)
    }
  2. 配置连接池:

    • 调整最大值使用 db.SetMaxIdleConns(100).
  3. 共享连接句柄的空闲连接数:

    • 声明数据库变量作为全局变量在 main 和 HTTP 之间共享

    示例:

    var db *sql.DB
  4. 检查数据库连接:

    • 在main()中调用db.Ping()建立初始连接到数据库。

    示例:

    err = db.Ping()
    if err != nil {
        log.Fatalf("Error opening database connection: %s", err.Error())
    }
  5. 在 HTTP 处理程序中使用连接:

    • 在 HTTP 处理程序中,使用共享数据库句柄执行数据库查询。

    示例:

    func HomeHandler(w http.ResponseWriter, r *http.Request) {
        var msg string
        err := db.QueryRow("SELECT msg FROM hello WHERE page=?", "home").Scan(&msg)
        if err != nil {
            fmt.Fprintf(w, "Database Error!")
        } else {
            fmt.Fprintf(w, msg)
        }
    }

按照以下步骤,您可以在多个数据库之间高效共享 MySQL 连接HTTP goroutine 不会影响性能。

以上是如何在 Go 中的多个 HTTP goroutine 之间共享 MySQL 连接?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn