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

        關于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號
        主站蜘蛛池模板: 亚洲欧美日韩精品| 国产在线精品一区二区三区不卡| 九九热这里只有在线精品视 | 国产一精品一AV一免费| 久久这里有精品视频| 亚洲精品你懂的| 国产精品一久久香蕉产线看| 精品久久久无码人妻中文字幕豆芽| 国产亚洲精品AA片在线观看不加载 | 亚洲精品人成在线观看| 国产久热精品无码激情| 亚洲精品无码久久不卡| 久久久久亚洲精品天堂久久久久久 | 久久久精品日本一区二区三区| 欧美久久精品一级c片片| 国产精品成人观看视频国产奇米| 亚洲AV无码久久精品蜜桃| 免费精品精品国产欧美在线| 国产精品理论片在线观看| 欧美激情精品久久久久| 91国内外精品自在线播放| 久久亚洲国产成人精品性色| 无码精品久久一区二区三区| 久久91这里精品国产2020| 国产精品嫩草影院久久| 国产精品成人小电影在线观看| 99久久99久久精品国产片| 在线电影国产精品| 亚洲精品国产成人99久久| 97精品伊人久久久大香线蕉| 亚洲人成亚洲精品| 91精品国产品国语在线不卡| 久久精品国产亚洲一区二区| 精品久久久久久久久中文字幕| 高清在线亚洲精品国产二区| 国产精品第13页| 四虎精品影院4hutv四虎| 国产成人精品免费大全| 国产精品自产拍高潮在线观看| 国产乱人伦偷精品视频免观看| 精品国产人成亚洲区|