我們是 使用database/sql時應避免掉進這11個坑 ! (Go 資料庫) 語言及其資料庫存取程式庫 database/sql
的忠實粉絲。正如你可能親眼看到的那樣,database/sql 的體積非常小,但是你可以用它做很多事情。這包括大量的錯誤和欺騙性錯誤的風險。這篇部落格文章專門介紹我們過去犯過的一些錯誤,希望到時候你不會再犯同樣的錯誤。
常見陷阱
開啟許多
db
,並且不要為你的 API 伺服器應該回應的每個傳入 HTTP 請求開啟一個新的。否則,你將開啟和關閉大量到資料庫的 TCP 連線。 TIME_WAIT 狀態下的延遲,負載和 TCP 連線很多。
操作完成後不做
rows.Close()
錯誤或類似情況。請盡快運行 rows.Close() ,即使它稍後會再次用到(也是無害的)。出於同樣的原因,將
db.QueryRow() 和 .Scan()
連結在一起。 預處理語句膨脹。
如果程式碼以高並發運行,請考慮預處理語句是否是正確的解決方案,因為當連接繁忙時,它們可能會在不同的連接上重新預處理多次。
strconv 或 casts 使程式碼雜亂無章。 建議將結果掃描到一個你想要的類型的變數中,讓
.Scan()錯誤處理和重試導致程式碼混亂。
讓
在
rows.Next()
迴圈可能會異常退出。 使用
db.Query()
假設後續語句使用相同的連線。 如果連續執行兩個語句,則它們很可能會在兩個不同的連線上運作。運行
,你很可能會阻塞並等待。如果需要保證使用單一語句,則需要使用參數 sql.Tx。 在使用 TX 的同時存取資料庫。
對一個
NULL
類型掃描成變量,除非它是database/sql 套件提供的
NullXXX 類型之一(或者是你自己製作的,或者是驅動提供的),否則。仔細檢查您的模式,因為如果一個列可以是 NULL
,那麼總有一天它會變成 NULL
,而在測試中有效的內容可能會在生產中崩潰。 原文網址:https://orangematter.solarwinds.com/2017/03/23/common-pitfalls-when-using-database-sql-in-go/
以上是使用database/sql時應避免掉進這11個坑 ! (Go 資料庫)的詳細內容。更多資訊請關注PHP中文網其他相關文章!