2 回答

TA貢獻1784條經驗 獲得超2個贊
每次需要時都打開數據庫連接是一種資源浪費,而且速度很慢。
相反,您應該在應用程序啟動時(或在第一次需要時)創建sql.DB一次,然后將其傳遞到需要的地方(例如作為函數參數或通過某些上下文),或者簡單地將其設為全局變量,這樣每個人都可以訪問它。從多個 goroutine 調用是安全的。
引用以下文檔sql.Open():
返回的數據庫對于多個 goroutine 并發使用是安全的,并維護自己的空閑連接池。因此,Open 函數應該只被調用一次。很少需要關閉數據庫。
您可以使用包init()函數對其進行初始化:
var db *sql.DB
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
}
這里要注意的一件事是,它sql.Open()可能不會創建與您的數據庫的實際連接,它可能只是驗證其參數。要測試您是否可以實際連接到數據庫,請使用DB.Ping(),例如:
func init() {
var err error
db, err = sql.Open("yourdriver", "yourDs")
if err != nil {
log.Fatal("Invalid DB config:", err)
}
if err = db.Ping(); err != nil {
log.Fatal("DB unreachable:", err)
}
}

TA貢獻1816條經驗 獲得超6個贊
我將使用 postgres 示例
package main
導入必要的包,不要忘記 postgres 驅動程序
import (
"database/sql"
_ "github.com/lib/pq" //postgres driver
)
在包范圍內初始化您的連接
var db *sql.DB
為您的連接提供初始化功能
func init() {
var err error
db, err = sql.open("postgres", "connectionString")
//connectioString example => 'postgres://username:password@localhost/dbName?sslmode=disable'
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
// note, we haven't deffered db.Close() at the init function since the connection will close after init. you could close it at main or ommit it
}
主功能
func main() {
defer db.Close() //optional
//run your db functions
}
查看此示例 https://play.golang.org/p/FAiGbqeJG0H
- 2 回答
- 0 關注
- 408 瀏覽
添加回答
舉報