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

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

Golang 訪問共享連接資源的最佳實踐?

Golang 訪問共享連接資源的最佳實踐?

Go
肥皂起泡泡 2021-11-01 16:56:28
在 golang(RabbitMQ、數據庫等)中處理與外部服務的共享連接資源的處理范圍的最佳實踐是什么?例如,給定這段代碼使用 database/sql、pq 和 http:func main() {    db, err := sql.Open("postgres", "user=root dbname=root")        if err != nil {        log.Fatal(err)    }    http.HandleFunc("/", front_handler)    http.HandleFunc("/get", get_handler)    http.HandleFunc("/set", set_handler)    http.ListenAndServe(":8080", nil)}使db對象可供我注冊的處理程序使用的最佳方法是什么?我是否將db聲明放在主要范圍之外(這會導致我在 Python 中出現單元測試問題,但在這里可能沒問題)?我是否將處理程序聲明放在主范圍內(似乎不允許我嵌套函數)?是否有我可以用來訪問主范圍的尋址方案(我會在 puppet 中做類似的事情)?還有其他選擇嗎?
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

有很多方法可以解決這個問題。首先,在此范圍內打開連接后,您可能希望將其推遲到此處關閉。


db, err := sql.Open("postgres", "user=root dbname=root")

        if err != nil {

        log.Fatal(err)

    }

defer db.Close()

這將確保在您離開此范圍時清除連接。關于您的處理程序......將它們編寫為與連接相同范圍內的閉包很簡單,因此您可以自由使用它。


編輯:澄清一下,你說你認為你不能在 main.js 中嵌套函數。你可以用類似的東西來做到這一點;


get_handler := func() {

      return db.ReadTheData()

}

http.HandleFunc("get", get_handler)


查看完整回答
反對 回復 2021-11-01
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

大多數應用程序從全局范圍內的數據庫處理程序開始是很常見的。sql.DB被定義為對并發訪問是安全的,因此可以被所有需要它的處理程序同時使用。


var db *sql.DB


func main() {

    var err error

    db, err = sql.Open("postgres", "user=root dbname=root")

    if err != nil {

        log.Fatal(err)

    }

...


查看完整回答
反對 回復 2021-11-01
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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