對應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物件存入連線快取。
如果專案未使用資料庫連線池怎麼辦呢,這裡只能告訴你,原理你已經很清楚了,自己實現吧。
關於程式關於世界
首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...
關於血液關於軟體
1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...
關於冷漠,關於愛情
我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...