Gin + Golang + DB连接池

时间:2017-11-29 04:08:26

标签: mysql rest go connection-pooling

我想了解GIN如何确保每个HTTP请求获得唯一的DB(比如MySQL)连接。这是一个示例代码。 如果你看到了,因为' db'是一个全局对象,因此,API router.GET(" / person /:age" ...)可以访问DB。 现在有了加载,我想GIN将在内部实现并发。如果是,那么它如何确保每个请求获得不同的连接。如果不是,则它是单线程的imnplementation。任何人都可以纠正我的理解。

package main

import (
    //  "bytes"
    "database/sql"
    "fmt"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "net/http"
)

func checkErr(err error) {
    if err != nil {
        panic(err)
    } else {
        fmt.Println("successful...")
    }
}

func main() {
    db, err := sql.Open("mysql", "abfl:abfl@tcp(127.0.0.1:3306)/abfl?charset=utf8")
    checkErr(err)
    defer db.Close()
    // make sure connection is available
    err = db.Ping()
    checkErr(err)
    type User struct {
        age  int
        name string
    }
    router := gin.Default()
    // Add API handlers here
    // GET a user detail
    router.GET("/person/:age", func(c *gin.Context) {
        var (
            user   User
            result gin.H
        )
        age := c.Param("age")
        fmt.Println("input age : '%d'", age)
        row := db.QueryRow("select age, name from user where age = ?", age)
        err = row.Scan(&user.age, &user.name)
        fmt.Printf("user : %+v\n", user)
        if err != nil {
            // If no results send null
            result = gin.H{
                "user":  nil,
                "count": 0,
            }
        } else {
            result = gin.H{
                "age":   user.age,
                "name":  user.name,
                "count": 1,
            }
        }
        c.JSON(http.StatusOK, result)
    })
    router.Run(":3000")
}

2 个答案:

答案 0 :(得分:0)

为每个HTTP请求建立一个新的SQL连接太沉重,没有任何意义 在go中还没有用户可管理的连接池,它由go实现内部处理 sql.DB已准备好同时使用,因此不用担心 GIN与SQL连接完全无关。完全有责任正确处理查询/交易。

答案 1 :(得分:0)

我在这里记录了所有答案:https://www.vividcortex.com/resources/the-ultimate-guide-to-building-database-driven-apps-with-go

database / sql包非常智能地处理带有准备好的语句的连接池,从而消除了在并发环境中使用预准备语句句柄维护连接句柄映射的麻烦。