learn golang for example coroutines go

golang - ¿Cómo compartir la conexión de mysql entre http goroutines?



goroutine timeout (1)

Soy un novato de Go y no puedo encontrar ejemplos completos de cómo abrir una conexión de MySQL en Go y luego compartirla entre los manejadores de http. Aquí está mi código hasta ahora, ¿cómo usaría la conexión db que abrí en main () en mi 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") }


El paquete database / sql administra automáticamente la agrupación de conexiones.

sql.Open(..) devuelve un identificador que representa un grupo de conexiones , no una sola conexión. El paquete database / sql abre automáticamente una nueva conexión si todas las conexiones en el grupo están ocupadas.

Aplicado a su código, esto significa que solo necesita compartir el controlador de base de datos y usarlo en los controladores 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) } }