如何共享http goroutines之间的mysql连接? [英] How to share mysql connection between http goroutines?

查看:95
本文介绍了如何共享http goroutines之间的mysql连接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Go noob,并且找不到任何在Go中打开mysql连接然后在http处理程序中共享它的完整示例。这是我的代码到目前为止,我将如何使用我在HomeHandler中的main()中打开的db连接?

  package main 

import(
database / sql
fmt
_github.com/go-sql-driver/mysql
github.com/gorilla/mux
log
net / http

$ b func main(){

fmt.Println(启动)

db,err:= sql.Open (mysql,root:@ / mydb?charset = utf8)
if err!= nil {
log.Fatalf(Error opening database:%v,err)
}

db.SetMaxIdleConns(100)
$ b $:= 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(..)返回一个句柄,其中表示连接池,而不是单个连接。如果池中的所有连接都忙,database / sql包会自动打开一个新连接。

这意味着,您只需要共享db-处理并在HTTP处理程序中使用它:

  package main 

import(
数据库/ sql
fmt
github.com/gorilla/mux
_github.com/go-sql-driver/mysql
log
net / http


var db * sql.DB //在main和HTTP处理程序之间共享它的全局变量

func main (){
fmt.Println(启动)

var err错误
db,err = sql.Open(mysql,root @ unix(/ tmp /mysql.sock)/ mydb)//这并不真正打开一个新连接
如果err!= nil {
log.Fatalf(初始化数据库连接时出错:%s,错误。 Error())
}

db.SetMaxIdleConns(100)

err = db.Ping()//如果需要的话,这会打开一个连接。这确保数据库可以访问
,如果err!= nil {
log.Fatalf(打开数据库连接时出错:%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:扫描(& msg)
if err!= nil {
fmt.Fprintf(w,数据库错误!)
} else {
fmt.Fprintf(w,msg)
}
}


I'm a Go noob and can't find any complete examples of opening a mysql connection in Go and then sharing it among http handlers. Here is my code so far, how would I use the db connection that I opened in main() in my HomeHandler?

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")

}

解决方案

The database/sql package manages the connection pooling automatically for you.

sql.Open(..) returns a handle which represents a connection pool, not a single connection. The database/sql package automatically opens a new connection if all connections in the pool are busy.

Applied to your code this means, that you just need to share the db-handle and use it in the HTTP handlers:

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)
    }
}

这篇关于如何共享http goroutines之间的mysql连接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆