站長資訊網
最全最豐富的資訊網站

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

下面由golang教程欄目給大家介紹關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包) ,希望對需要的朋友有所幫助!

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

Go 附帶的 database/sql 庫可以與任何關系數據庫進行對話. 為了抽象鏈接到數據庫以及管理連接池的一些底層復雜性, 暴露的 APIs 比實際預期要多一點. 最終導致了一些關于如何使用這些 APIs 的想象.

因此, 我將嘗試分析一下使用之前已知的主要 API 的行為.

我在主機的一個虛擬機 (ubuntu) 和一個 mysql 服務器上運行的 Go 應用程序進行了實驗.

Query tried: insert into items (name, price, description) values (‘brownie’,240,’sizzling’)

查詢

每當我們進行 select 時都應該是始終使用 db.Query, 并且我們絕不應該護理 Query 返回的rows, 而應對其進行迭代 (否則我們會泄露數據庫鏈接)

執行 Query(query) 將不使用準備好的語句 (可參閱下面的 wireshark 捕獲內容)

  • 注意從客戶端到服務器僅發送了 1 個 TCP 請求 (減去登錄)
  • 當迭代返回的 rows 時鏈接將自動釋放回到池中, 或則我們可以在完成之后顯式調用 rows.Close()
  • 用法 — db.Query(“insert into items (name, price, description) values(‘brownie’, 240, ‘sizzling’)”)

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

查看 wireshark 捕獲 (query)

執行 Query(queryTemplate, params) 將在幕后 使用準備好的語句

  • 注意從客戶端向服務器發送了 3 個 TCP 請求 (減去登錄)
  • 當迭代完返回的 rows 時, 鏈接將自動釋放回到池中, 或者我們可以在完成之后顯式調用 rows.Close().
  • 用法 — db.Query(“insert into items (name, price, description) values(?,?,?)”, “brownie”, 240, “sizzling”)

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

Query(query, params) 的 wireshark 捕獲

Exec

每當我們想要執行 insertupdatedelete 時都應該始終使用 db.Exec.

執行 Exec(query) 不會使用預備語句, 因此對 SQL Server 的 TCP 調用更少

  • 注意從客戶端到服務器僅發送了 1 個 TCP 請求 (減去登錄)
  • 自動釋放鏈接回到池.
  • 用法 — db.Exec(“insert into items (name, price, description) values(‘brownie’, 240, ‘sizzling’)”)

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

Exec(query) 的 wireshark 捕獲

執行 Exec(queryTemplate, params) 將在幕后使用預備語句, 因此對 SQL Server 的 TCP 調用會多一些.

  • 注意從客戶端向服務器發送了 3 個 TCP 請求 (減去登錄)
  • 釋放鏈接自動回到池.
  • 用法 — db.Exec(“insert into items (name, price, description) values(?,?,?)”, “brownie”, 240, “sizzling”)

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

Exec(query, params) 的 wireshark 捕獲

Prepare

僅當我們的程序要在開始時準備一次并在程序執行期間執行 N 次時, 才應使用此方法.

  • 注意有從客戶端到服務端發送了 2 個 TCP 請求 (不算登錄)
  • 當我們不需要預備語句時我們需要顯式關閉語句. 否則, 我們將無法釋放客戶端和服務器上分配的資源!
  • 用法 — stmt.Exec(“insert into items (name, price, description) values(?,?,?)”, “brownie”, 240, “sizzling”)

關于Go SQL中的Query、Exec和Prepare使用對比(附網絡抓包)

Prepare(query) 的 wireshark 捕獲

結論

第一次使用 sql 包時, 我們遇到的主要困惑之一是, 即使我們沒有明確指示這樣做, 我們也不知道其在幕后創建了預備語句.

希望上述內容可以闡述清楚, 我們應該何時使用預備語句以及如何規避它們.
Hopefully the points above clarify, when are prepared statements invoked and how we can avoid them.

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲精品中文字幕无乱码麻豆| 91全国探花精品正在播放| 91精品视品在线播放| 精品无码久久久久久久动漫 | 日本精品视频在线观看| 麻豆一区二区三区精品视频| www久久只有这里有精品 | 久久久g0g0午夜无码精品| 97久久国产露脸精品国产| 国产成人青青热久免费精品| 无码国内精品久久人妻| 国产精品亚洲精品日韩电影| 国产成人精品男人的天堂538| 久久综合精品国产二区无码| 亚洲精品97久久中文字幕无码| 国产精品亚洲av色欲三区| 久久久精品2019中文字幕2020| 色婷婷精品免费视频| 中文字幕日韩三级片| 国产精品亚洲午夜一区二区三区| 精品无码国产污污污免费网站国产 | 99re6这里只有精品视频| 国产精品成人h片在线| 精品国产区一区二区三区在线观看| 久久久久久国产精品视频 | 国产高清国产精品国产专区| 538精品在线观看| 亚洲系列国产精品制服丝袜第| 69国产成人精品视频软件| 1卡二卡三卡四卡精品| 精品综合久久久久久97| 国产精品涩涩涩视频网站| 精品女同一区二区三区在线| 日韩在线免费视频| 精品无码久久久久久国产| 久久久99精品成人片| 人妻精品久久久久中文字幕一冢本| 亚洲国产精品乱码一区二区| 国产成人精品cao在线| 亚洲精品第一国产综合精品99| 国产高清国内精品福利99久久|