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

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

Go/Golang sql.DB 在函數中重用

Go/Golang sql.DB 在函數中重用

Go
Helenr 2021-07-06 13:30:49
sql.Open() 返回一個 *sql.DB 類型的變量我有一個函數可以調用 10 個其他函數,這些函數都需要進行數據庫調用是否更正確/有效:將 *sql.DB 指針發送到每個函數,或在每個函數中創建一個新的 *sql.DB 對象意義func DoLotsOfThings() {    db, _ := sql.Open()    defer db.Close()    DoTask1(db)    DoTask2(db)}或者func DoLotsOfThings() {    DoTask1()    DoTask2()}func DoTask1() {    db, _ := sql.Open()    defer db.Close()}func DoTask1() {    db, _ := sql.Open()    defer db.Close()}我問的原因是因為我目前正在向每個函數發送指針,而我的驅動程序似乎壞了。我正在使用http://code.google.com/p/odbc,這讓我相信每個功能都應該有自己的功能,并且我可以依賴驅動程序的內部結構。編輯RE 驅動程序破損,僅在高流量環境下才會發生。它只發生在說,十分鐘左右的時間之后。這讓我相信存在某種內存泄漏導致驅動程序停止工作。但是,我為 *sql.DB 的每個實例推遲了 db.Close(),所以我不知道我還能做些什么來解決這個問題。andybalholm 說連接池是在內部處理的,這似乎是準確的,因為它只會在我嘗試執行某些操作后中斷,而不是在我調用 sql.Open() 時中斷如果我讓 Go 應用程序運行,它將無法執行任何類型的 SQL 查詢,但是如果我嘗試單獨運行其他 Go 測試,連接到 MSSQL 并運行查詢,它就可以工作。
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

您不需要到處打開數據庫連接。database/sql 包在內部進行連接池,根據需要打開和關閉連接,同時提供可以并發使用的單個連接的錯覺。

可能您需要在別處尋找驅動程序損壞的原因。關于這方面的更多細節將使人們更容易弄清楚發生了什么。


查看完整回答
反對 回復 2021-07-12
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

var db *sql.DB全局聲明一個,然后在您的代碼中重用它。這是一個示例(簡化):


var db *sql.DB


func DoLotsOfThings() {

    DoTask1(db)

    DoTask2(db)

}


func main() {

  db, _ = sql.Open() # or whatever you use

  defer db.Close()

  DoLotsOfThings()

}

*sql.DB全局聲明還有一些額外的好處,例如SetMaxIdleConns(調節連接池大?。┗蛟趹贸绦蛑袦蕚銼QL 語句。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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