[Go] Golang defer 與 MySQL 連接關閉的陷阱 (database is closed)


 

在 golang 某些 orm 中,你經常會看到這種用法:

func main() {
  db, err := gorm.Open("sqlite3", "test.db")
  if err != nil {
    panic("failed to connect database")
  }
  defer db.Close()

  // db 操作
}

在主邏輯中使用 defer 最后關閉連接是沒有問題的。

 

如果是在模塊化開發,我們把一些數據庫連接的操作封裝到函數中,就不能帶有 defer,比如:

func Connect() *gorm.DB {
    db, err := gorm.Open("mysql", "root:123456@(xx.xx.xx.xx:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        panic("MySql Connect error")
    }
    defer db.Close()

    return db
}

由於 defer 是在邏輯的最后執行的,實際上到 return 的時候,返回的已經是 null。

繼續操作會提示:sql: database is closed

那么我們可以把 defer db.Close() 放在具體的 repository 邏輯中。

 

合理使用 defer 釋放資源,可以有效減少資源句柄的占用。

 

Link:https://www.cnblogs.com/farwish/p/12721687.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM