如何在http goroutines之间共享mysql连接



我是Go爱好者,找不到任何在Go中打开mysql连接然后在http处理程序之间共享的完整示例。这是我到目前为止的代码,我将如何使用我在HomeHandler的main()中打开的数据库连接?

package main
import (
  "database/sql"
  "fmt"
  _ "github.com/go-sql-driver/mysql"
  "github.com/gorilla/mux"
  "log"
  "net/http"
)
func main() {
  fmt.Println("starting up")
  db, err := sql.Open("mysql", "root:@/mydb?charset=utf8")
  if err != nil {
    log.Fatalf("Error opening database: %v", err)
  }
  db.SetMaxIdleConns(100)
  r := mux.NewRouter()
  r.HandleFunc("/", HomeHandler)
  http.Handle("/", r)
  http.ListenAndServe(":8080", nil)
}
func HomeHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "home")
}

数据库/sql包自动为您管理连接池。

sql.Open(..)返回一个句柄,表示连接池,而不是单个连接。如果池中的所有连接都很忙,那么数据库/sql包会自动打开一个新连接。

应用于您的代码意味着您只需要共享数据库句柄并在HTTP处理程序中使用它:

package main
import (
    "database/sql"
    "fmt"
    "github.com/gorilla/mux"
    _ "github.com/go-sql-driver/mysql"
    "log"
    "net/http"
)
var db *sql.DB // global variable to share it between main and the HTTP handler
func main() {
    fmt.Println("starting up")
    var err error
    db, err = sql.Open("mysql", "root@unix(/tmp/mysql.sock)/mydb") // this does not really open a new connection
    if err != nil {
        log.Fatalf("Error on initializing database connection: %s", err.Error())
    }
    db.SetMaxIdleConns(100)
    err = db.Ping() // This DOES open a connection if necessary. This makes sure the database is accessible
    if err != nil {
        log.Fatalf("Error on opening database connection: %s", err.Error())
    }
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}
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)
    }
}

最新更新