溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在使用database/sql時應避注意的事項

發布時間:2020-10-28 10:10:06 來源:億速云 閱讀:156 作者:小新 欄目:編程語言

這篇文章主要介紹在使用database/sql時應避注意的事項,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們是 Go 語言及其數據庫訪問庫 database/sql 的忠實粉絲。正如你可能親眼看到的那樣,database/sql 的體積非常小,但是你可以用它做很多事情。這包括大量的錯誤和欺騙性錯誤的風險。這篇博文專門介紹我們過去犯過的一些錯誤,希望到時候你不會再犯同樣的錯誤。

常見陷阱

  • 在循環內延遲。 長生命期函數在循環內有查詢,在循環內延遲 rows.Close(),會導致內存和連接使用量都無限制地增長。

  • 打開許多 db 對象。 請創建一個全局sql.DB,并且不要為你的 API 服務器應該響應的每個傳入 HTTP 請求打開一個新的。否則,你將打開和關閉大量到數據庫的 TCP 連接。 TIME_WAIT 狀態下的延遲,負載和 TCP 連接很多。

  • 操作完成后不做 rows.Close()。 忘記關閉 rows 變量意味著連接泄漏。再加上服務器上不斷增長的負載,這可能意味著會遇到 max_connections 錯誤或類似情況。請盡快運行 rows.Close() ,即使它稍后會再次用到(也是無害的)。出于同樣的原因,將 db.QueryRow().Scan() 鏈接在一起。

  • 預處理語句膨脹。 如果代碼以高并發運行,請考慮預處理語句是否是正確的解決方案,因為當連接繁忙時,它們可能會在不同的連接上多次重新預處理。

  • strconv 或 casts 使代碼雜亂無章。 建議將結果掃描到一個你想要的類型的變量中,讓 .Scan() 在幕后為你轉換。

  • 錯誤處理和重試導致代碼混亂。database/sql 為你處理連接池、重新連接和重試邏輯。

  • rows.Next() 之后忘記檢查錯誤。 別忘了,rows.Next() 循環可能會異常退出。

  • 使用 db.Query() 進行非 SELECT 查詢。 如果沒有結果集,不要告訴 Go 你希望在結果集上迭代,否則會泄露連接。

  • 假設后續語句使用相同的連接。 如果連續運行兩個語句,則它們很可能在兩個不同的連接上運行。運行 LOCK TABLES tbl1 WRITE,然后運行SELECT * FROM tbl1,你很可能會阻塞并等待。如果需要保證使用單條語句,則需要使用參數 sql.Tx。

  • 在使用 TX 的同時訪問數據庫。 sql.Tx 與事務綁定,但數據庫沒有綁定,所以訪問它不會參與事務。

  • 對一個 NULL 感到驚訝。 你不能將一個 NULL 類型掃描成變量,除非它是 database/sql 包提供的 NullXXX 類型之一(或者是你自己制作的,或者是驅動提供的),否則。仔細檢查您的模式,因為如果一個列可以是 NULL,那么總有一天它會變成 NULL,而在測試中有效的內容可能會在生產中崩潰。

以上是在使用database/sql時應避注意的事項的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女