国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JDBC性能優化技巧

2019-11-18 12:40:48
字體:
來源:轉載
供稿:網友

  ·  假如可能,避免訪問數據庫
  
  ·  為應用選擇最好最快的 JDBC 驅動 ,參考本站文章 。 JDBC3.0提供了新的特性來提高性能,諸如連接池, statemente池的改進 
  
  · 對數據庫使用連接池并且重用連接,而不要重復打開和關閉連接。最佳的連接池大小是當連接池大到足夠使服務請求不等待
  
  ·  盡量使用支持 JDBC3.0 的驅動,因為 JDBC3.0 支持包括 DataSource 對象,連接池,分布式事務支持, RowSets 和 PRepared statement 池等性能增強特性
  
  ·  Prepared statement 池(自從 JDBC3.0 開始有)高速緩存已經預先優化并運行了的 SQL 查詢,這樣,他們被再次請求的時候,不必經歷再次的優化預處理(避免最優化步驟,諸如檢查語法,驗證地址,優化訪問路徑和執行計劃)。 Statement 池是一個很好的,重要的性能優化方法
  
  ·  JDBC3.0 中的 Statement 池和連接池能合作共享 statement 池,這樣,能使用一個已高速緩存的 statement (該 statement 來自另外一個連接)的連接,在由任一連接執行的 一些SQL 首次被執行時,產生的 statement 預備開銷僅一次
  
  ·  RowSet對象與 ResultSet 對象相似,但是能提供當斷開連接的時候對數據庫數據的訪問。這答應數據以它最簡單的形式被高效的高速緩存
  
  ·  用同一個連接執行多個 statements
  
  ·  關閉 autocommit ,但不要讓事務打開太久
  
  ·  避免將事務分布開(事務跨越多個連接)
  
  ·  最小化數據庫的行和列數據獲取。使用 setMaxRows, setMaxFieldSize,和 SetFetchSize
  
  ·  使用最高效的數據類型:字符串比整數型快,整數型比浮點類型和時間戳類型都要高效(是否不太理解^&^,這是針對DB2數據庫處理來說的,處理character類型最快,而處理integer類型通常需要一些轉換或者字節排序)
  
  ·  使用 updateXXX()方法更新: updateXXX() 在可更新的結果集上調用。結果集已經定位到了一行 , 因此當使用一個 UPDATE statement 時,可以消除通常的查找要更新的數據行的開銷
  
  ·  Cache任何請求的元數據( metadata )并盡可能少的使用元數據 方法,其慢的程度一用便知
  
  ·  避免在元數據 查詢中使用 null 參數
  
  ·  使用虛擬查詢獲得一行的元數據,不要使用getcolumns()(假如應用答應用戶使用列數據,應用是使用getColumns來返回列的信息給用戶還是預備一個虛擬查詢而后調用getMetadata呢?
  
  ·  使用存儲過程,避免多余的網絡傳輸
  
  ·  在存儲過程中使用參量,不要將數據挨個地放在statement中,最小化解析開銷。此條針對DB2來說,其它數據庫未必適用。SQL總是以字符串形式發送給DB2數據庫,例如:
  CallableStatement cstmt = conn.prepareCall ("call getCustName (12345)");
  ResultSet rs = cstmt.executeQuery ();
  DB2服務器必須解析該SQL,驗證參量類型,并將參量轉化為正確的數據類型。
  
  ·  對需要重復執行的statement使用預處理statement(PreparedStatement)
  
  ·  選擇使用最佳游標:對連續讀取使用游標;對雙向滾動使用游標。對僅返回一行的查詢避免使用游標。
  
  ·  在JVM中Cache頻繁請求的數據,避免不必要的數據庫請求
  
  ·  采用預讀取機制, 批量取行,而不要一次一行 。調整批大小和預取行的數量。避免使用預取 BLOB 數據。
  
  ·  除非絕對需要,否則避免移動數據
  
  ·  在數據穿過網絡之前要使流化數據( Streamline data )
  
  ·  避免每次處理一行,盡可能一起處理多行。
  
  ·  在表中統計個數(例如:使用 select count(*) from myTable,yourTable where …)屬于資源密集型的。試試首先選入臨時表,僅返回該計數(count),然后發送精確的二次查詢獲得臨時表中的行的子集。
  
  ·  恰當的使用 SQL 能減少資源請求。使用返回所需數據的最小值的查詢:避免 select * 查詢。一個返回小的數據子集的復雜查詢,比一個簡單的,返回超過所需的大量數據的簡單查詢更高效。
  
  ·  使你的查詢盡可能精巧,例如:盡可能精確地最小化要傳輸的數據,使其是所需的子集
  
  ·  努力批量更新:將 statement 收集到一起,然后在一個事務里面一起執行。假如可能,使用有條件的邏輯和臨時變量來達到 statement 批處理
  
  ·  永遠不要讓 DBMS 事務跨越用戶輸入
  
  ·  考慮使用樂觀鎖。樂觀鎖使用時間戳驗證數據是否還沒有被其他用戶改變,否則事務失敗
  
  ·  使用 恰當的更新,例如:更新行/表中已經存在的數據,而不要添加或者刪除行/表。在適當的位置更新數據要比移動數據快得多,假如更新需要的空間比表設計能提供的更多,這可能是需要的。假如你設計的行需要空間初始化,更新將會更快。交易是你的表可能需要更多的磁盤空間,但可能速度更快。由于磁盤空間是便宜的,使用一點點能提高性能,這應該說是非常有價值的投資
  
  ·  分開存儲正在操作的數據和歷史數據(更一般的情況是將頻繁使用的數據和不常使用的數據分開存儲)
  
  ·  盡可能小的保留你的操作數據集,避免必須讀那些不相關的數據
  
  ·  DBMS可以很好的并行運轉,盡量將應用設計成當和 DBMS交互時應用能做其他事情。
  
  ·  使用流水線操作和并行操作。 將應用設計成支持大量并行進程, 使應用運行更快。假如要處理多步,努力設計好應用,以使后來的步驟能夠在任何優先的進程已經完成的數據部分上開始工作,而不是必須等到優先進程完成
  
  · 事物的保護級別越高,性能損失就越大。事物級別按增長的順序為: TRANSACTION_NONE, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ, TRANSACTION_SERIALIZABLE。使用Connection.setTransactionIsolation() 設置你想要的事物級別
  
  · 默認的自動提交模式由于使每一個數據庫命令都成為一個單獨的事務,這會嚴重影響性能,關閉自動提交(Connection.setAutoCommit(false) ),明確聲明事務
  
  ·  通過整合多個事務為一個的批量操作,并在一個statement中使用Statement.addBatch() 和Statement.executeBatch()
  
  · Savepoints (from JDBC3.0)需要昂貴的資源。一旦不再需要,就馬上使用Connection.releaseSavepoint()釋放掉Savepoints
  
  ·  ConnectionPoolDataSource (from JDBC3.0)和PooledConnection接口為連接池提供了built-in支持
  
  · 使用setLogWriter() (from Driver, DataSource, or ConnectionPooledDataSource; from JDBC3.0) 幫助跟蹤JDBC流
  
  · 使用Connection.setReadOnly(true)優化只讀數據庫(操作)交互
  
  · 使用Connection.nativeSQL()察看SQL查詢如何在數據庫種執行,幫助確保SQL已被優化
  
  ·切記:一旦可能,馬上關閉Statement和ResultSet
  
  ·使用DatabaseMetaData獲得數據庫功能性信息
  
  ·一直捕捉和處理數據庫警告和異常
  
  ·使用最恰當的數據類型明確數據的類型,例如:以date類型存儲日期,兒不要用varchar
  
  ·使用可滾動ResultSet (JDBC 2.0)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 香港| 石家庄市| 侯马市| 辰溪县| 广西| 额敏县| 东安县| 白玉县| 滦平县| 乌拉特中旗| 彰武县| 同心县| 冕宁县| 湘阴县| 抚宁县| 怀化市| 巴楚县| 新余市| 治多县| 微山县| 青海省| 梅河口市| 玛曲县| 定襄县| 盖州市| 鸡泽县| 偏关县| 凤城市| 行唐县| 北票市| 务川| 玉山县| 乌兰浩特市| 邵阳县| 庄河市| 靖西县| 民乐县| 武功县| 民和| 井研县| 内乡县|