我想了解GIN是如何确保每个HTTP请求获得唯一的DB (比如MySQL )连接的。下面是一个示例代码。如果您看到,由于'db‘是一个全局对象,因此,接口router.GET("/person/:age"...获取对DB的访问权限。现在有了load,我想GIN将在内部实现并发。如果是,那么它如何确保每个请求获得不同的连接。如果不是,则是单线程实现。谁能纠正我的理解。
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")
}发布于 2017-11-29 23:58:05
为每个HTTP请求建立一个新的SQL连接太繁重,没有任何意义。
在go中还没有用户可管理的连接池,它是由go实现在内部处理的。
sql.DB已经准备好并发使用,所以不用担心。
GIN与SQL连接一点关系都没有。正确处理查询/事务完全是您的责任。
https://stackoverflow.com/questions/47544906
复制相似问题