設為首頁 | 加入收藏歡迎進入北京青年網 !

最新文章:
美容冠的使用優勢有哪些?
美麗有方,安全先行——女人如何選擇
種植牙需要哪些條件

OracleJDBC中的語句緩存

發布時間:2017-05-16 06:48:11 來源:Oraclemp

在Oracle數據庫中,SQL解析有幾種:

  • 硬解析:過多的硬解析在系統中產生shared pool latch和library cache liatch爭用,消耗過多的shared pool,使得系統不具有可伸縮性。

  • 軟解析:過多的軟解析仍然可能會導致系統問題,特別是如果有少量的SQL高并發地進行軟解析,會產生library cache latch或者是share方式的mutex爭用。

  • 軟軟解析:其實這也也屬于軟解析,與普通的軟解析不同的是,軟軟解析的SQL會在會話的cached cursor中命中。

  • 一次解析,多次執行:這是解析次數最少的方式,也是系統最具有可擴展性的方式。

那么在JAVA開發的應用中,怎么樣才能實現上述第4種方式?

如果是循環處理某種數據,這個比較容易實現。其實對于不是這種情況,Oracle也提供了很好的方式來實現這一點。下面是一個例子(例子代碼文件為TestStmtCache.java)。

編譯上述代碼文件TestStmtCache.java,并運行:

在數據庫中進行查詢:

可以看到,這兩條SQL語句,都執行了200次,但是標記為"nocache_test1"的SQL沒有進行語句緩存,其parse calls為200次,即解析了200次,其中一次是硬解析。而標記為"cache_test1"的SQL語句,使用了語句緩存,但是parse calls只有1次,即只有一次硬解析,執行了200次。

這里關鍵的代碼在于:

((OracleConnection)conn).setStatementCacheSize(20);

((OracleConnection)conn).setImplicitCachingEnabled(true);

上述第一行代碼設置語句緩存大小,當然20比較偏小,對于比較大型的系統來說,設到200-300比較合適,不過這會耗用一定數量的JAVA內存。這個數值表示一個連接能夠緩存多少語句。第二行代碼是設置隱式打開語句緩存,也即自動會對PreparedStatement的SQL語句進行緩存。

那么,上述的方式無疑是比較簡單的,但是這種方式有一個問題就是,緩存的利用效率可能不高,因為JAVA會將不常用的SQL語句也進行了緩存。Oracle的JDBC驅動也提供了一種手工控制的方式。

將測試代碼中的第22行替換為:

((OracleConnection)conn).setExplicitCachingEnabled(true);

第40行替換為:

pstmt = ((OracleConnection)conn).getStatementWithKey ("cache_test1");

if (pstmt==null)

這樣通過手工編碼的方式控制哪些語句需要緩存,哪些不需要。

關于語句緩存(Statement Caching)可以參考Oracle在線文檔:Statement and Result Set Caching:http://docs.oracle.com/cd/E11882_01/java.112/e10589/stmtcach.htm#i1072607。

加入"云和恩墨大講堂"微信群,參與討論學習

搜索 蓋國強(Eygle)微信號:eyygle,或者掃描下面二維碼,備注:云和恩墨大講堂,即可入群。每周與千人共享免費技術分享,與講師在線討論。

關注公眾號,獲得后續精彩分享

圖片推薦

網站首頁 | 關于我們 | 聯系方式 | 招聘信息 | 版權聲明 | 網站地圖 | 北京青年網
加拿大28和加拿大快乐8开奖网