站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

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

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

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

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

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

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

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

        查詢

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

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

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

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

        查看 wireshark 捕獲 (query)

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

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

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

        Query(query, params) 的 wireshark 捕獲

        Exec

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

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

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

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

        Exec(query) 的 wireshark 捕獲

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

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

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

        Exec(query, params) 的 wireshark 捕獲

        Prepare

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

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

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

        Prepare(query) 的 wireshark 捕獲

        結(jié)論

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

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

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产精品自产拍在线观看花钱看| 精品国产91久久久久久久a | 四虎精品成人免费视频| 国产精品一区二区久久| 久久亚洲欧美国产精品| 久久亚洲国产成人精品无码区| 91精品日韩人妻无码久久不卡| 国产精品美女久久久久| 午夜精品久久久久久久久| 午夜一级日韩精品制服诱惑我们这边| 国产精品国产三级国产AⅤ| 欧美精品国产日韩综合在线| 国产福利视精品永久免费| 国产精品视频色拍拍| 日本VA欧美VA精品发布| 亚洲码国产精品高潮在线| 无码国产亚洲日韩国精品视频一区二区三区 | 久久久久99精品成人片直播| 亚洲精品A在线观看| 久久久久99精品成人片牛牛影视| 国产亚洲精品免费视频播放| 国产精品爱搞视频网站| 国产精品色视频ⅹxxx | 国产精品成人免费福利| 国产精品成人A区在线观看| 国产精品无码av在线播放| 国内精品伊人久久久久AV影院 | 久久狠狠一本精品综合网| 国产一区二区精品久久凹凸| 国产伦精品一区二区三区视频金莲| 国产精品户外野外| 国产精品二区观看| 国产精品欧美一区二区三区 | 欧美国产亚洲精品高清不卡| 亚洲综合一区二区精品导航| 成人精品一区二区三区| 国产精品久久久天天影视香蕉| 国产成人精品亚洲精品| 久久99精品国产麻豆蜜芽| 久久精品无码一区二区三区日韩| 色婷婷噜噜久久国产精品12p|