欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

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

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

          Go 附帶的 database/sql 庫(kù)可以與任何關(guān)系數(shù)據(jù)庫(kù)進(jìn)行對(duì)話. 為了抽象鏈接到數(shù)據(jù)庫(kù)以及管理連接池的一些底層復(fù)雜性, 暴露的 APIs 比實(shí)際預(yù)期要多一點(diǎn). 最終導(dǎo)致了一些關(guān)于如何使用這些 APIs 的想象.

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

          我在主機(jī)的一個(gè)虛擬機(jī) (ubuntu) 和一個(gè) mysql 服務(wù)器上運(yùn)行的 Go 應(yīng)用程序進(jìn)行了實(shí)驗(yàn).

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

          查詢

          每當(dāng)我們進(jìn)行 select 時(shí)都應(yīng)該是始終使用 db.Query, 并且我們絕不應(yīng)該護(hù)理 Query 返回的rows, 而應(yīng)對(duì)其進(jìn)行迭代 (否則我們會(huì)泄露數(shù)據(jù)庫(kù)鏈接)

          執(zhí)行 Query(query) 將不使用準(zhǔn)備好的語(yǔ)句 (可參閱下面的 wireshark 捕獲內(nèi)容)

          • 注意從客戶端到服務(wù)器僅發(fā)送了 1 個(gè) TCP 請(qǐng)求 (減去登錄)
          • 當(dāng)?shù)祷氐?rows 時(shí)鏈接將自動(dòng)釋放回到池中, 或則我們可以在完成之后顯式調(diào)用 rows.Close()
          • 用法 — db.Query(“insert into items (name, price, description) values(‘brownie’, 240, ‘sizzling’)”)

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

          查看 wireshark 捕獲 (query)

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

          • 注意從客戶端向服務(wù)器發(fā)送了 3 個(gè) TCP 請(qǐng)求 (減去登錄)
          • 當(dāng)?shù)攴祷氐?rows 時(shí), 鏈接將自動(dòng)釋放回到池中, 或者我們可以在完成之后顯式調(diào)用 rows.Close().
          • 用法 — db.Query(“insert into items (name, price, description) values(?,?,?)”, “brownie”, 240, “sizzling”)

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

          Query(query, params) 的 wireshark 捕獲

          Exec

          每當(dāng)我們想要執(zhí)行 insertupdatedelete 時(shí)都應(yīng)該始終使用 db.Exec.

          執(zhí)行 Exec(query) 不會(huì)使用預(yù)備語(yǔ)句, 因此對(duì) SQL Server 的 TCP 調(diào)用更少

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

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

          Exec(query) 的 wireshark 捕獲

          執(zhí)行 Exec(queryTemplate, params) 將在幕后使用預(yù)備語(yǔ)句, 因此對(duì) SQL Server 的 TCP 調(diào)用會(huì)多一些.

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

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

          Exec(query, params) 的 wireshark 捕獲

          Prepare

          僅當(dāng)我們的程序要在開(kāi)始時(shí)準(zhǔn)備一次并在程序執(zhí)行期間執(zhí)行 N 次時(shí), 才應(yīng)使用此方法.

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

          關(guān)于Go SQL中的Query、Exec和Prepare使用對(duì)比(附網(wǎng)絡(luò)抓包)

          Prepare(query) 的 wireshark 捕獲

          結(jié)論

          第一次使用 sql 包時(shí), 我們遇到的主要困惑之一是, 即使我們沒(méi)有明確指示這樣做, 我們也不知道其在幕后創(chuàng)建了預(yù)備語(yǔ)句.

          希望上述內(nèi)容可以闡述清楚, 我們應(yīng)該何時(shí)使用預(yù)備語(yǔ)句以及如何規(guī)避它們.
          Hopefully the points above clarify, when are prepared statements invoked and how we can avoid them.

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)