我想了解杜松子酒如何确保每个HTTP请求都会获得唯一的DB(例如MySQL)连接。这是一个示例代码。如果您看到的话,因为" db"是一个全局对象,因此,api路由器。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 : %+vn", 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")
}
为每个HTTP请求建立新的SQL连接太重,没有意义。
在Go中,还没有可操作的连接池,它是通过实现内部来处理的。
sql.DB
准备同时使用,因此不用担心。
杜松子酒与SQL连接无关。正确处理查询/交易完全是您的责任。