<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數據加載中……

    JDBC性能優化技巧

    ?

    l???????? 如果可能,避免訪問數據庫

    l???????? 為應用選擇最好最快的 JDBC 驅動 ,參考本站文章 。 JDBC3.0提供了新的特性來提高性能,諸如連接池, statemente池的改進 ?

    l????????對數據庫使用連接池并且重用連接,而不要重復打開和關閉連接。最佳的連接池大小是當連接池大到足夠使服務請求不等待

    l???????? 盡量使用支持 JDBC3.0 的驅動,因為 JDBC3.0 支持包括 DataSource 對象,連接池,分布式事務支持, RowSets 和 prepared statement 池等性能增強特性

    l???????? Prepared statement 池(自從 JDBC3.0 開始有)高速緩存已經預先優化并運行了的 SQL 查詢,這樣,他們被再次請求的時候,不必經歷再次的優化預處理(避免最優化步驟,諸如檢查語法,驗證地址,優化訪問路徑和執行計劃)。 Statement 池是一個很好的,重要的性能優化方法

    l???????? JDBC3.0 中的 Statement 池和連接池能合作共享 statement 池,這樣,能使用一個已高速緩存的 statement (該 statement 來自另外一個連接)的連接,在由任一連接執行的 一些SQL 首次被執行時,產生的 statement 準備開銷僅一次

    l???????? RowSet對象與 ResultSet 對象相似,但是能提供當斷開連接的時候對數據庫數據的訪問。這允許數據以它最簡單的形式被高效的高速緩存

    l???????? 用同一個連接執行多個 statements

    l???????? 關閉 autocommit ,但不要讓事務打開太久

    l???????? 避免將事務分布開(事務跨越多個連接)

    l???????? 最小化數據庫的行和列數據獲取。使用 setMaxRows, setMaxFieldSize,和 SetFetchSize

    l???????? 使用最高效的數據類型:字符串比整數型快,整數型比浮點類型和時間戳類型都要高效(是否不太理解^&^,這是針對DB2數據庫處理來說的,處理character類型最快,而處理integer類型通常需要一些轉換或者字節排序)

    l???????? 使用 updateXXX()方法更新: updateXXX() 在可更新的結果集上調用。結果集已經定位到了一行 , 因此當使用一個 UPDATE statement 時,可以消除通常的查找要更新的數據行的開銷

    l???????? Cache任何請求的元數據( metadata )并盡可能少的使用元數據 方法,其慢的程度一用便知

    l???????? 避免在元數據 查詢中使用 null 參數

    l???????? 使用虛擬查詢獲得一行的元數據,不要使用getcolumns()(假如應用允許用戶使用列數據,應用是使用getColumns來返回列的信息給用戶還是準備一個虛擬查詢而后調用getMetadata呢?

    l???????? 使用存儲過程,避免多余的網絡傳輸

    l???????? 在存儲過程中使用參量,不要將數據挨個地放在statement中,最小化解析開銷。此條針對DB2來說,其它數據庫未必適用。SQL總是以字符串形式發送給DB2數據庫,例如:
    CallableStatement cstmt = conn.prepareCall ("call getCustName (12345)");
    ResultSet rs = cstmt.executeQuery ();

    DB2服務器必須解析該SQL,驗證參量類型,并將參量轉化為正確的數據類型。

    l???????? 對需要重復執行的statement使用預處理statement(PreparedStatement)

    l???????? 選擇使用最佳游標:對連續讀取使用游標;對雙向滾動使用游標。對僅返回一行的查詢避免使用游標。

    l???????? 在JVM中Cache頻繁請求的數據,避免不必要的數據庫請求

    l???????? 采用預讀取機制, 批量取行,而不要一次一行 。調整批大小和預取行的數量。避免使用預取 BLOB 數據。

    l???????? 除非絕對需要,否則避免移動數據

    l???????? 在數據穿過網絡之前要使流化數據( Streamline data )

    l???????? 避免每次處理一行,盡可能一起處理多行。

    l???????? 在表中統計個數(例如:使用 select count(*) from myTable,yourTable where …)屬于資源密集型的。試試首先選入臨時表,僅返回該計數(count),然后發送精確的二次查詢獲得臨時表中的行的子集。

    l???????? 當的使用 SQL 能減少資源請求。使用返回所需數據的最小值的查詢:避免 select * 查詢。一個返回小的數據子集的復雜查詢,比一個簡單的,返回超過所需的大量數據的簡單查詢更高效。

    l???????? 使你的查詢盡可能精巧,例如:盡可能精確地最小化要傳輸的數據,使其是所需的子集

    l???????? 努力批量更新:將 statement 收集到一起,然后在一個事務里面一起執行。如果可能,使用有條件的邏輯和臨時變量來達到 statement 批處理

    l???????? 永遠不要讓 DBMS 事務跨越用戶輸入

    l???????? 考慮使用樂觀鎖。樂觀鎖使用時間戳驗證數據是否還沒有被其他用戶改變,否則事務失敗

    l???????? 使用 恰當的更新,例如:更新行/表中已經存在的數據,而不要添加或者刪除行/表。在適當的位置更新數據要比移動數據快得多,如果更新需要的空間比表設計能提供的更多,這可能是需要的。如果你設計的行需要空間初始化,更新將會更快。交易是你的表可能需要更多的磁盤空間,但可能速度更快。由于磁盤空間是便宜的,使用一點點能提高性能,這應該說是非常有價值的投資

    l???????? 分開存儲正在操作的數據和歷史數據(更一般的情況是將頻繁使用的數據和不常使用的數據分開存儲)

    l???????? 盡可能小的保留你的操作數據集,避免必須讀那些不相關的數據

    l???????? DBMS可以很好的并行運轉,盡量將應用設計成當和 DBMS交互時應用能做其他事情。

    l???????? 使用流水線操作和并行操作。 將應用設計成支持大量并行進程, 使應用運行更快。如果要處理多步,努力設計好應用,以使后來的步驟能夠在任何優先的進程已經完成的數據部分上開始工作,而不是必須等到優先進程完成

    l???????事物的保護級別越高,性能損失就越大。事物級別按增長的順序為: TRANSACTION_NONE, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ, TRANSACTION_SERIALIZABLE。使用Connection.setTransactionIsolation() 設置你想要的事物級別

    l??????默認的自動提交模式由于使每一個數據庫命令都成為一個單獨的事務,這會嚴重影響性能,關閉自動提交(Connection.setAutoCommit(false) ),明確聲明事務

    l???????? 通過整合多個事務為一個的批量操作,并在一個statement中使用Statement.addBatch() 和Statement.executeBatch()

    l???? ? Savepoints (from JDBC3.0)需要昂貴的資源。一旦不再需要,就立刻使用Connection.releaseSavepoint()釋放掉Savepoints

    l???????? ConnectionPoolDataSource (from JDBC3.0)和PooledConnection接口為連接池提供了built-in支持

    l???????? ? 使用setLogWriter() (from Driver, DataSource, or ConnectionPooledDataSource; from JDBC3.0) 幫助跟蹤JDBC流

    l???????? ? 使用Connection.setReadOnly(true)優化只讀數據庫(操作)交互

    l???????? ? 使用Connection.nativeSQL()察看SQL查詢如何在數據庫種執行,幫助確保SQL已被優化

    l???????? ?切記:一旦可能,立刻關閉Statement和ResultSet

    l???????? ?使用DatabaseMetaData獲得數據庫功能性信息

    l???????? ?一直捕捉和處理數據庫警告和異常

    l???????? ?使用最恰當的數據類型明確數據的類型,例如:以date類型存儲日期,兒不要用varchar

    l???????? ?使用可滾動ResultSet (JDBC 2.0)

    from: http://www.ijsp.net/2/2003-9/20/0000431.shtml

    posted on 2006-11-28 14:59 weidagang2046 閱讀(787) 評論(1)  編輯  收藏 所屬分類: JavaDatabase

    評論

    # re: JDBC性能優化技巧  回復  更多評論   

    如果是轉的,還是把(轉)字加上吧,也算對作者的尊重。
    2008-07-19 13:14 | 朱遠翔-Apusic技術顧問
    主站蜘蛛池模板: 亚洲AV午夜福利精品一区二区| 麻豆亚洲av熟女国产一区二| 亚洲最大视频网站| 国产亚洲精品成人久久网站| 无码国产精品一区二区免费3p| 热久久精品免费视频| 亚洲国产精品成人久久 | 国产亚洲精品无码成人| 亚洲人成网站18禁止久久影院| 四虎精品成人免费视频| 最近中文字幕高清免费中文字幕mv| 国产成人3p视频免费观看| 亚洲视频中文字幕| 高潮毛片无遮挡高清免费视频| 曰批全过程免费视频网址| 亚洲国产精品丝袜在线观看| 亚洲专区一路线二| 两个人www免费高清视频| 女性无套免费网站在线看| 久久久久亚洲精品影视| 色噜噜狠狠色综合免费视频 | 四虎影库久免费视频| 久久亚洲精品成人无码网站| 免费一级毛suv好看的国产网站| 99视频全部免费精品全部四虎| 国产亚洲精品线观看动态图| 亚洲中文字幕乱码熟女在线| 久久久久久久99精品免费| 亚洲国产精品嫩草影院久久 | 国产成人亚洲午夜电影| 波多野结衣在线免费观看| 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲毛片免费视频| 亚洲AV无码久久| h视频免费高清在线观看| 在线jyzzjyzz免费视频| 亚洲av永久无码嘿嘿嘿| 一级毛片免费观看| 亚洲另类激情综合偷自拍图| 美女被吸屁股免费网站| 午夜一区二区免费视频|