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 包在內部進行連接池,根據需要打開和關閉連接,同時提供可以并發使用的單個連接的錯覺。
可能您需要在別處尋找驅動程序損壞的原因。關于這方面的更多細節將使人們更容易弄清楚發生了什么。

蝴蝶不菲
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 語句。
- 2 回答
- 0 關注
- 198 瀏覽
添加回答
舉報
0/150
提交
取消