国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

關于PreparedStatement你知道多少

來源:懂視網 責編:小采 時間:2020-11-09 14:45:00
文檔

關于PreparedStatement你知道多少

關于PreparedStatement你知道多少:序言 對應PreparedStatement相信大家都很熟悉,那么為什么要用PreparedStatement呢?也許你會回答PreparedStatement為預處理語句,可以提高數據庫執行效率。也許還會回答用PreparedStatement可以防止SQL注入。那么再問下,你覺得你對PreparedS
推薦度:
導讀關于PreparedStatement你知道多少:序言 對應PreparedStatement相信大家都很熟悉,那么為什么要用PreparedStatement呢?也許你會回答PreparedStatement為預處理語句,可以提高數據庫執行效率。也許還會回答用PreparedStatement可以防止SQL注入。那么再問下,你覺得你對PreparedS

序言 對應PreparedStatement相信大家都很熟悉,那么為什么要用PreparedStatement呢?也許你會回答PreparedStatement為預處理語句,可以提高數據庫執行效率。也許還會回答用PreparedStatement可以防止SQL注入。那么再問下,你覺得你對PreparedStatement有足夠

序言

對應PreparedStatement相信大家都很熟悉,那么為什么要用PreparedStatement呢?也許你會回答PreparedStatement為預處理語句,可以提高數據庫執行效率。也許還會回答用PreparedStatement可以防止SQL注入。那么再問下,你覺得你對PreparedStatement有足夠的了解嗎,你在項目中PreparedStatement用對了嗎?

原理分析

首先來看下Statement及PreparedStatement執行過程,一個sql語句執行過程中,將經歷這么幾個步驟:

1、傳輸SQL給數據庫

2、數據庫驗證并解析SQL

3、計算Access Plan。數據庫會通過檢測index,statistics來給出最優的訪問計劃。

4、根據訪問計劃進行檢索,返回數據。

在上面步驟中,第3步是非常耗時的。因此,為了提高性能,數據庫會緩存執行語句以及其Access Plan。這被稱為statement cache。在statement cache中,sql語句本身為key,access plan為value。當相同的sql語句被發送過來時,數據庫會使用緩存中的access plan以節省cpu時間。

下邊看下Statement執行代碼:

Statement statement = connection.createStatement();
String sql1="Select * from test where id=1";
String sql2="Select * from test where id=";
statement.execute(sql1);
statement.execute(sql1);
statement.execute(sql1);
statement.execute(sql2+"2");
statement.execute(sql2+"3");

sql1在第一次執行的時候,需要計算執行計劃。但在第2和3次執行的時候,會使用緩存好的執行計劃,因此后面的sql1不會再重新檢驗語法與計算執行計劃,效率會比第一次高。

sql2卻每次都在變化,在cache中,key為整個sql語句,所以每次sql2都無法命中cache,即使它僅僅參數不同,也必須重新檢驗語法與計算執行計劃,效率自然就低下。

強大的數據庫會在cache命中上做優化,但復雜的語句還是避免不了miss。

PreparedStatement的存在是為了避免sql2的劣勢。看下面code。

String sql2="Select * from test where id=?";
PreparedStatement pstmt = connection.prepareStatement(sql2);
pstmt.setInt(1,2);
pstmt.executQuery();
pstmt.setInt(1,3);
pstmt.executQuery();

PreparedStatement在創建的時候,會將參數化的語句發送給數據庫,進行語法檢測和執行計劃計算。Cache中的key將是參數化的語句。當后面preparedstatement在執行的時候,每次均會命中cache,使用已存在的access plan進行檢索。

如何正確使用

PreparedStatement的生命周期跟Statement一樣,在一個數據庫連接connection范圍內有效,所以說如果一次連接中對于同一個PreparedStatement處理多次(參數不同),那么用PreparedStatement是可以提高效率,但大多情景都是多次連接中處理同一個PreparedStatement,那么就算使用了PreparedStatement也不能提高效率,比較PreparedStatement的生命周期只在Connection中。那么如何正確的使用PreparedStatement呢?

其實不用緊張,告訴大家個好消息,J2EE服務器的連接池管理器已經實現了緩存的使用。J2EE服務器保持著連接池中每一個連接準備過的prepared statement列表。當我們在一個連接上調用preparedStatement時,應用服務器會檢查這個statement是否曾經準備過。如果是,這個PreparedStatement會被返回給應用程序。如果否,調用會被轉給JDBC驅動程序,然后將新生成的statement對象存入連接緩存。

如果項目未使用數據庫連接池怎么辦呢,這里只能告訴你,原理你已經很清楚了,自己實現吧。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

關于PreparedStatement你知道多少

關于PreparedStatement你知道多少:序言 對應PreparedStatement相信大家都很熟悉,那么為什么要用PreparedStatement呢?也許你會回答PreparedStatement為預處理語句,可以提高數據庫執行效率。也許還會回答用PreparedStatement可以防止SQL注入。那么再問下,你覺得你對PreparedS
推薦度:
標簽: 知道 多少 關于
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 四虎国产精品免费久久久 | 韩国精品在线观看 | 亚洲国产97在线精品一区 | 国内精品久久久久影院不卡 | 国产日产高清欧美一区二区三区 | 久久福利免费视频 | 伊人久久精品一区二区三区 | 欧美午夜影院 | 成人一a毛片免费视频 | 国内视频一区二区三区 | 国产片一区二区三区 | 国产成人综合久久精品下载 | 国产精品高清在线观看 | 国产一区二区不卡 | 99久久久国产精品免费 | 欧美亚洲电影 | 欧美国产精品va在线观看 | 欧美 亚洲 另类 热图 | 蜜桃视频一区二区三区四区 | 么公的又大又深又硬想要 | 亚洲网站免费 | 国产a视频| 欧美一区二区三区在线视频 | 国产精品久久网 | 深夜福利一区二区 | 国产欧美日韩在线观看 | 综合亚洲一区二区三区 | 亚洲欧美日本综合 | 欧美 日韩 视频 | 日本天堂在线 | 久久永久免费视频 | 国产91精品高清一区二区三区 | 亚洲国产天堂久久九九九 | 欧美成人性色生活18黑人 | 亚洲综合视频一区 | 欧美日韩高清一区二区三区 | 国产精品免费观在线 | 日本一区二区不卡在线 | 全免费a级毛片免费看不卡 青青色在线视频 | 国产网站免费在线观看 | 卡通动漫亚洲 |