1 回答

TA貢獻1818條經(jīng)驗 獲得超3個贊
您需要關閉里面的聲明upsertProjectSkuCosts()
(或重新使用它 - 請參閱本文末尾)。
當您調(diào)用 時db.Prepare()
,會從內(nèi)部連接池中獲取一個連接(如果沒有任何空閑連接,則會創(chuàng)建一個新連接)。stmt.Exec()
然后在該連接上準備該語句(如果調(diào)用時該連接不可用,則該語句也會在另一個連接上準備)。因此,這會在您的數(shù)據(jù)庫中為該連接創(chuàng)建一個語句。這個語句不會神奇地消失——在一個連接中有多個準備好的語句是完全有效的。Golang可以看到stmt
超出范圍,看到它需要某種清理然后進行清理,但 Golang 不會(就像它不會為您關閉文件和類似的東西一樣)。所以你需要自己使用stmt.Close()
.?你打電話時stmt.Close()
,驅動程序將向數(shù)據(jù)庫服務器發(fā)送命令,告訴它不再需要該語句。
defer stmt.Close()
最簡單的方法是在檢查后添加err
以下內(nèi)容db.Prepare()
。
您還可以做的是,準備一次語句并使其可用于upsertProjectSkuCosts
(通過將stmt
into傳遞upsertProjectSkuCosts
或通過構造upsertProjectSkuCosts
結構的 func,以便結構可以具有 的屬性stmt
)。如果你這樣做,你不應該調(diào)用stmt.Close()
- 因為你不再創(chuàng)建新的語句,你正在重新使用現(xiàn)有的語句。
- 1 回答
- 0 關注
- 168 瀏覽
添加回答
舉報