1 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
您至少應(yīng)該檢查錯誤。
如“連接到數(shù)據(jù)庫”中所述:
請注意,Open不會直接打開數(shù)據(jù)庫連接:這會推遲到進行查詢時。要在進行查詢之前驗證是否可以建立連接,請使用以下Ping函數(shù):
if err := db.Ping(); err != nil {
log.Fatal(err)
}
使用后,使用 Close 關(guān)閉數(shù)據(jù)庫。
如果可能,將打開的數(shù)據(jù)庫連接數(shù)限制為最少。
參見“ Go/Golang sql.DB 在函數(shù)中的重用”:
您不需要到處打開數(shù)據(jù)庫連接。
該database/sql包在內(nèi)部進行連接池,根據(jù)需要打開和關(guān)閉連接,同時提供可以同時使用的單個連接的錯覺。
正如elithrar在評論中指出的那樣,database.sql/#Open確實提到:
返回的數(shù)據(jù)庫對于多個 goroutine 并發(fā)使用是安全的,并維護自己的空閑連接池。
因此,該Open函數(shù)應(yīng)該只調(diào)用一次。
很少需要關(guān)閉數(shù)據(jù)庫。
正如這里提到的
*sql.DB全局聲明還有一些額外的好處,例如SetMaxIdleConns(調(diào)節(jié)連接池大?。┗驕蕚淇鐟?yīng)用程序的 SQL 語句。
你可以使用一個函數(shù)init,即使你沒有它也會運行main():
var db *sql.DB
func init() {
db, err = sql.Open(DBparms....)
}
init()總是被調(diào)用,不管有沒有 main,所以如果你導(dǎo)入一個有 init 函數(shù)的包,它就會被執(zhí)行。每個包
可以有多個init()函數(shù),它們將按照它們在代碼中顯示的順序執(zhí)行(當然在所有變量都初始化之后)。
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報