GoでローカルのMySQLにPingする
直感に反するが、sql.Openを行った時点ではドライバーは何もしていない。underlying datastoreとの接続準備をしているだけ
Open may just validate its arguments without creating a connection to the database. To verify that the data source name is valid, call Ping.
すぐに接続を確かめたければ、db.Ping関数を用いる → Doc Ping verifies a connection to the database is still alive, establishing a connection if necessary.
sql.DBオブジェクトは使い終わったらCloseするべきだが、頻繁にOpen/Closeするべきではない。long-lifetimeで使われることを意図している
lifetimeの短い関数の中でOpen/Closeしないこと。
むしろ、引数によって引き回して使うべき
Q. これはなぜ?頻繁にOpen/Closeすると何が困る?
you could experience problems such as poor reuse and sharing of connections, running out of available network resources, or sporadic failures due to a lot of TCP connections remaining in TIME_WAIT status.
code:main.go
package main
import (
"database/sql"
"log"
"os"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:mysql@tcp(127.0.0.1:43306)/hello")
if err != nil {
log.Print(err)
os.Exit(1)
}
if err := db.Ping(); err != nil {
log.Print(err)
}
defer db.Close()
}