首頁  >  文章  >  後端開發  >  使用database/sql時應避免掉進這11個坑 ! (Go 資料庫)

使用database/sql時應避免掉進這11個坑 ! (Go 資料庫)

藏色散人
藏色散人轉載
2020-10-27 13:50:212195瀏覽

我們是 使用database/sql時應避免掉進這11個坑 ! (Go 資料庫) 語言及其資料庫存取程式庫 database/sql

的忠實粉絲。正如你可能親眼看到的那樣,

database/sql使用database/sql時應避免掉進這11個坑 ! (Go 資料庫) 的體積非常小,但是你可以用它做很多事情。這包括大量的錯誤和欺騙性錯誤的風險。這篇部落格文章專門介紹我們過去犯過的一些錯誤,希望到時候你不會再犯同樣的錯誤。

常見陷阱

在循環內延遲。

長生命期函數在迴圈內有查詢,在迴圈內延遲

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 查詢。
  • 如果沒有結果集,不要告訴 使用database/sql時應避免掉進這11個坑 ! (Go 資料庫) 你希望在結果集上迭代,否則會洩漏連線。
  • 假設後續語句使用相同的連線。 如果連續執行兩個語句,則它們很可能會在兩個不同的連線上運作。運行

    LOCK TABLES tbl1 WRITE
  • ,然後運行
  • SELECT * FROM tbl1

    ,你很可能會阻塞並等待。如果需要保證使用單一語句,則需要使用參數 sql.Tx在使用 TX 的同時存取資料庫。

    sql.Tx
  • 與交易綁定,但資料庫沒有綁定,所以存取它不會參與事務。
  • 對一個 NULL

    感到驚訝。
  • 你不能將一個
  • NULL

    類型掃描成變量,除非它是database/sql 套件提供的NullXXX 類型之一(或者是你自己製作的,或者是驅動提供的),否則。仔細檢查您的模式,因為如果一個列可以是 NULL,那麼總有一天它會變成 NULL,而在測試中有效的內容可能會在生產中崩潰。 原文網址:https://orangematter.solarwinds.com/2017/03/23/common-pitfalls-when-using-database-sql-in-go/

    翻譯網址:https://learnku.com/go/t/50966
#

以上是使用database/sql時應避免掉進這11個坑 ! (Go 資料庫)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除