MySQL與JDBC之間的SQL預(yù)編譯技術(shù)講解
先說(shuō)一下SQL預(yù)編譯的好處吧
- 減少每次執(zhí)行語(yǔ)句時(shí)解析語(yǔ)句的開銷。 通常,數(shù)據(jù)庫(kù)應(yīng)用程序處理大量幾乎相同的語(yǔ)句,只對(duì)語(yǔ)句中的文字值或變量值進(jìn)行更改
- 防止SQL注入攻擊。 參數(shù)值可以包含未轉(zhuǎn)義的SQL引號(hào)和分隔符。
不過(guò)在這之前我一直以為JDBC預(yù)編譯技術(shù)是依賴數(shù)據(jù)庫(kù)MySQL實(shí)現(xiàn),現(xiàn)在才知道SQL預(yù)編譯也是分服務(wù)端和客戶端實(shí)現(xiàn)的。
JDBC默認(rèn)是客戶端處理SQL預(yù)編譯的,如果向指定用服務(wù)端SQL預(yù)編譯的話,可以在數(shù)據(jù)源連接上配置useServerPrepStmts=true,這樣就可以開啟服務(wù)端SQL預(yù)編譯。
當(dāng)然這也是要服務(wù)端支持SQL預(yù)編譯,拿MySQL5.7以上來(lái)講是支持的。
下面貼上MySQL官方文檔截圖
如何驗(yàn)證SQL預(yù)編譯是用得服務(wù)端實(shí)現(xiàn)還是客戶端實(shí)現(xiàn)呢,這里參考了一篇文章點(diǎn)擊文字即可查看。
我這里我大概說(shuō)一下,以MySQL為例就是開始general_log日志,general_log日志會(huì)記錄哭客戶端發(fā)給服務(wù)器的SQL,這里我沒(méi)就能有關(guān)參考對(duì)比了。
注意:general_log開啟會(huì)產(chǎn)生大量日志,沒(méi)有特殊情況不要在生產(chǎn)環(huán)境開啟。
同樣閱讀MySQL官方文檔sql-prepared-statements部分,發(fā)現(xiàn)MySQL實(shí)現(xiàn)服務(wù)端預(yù)編譯是專門提供了幾個(gè)語(yǔ)法支持的如下:
兩種實(shí)現(xiàn)進(jìn)行基準(zhǔn)測(cè)試
這里在提供預(yù)編譯技術(shù)服務(wù)端實(shí)現(xiàn) && 客戶端實(shí)現(xiàn)的基準(zhǔn)測(cè)試供大家參考:
機(jī)器配置:
- 系統(tǒng):Windows10
- CPU:AMD Ryzen 5 4600U with Radeon Graphics 2.10 GHz
- 內(nèi)存:24.0 GB
- 磁盤:500GB SSD
- MySQL 用的是默認(rèn)配置
結(jié)果很意外以為服務(wù)端實(shí)現(xiàn)應(yīng)該性能要好一些,實(shí)測(cè)居然是客戶端實(shí)現(xiàn)要好一些,不過(guò)相差微乎其微,具體如下圖:
客戶端實(shí)現(xiàn)是否存在SQL注入風(fēng)險(xiǎn)呢?
我們用代碼驗(yàn)證一下
執(zhí)行方法后查看mysql日志
我們可以看到客戶端預(yù)編譯也是可以保障SQL注入風(fēng)險(xiǎn)的
我們順帶看看服務(wù)端預(yù)編譯是怎么樣的呢?
也是沒(méi)有問(wèn)題。
總結(jié)
- SQL預(yù)編譯區(qū)分客戶端/服務(wù)端實(shí)現(xiàn)
- 以及對(duì)兩種實(shí)現(xiàn)進(jìn)行了基準(zhǔn)測(cè)試,客戶端SQL預(yù)編譯以微弱的性能勝出,當(dāng)然這個(gè)結(jié)果只能當(dāng)個(gè)參考不能以偏概全
- 測(cè)試了客戶端實(shí)現(xiàn)的SQL注入問(wèn)題,測(cè)試結(jié)果通過(guò)
文末提供幾個(gè)MySQL官方文檔對(duì)SQL預(yù)編譯說(shuō)明鏈接有興趣的小伙伴可以點(diǎn)擊閱讀
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談為什么MySQL不建議delete刪除數(shù)據(jù)
這篇文章主要介紹了淺談為什么MySQL不建議delete刪除數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01MySQL實(shí)戰(zhàn)文章(非常全的基礎(chǔ)入門類教程)
半個(gè)月時(shí)間把MySQL重新鞏固了一遍,梳理了一篇幾萬(wàn)字超硬核文章,想學(xué)習(xí)mysql的朋友可以看看2023-05-05mysql signed unsigned和zerofill使用與區(qū)別
mysql中有符號(hào)signed,無(wú)符號(hào)unsigned與零填充zerofill,本文主要介紹了mysql signed unsigned和zerofill使用與區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07mysql主從數(shù)據(jù)庫(kù)不同步的2種解決方法
今天發(fā)現(xiàn)Mysql的主從數(shù)據(jù)庫(kù)沒(méi)有同步,很是疑惑,于是搜索整理了下,接下來(lái)介紹解決方法,有感興趣的朋友可以參考下2013-01-01Linux下安裝Mysql多實(shí)例作為數(shù)據(jù)備份服務(wù)器實(shí)現(xiàn)多主到一從多實(shí)例的備份
由于第一次接觸LINUX,花了三天時(shí)間才算有所成就,發(fā)出來(lái)希望可以給大伙帶來(lái)方便2010-07-07使用SKIP-GRANT-TABLES 解決 MYSQL ROOT密碼丟失
這篇文章主要介紹了使用SKIP-GRANT-TABLES 解決 MYSQL ROOT密碼丟失的相關(guān)資料,需要的朋友可以參考下2015-09-09MySQL查詢語(yǔ)句過(guò)程和EXPLAIN語(yǔ)句基本概念及其優(yōu)化
在MySQL中我們經(jīng)常會(huì)使用到一些查詢語(yǔ)句,如果使用合適的索引會(huì)大大簡(jiǎn)化和加速查找,下面小編來(lái)和大家一起學(xué)習(xí)一下知識(shí)2019-05-05MySQL 處理插入過(guò)程中的主鍵唯一鍵重復(fù)值的解決方法
本篇文章主要介紹在插入數(shù)據(jù)到表中遇到鍵重復(fù)避免插入重復(fù)值的處理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2016-04-04