首頁 > 軟體

MySQL與JDBC之間的SQL預編譯技術講解

2022-11-17 14:01:18

先說一下SQL預編譯的好處吧

  • 減少每次執行語句時解析語句的開銷。 通常,資料庫應用程式處理大量幾乎相同的語句,只對語句中的文字值或變數值進行更改
  • 防止SQL隱碼攻擊。 引數值可以包含未跳脫的SQL引號和分隔符。

不過在這之前我一直以為JDBC預編譯技術是依賴資料庫MySQL實現,現在才知道SQL預編譯也是分伺服器端和使用者端實現的。

JDBC預設是使用者端處理SQL預編譯的,如果向指定用伺服器端SQL預編譯的話,可以在資料來源連線上設定useServerPrepStmts=true,這樣就可以開啟伺服器端SQL預編譯。

當然這也是要伺服器端支援SQL預編譯,拿MySQL5.7以上來講是支援的。

下面貼上MySQL官方檔案截圖

如何驗證SQL預編譯是用得伺服器端實現還是使用者端實現呢,這裡參考了一篇文章點選文字即可檢視。

我這裡我大概說一下,以MySQL為例就是開始general_log紀錄檔,general_log紀錄檔會記錄哭使用者端發給伺服器的SQL,這裡我沒就能有關參考對比了。 

注意:general_log開啟會產生大量紀錄檔,沒有特殊情況不要在生產環境開啟

同樣閱讀MySQL官方檔案sql-prepared-statements部分,發現MySQL實現伺服器端預編譯是專門提供了幾個語法支援的如下:

兩種實現進行基準測試

這裡在提供預編譯技術伺服器端實現 && 使用者端實現的基準測試供大家參考:

機器設定:

  • 系統:Windows10
  • CPU:AMD Ryzen 5 4600U with Radeon Graphics 2.10 GHz
  • 記憶體:24.0 GB
  • 磁碟:500GB SSD
  • MySQL 用的是預設設定

結果很意外以為伺服器端實現應該效能要好一些,實測居然是使用者端實現要好一些,不過相差微乎其微,具體如下圖:

使用者端實現是否存在SQL隱碼攻擊風險呢?

我們用程式碼驗證一下

執行方法後檢視mysql紀錄檔

我們可以看到使用者端預編譯也是可以保障SQL隱碼攻擊風險的

我們順帶看看伺服器端預編譯是怎麼樣的呢?

也是沒有問題。

總結

  • SQL預編譯區分使用者端/伺服器端實現
  • 以及對兩種實現進行了基準測試,使用者端SQL預編譯以微弱的效能勝出,當然這個結果只能當個參考不能以偏概全
  • 測試了使用者端實現的SQL隱碼攻擊問題,測試結果通過

文末提供幾個MySQL官方檔案對SQL預編譯說明連結有興趣的小夥伴可以點選閱讀

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com