首頁 > 後端開發 > Golang > 在 Go 中插入行時如何避免 Postgres 連接池耗盡?

在 Go 中插入行時如何避免 Postgres 連接池耗盡?

Mary-Kate Olsen
發布: 2024-12-13 02:59:09
原創
142 人瀏覽過

How to Avoid Postgres Connection Pool Exhaustion When Inserting Rows in Go?

Go 中行插入的可重複使用Postgres 資料庫連接:解決連接池耗盡

目標是使用單一可重複使用Postgres 資料庫連接Go 中的行插入。該錯誤是由於連接處理不當導致程式碼無意中打開多個連接而引起的。

Postgres 的連線池機制 sql.DB 維護的是連線快取而不是單一連線。它根據需要動態分配連接,最高可達 Postgres 伺服器的最大連接限制。但是,當使用 QueryRow 時,如果不對傳回的 Row 值呼叫 Scan,則無法正確釋放連線。

內部保存 Rows 實例的 Row 物件管理自己的連線。只有在呼叫 Scan 時,連線才會自動釋放。忽略呼叫 Scan 會保持連線被佔用,從而迫使 DB 在後續 QueryRow 呼叫中開啟新連線。由於在沒有釋放連接的情況下發生這種情況,池會耗盡,問題就會出現。

要解決此問題,您可以採用以下任一方法:

  • 如果結果是,則使用 Exec查詢無關緊要。
  • 在傳回的*Row 上呼叫Scan 以釋放

這是包含這些變更的修訂後的程式碼片段:

// ...

func main() {

    // ...

    // msg handling

    sqlStatement := `
    INSERT INTO heartbeat ("Legend", "Status", "TimeStamp")
    VALUES (, , )
    `

    row := db.QueryRow(sqlStatement, Legend, Status, TimeStamp)
    row.Scan(&dummy)  // dummy variable to discard the result

    // ...

}

// ...
登入後複製

這可確保連線及時釋放,防止資料庫連線池耗盡。

以上是在 Go 中插入行時如何避免 Postgres 連接池耗盡?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板