MySQL與JDBC之間的SQL預編譯技術(shù)講解
先說一下SQL預編譯的好處吧
- 減少每次執(zhí)行語句時解析語句的開銷。 通常,數(shù)據(jù)庫應(yīng)用程序處理大量幾乎相同的語句,只對語句中的文字值或變量值進行更改
- 防止SQL注入攻擊。 參數(shù)值可以包含未轉(zhuǎn)義的SQL引號和分隔符。
不過在這之前我一直以為JDBC預編譯技術(shù)是依賴數(shù)據(jù)庫MySQL實現(xiàn),現(xiàn)在才知道SQL預編譯也是分服務(wù)端和客戶端實現(xiàn)的。
JDBC默認是客戶端處理SQL預編譯的,如果向指定用服務(wù)端SQL預編譯的話,可以在數(shù)據(jù)源連接上配置useServerPrepStmts=true,這樣就可以開啟服務(wù)端SQL預編譯。
當然這也是要服務(wù)端支持SQL預編譯,拿MySQL5.7以上來講是支持的。
下面貼上MySQL官方文檔截圖


如何驗證SQL預編譯是用得服務(wù)端實現(xiàn)還是客戶端實現(xiàn)呢,這里參考了一篇文章點擊文字即可查看。
我這里我大概說一下,以MySQL為例就是開始general_log日志,general_log日志會記錄哭客戶端發(fā)給服務(wù)器的SQL,這里我沒就能有關(guān)參考對比了。
注意:general_log開啟會產(chǎn)生大量日志,沒有特殊情況不要在生產(chǎn)環(huán)境開啟。
同樣閱讀MySQL官方文檔sql-prepared-statements部分,發(fā)現(xiàn)MySQL實現(xiàn)服務(wù)端預編譯是專門提供了幾個語法支持的如下:


兩種實現(xiàn)進行基準測試
這里在提供預編譯技術(shù)服務(wù)端實現(xiàn) && 客戶端實現(xiàn)的基準測試供大家參考:
機器配置:
- 系統(tǒng):Windows10
- CPU:AMD Ryzen 5 4600U with Radeon Graphics 2.10 GHz
- 內(nèi)存:24.0 GB
- 磁盤:500GB SSD
- MySQL 用的是默認配置
結(jié)果很意外以為服務(wù)端實現(xiàn)應(yīng)該性能要好一些,實測居然是客戶端實現(xiàn)要好一些,不過相差微乎其微,具體如下圖:


客戶端實現(xiàn)是否存在SQL注入風險呢?
我們用代碼驗證一下

執(zhí)行方法后查看mysql日志

我們可以看到客戶端預編譯也是可以保障SQL注入風險的
我們順帶看看服務(wù)端預編譯是怎么樣的呢?

也是沒有問題。
總結(jié)
- SQL預編譯區(qū)分客戶端/服務(wù)端實現(xiàn)
- 以及對兩種實現(xiàn)進行了基準測試,客戶端SQL預編譯以微弱的性能勝出,當然這個結(jié)果只能當個參考不能以偏概全
- 測試了客戶端實現(xiàn)的SQL注入問題,測試結(jié)果通過
文末提供幾個MySQL官方文檔對SQL預編譯說明鏈接有興趣的小伙伴可以點擊閱讀
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL 5.7.22 二進制包安裝及免安裝版Windows配置方法
這篇文章通過實例代碼給大家介紹了MySQL 5.7.22 二進制包安裝教程,文章末尾給大家補充介紹了mysql 5.7.22 免安裝版Windows配置方法,感興趣的朋友跟隨腳本之家小編一起看看吧2018-08-08
關(guān)于k8s環(huán)境部署mysql主從的問題
這篇文章主要介紹了k8s環(huán)境部署mysql主從的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫
這篇文章主要介紹了詳解如何在阿里云服務(wù)器安裝Mysql數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
MySQL數(shù)據(jù)庫可以用任意ip連接訪問的方法
本文主要介紹了MySQL數(shù)據(jù)庫可以用任意ip連接訪問的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05

