【发布时间】:2018-05-12 16:43:48
【问题描述】:
我想了解 GIN 如何确保每个 HTTP 请求都获得一个唯一的数据库(例如 MySQL)连接。这是一个示例代码。 如果您看到,由于 'db' 是一个全局对象,因此 API router.GET("/person/:age"... 可以访问 DB。 现在有了负载,我想 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")
}
【问题讨论】:
-
请务必正确格式化代码。正如最初发布的那样,它完全不可读。我编辑了它,但是……将来,请在发布时这样做。
-
当然谢谢。为什么我的问题是-2 :)。这是一个无效的问题吗?伙计们,我正在寻找答案。
-
为什么每个请求都需要单独的连接?事实上,好的框架可以缓存数据,因此页面加载可以不涉及数据库访问。数据库驱动程序也有自己的连接池。所以 web 和 db 请求之间没有直接关联。
-
我建议您获取并阅读this ebook 以深入了解
database/sql的实现方式。 (我不隶属于本书的作者 FWIW。) -
伟大的@kostix。这很有帮助
标签: mysql rest go connection-pooling