亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 應用程序中處理打開/關閉 Db 連接?

如何在 Go 應用程序中處理打開/關閉 Db 連接?

Go
神不在的星期二 2022-04-20 17:55:48
我的 Web API 應用程序中有一組函數。他們對 Postgres 數據庫中的數據執行一些操作。func CreateUser () {    db, err := sql.Open("postgres", "user=postgres password=password dbname=api_dev sslmode=disable")    // Do some db operations here}我想函數應該彼此獨立地與 db 一起工作,所以現在我sql.Open(...)在每個函數內部都有。我不知道這是否是管理數據庫連接的正確方法。我應該在應用程序啟動后在某個地方打開它并將 db 作為參數傳遞給相應的函數,而不是在每個函數中打開連接嗎?
查看完整描述

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)

    }

}


查看完整回答
反對 回復 2022-04-20
?
瀟湘沐

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


查看完整回答
反對 回復 2022-04-20
  • 2 回答
  • 0 關注
  • 408 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號