2013-06-29 3 views
34

저는 Go 멍청한 놈이어서 Go에서 MySQL 연결을 열고 HTTP 처리기에서 공유하는 완전한 예제를 찾을 수 없습니다. 지금까지 내 코드가있다. 내 HomeHandler에서 main()에서 연 DB 연결을 사용하는 방법은 무엇입니까?http goroutines간에 mysql 연결을 공유하는 방법은 무엇입니까?

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

} 

답변

55

데이터베이스/sql 패키지는 자동으로 연결 풀링을 관리합니다.

sql.Open(..)이 단일 연결이 아닌 연결 풀을 나타내는 핸들을 반환합니다. 데이터베이스/sql 패키지는 풀의 모든 연결이 사용중인 경우 자동으로 새 연결을 엽니 다.

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", "[email protected](/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) 
    } 
} 
+0

안녕 줄리앙, 덕분에 응답을 위해 :

방금 ​​DB-핸들을 공유하고 HTTP 핸들러에서 사용할 필요가, 코드 이것이 의미에 적용. Go-MySQL-Driver의 저자보다 더 나은 소스를 기대할 수 없었습니다! './main.go:18 : 다중 할당에서 sql.DB를 db (유형 sql.DB)에 할당 할 수 없습니다 .' – Jason

+0

죄송합니다. 수정했습니다. 오류가 발생했습니다. 지금 입력하십시오. @ fmt.Println.MKO가 작동하지 않는 것은 여전히 ​​사실입니다. 데이터베이스/sql은 이와 같은 동시 사용 사례를 위해 정확하게 설계되었습니다. –

+0

FYI, HTTP 처리기에서 DB에 액세스하는 방법에 대한 간단한 예제가 있습니다. https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/go/src/hello/hello.go –

관련 문제