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

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

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

    葉明的javablog

    java學習天堂,個人關于其他blog:blog.javaworker.cn,歡迎大家訪問
    posts - 64, comments - 50, trackbacks - 0, articles - 3

    優化JDBC性能的三大技巧

    Posted on 2006-02-22 10:21 天空蒼茫 閱讀(324) 評論(0)  編輯  收藏 所屬分類: jsp學習
    開發一個注重性能的JDBC應用程序不是一件容易的事. 當你的代碼運行很慢的時候JDBC驅動程序并不會拋出異常告訴你。

      本系列的性能提示將為改善JDBC應用程序的性能介紹一些基本的指導原則,這其中的原則已經被許多現有的JDBC應用程序編譯運行并驗證過。 這些指導原則包括:
     正確的使用數據庫MetaData方法
       只獲取需要的數據
       選用最佳性能的功能
       管理連接和更新

      以下這些一般性原則可以幫助你解決一些公共的JDBC系統的性能問題.

      使用數據庫Metadata方法

      因為通過ResultSet對象生成的Metadata方法與其它的JDBCB方法相比是較慢的, 經常的使用它們將會削弱系統的的性能. 本節的指導原則將幫助你選擇和使用meatdata時優化系統性能.

      少用Metadata方法

      與其它的JDBC方法相比, 由ResultSet對象生成的metadata對象的相對來說是很慢的. 應用程序應該緩存從ResultSet返回的metadata信息,避免多次不必要的執行這個操作.

      幾乎沒有哪一個JDBC應用程序不用到metadata,雖然如此,你仍可以通過少用它們來改善系統性能. 要返回JDBC規范規定的結果集的所有列信息, 一個簡單的metadata的方法調用可能會使JDBC驅動程序去執行很復雜的查詢甚至多次查詢去取得這些數據. 這些細節上的SQL語言的操作是非常消耗性能的.

      應用程序應該緩存這些metadata信息. 例如, 程序調用一次getTypeInfo方法后就將這些程序所依賴的結果信息緩存. 而任何程序都不大可能用到這些結果信息中的所有內容,所以這些緩存信息應該是不難維護的.

      避免null參數

      在metadata的方法中使用null參數或search patterns是很耗時的. 另外, 額外的查詢會導致潛在的網絡交通的增加. 應盡可能的提供一些non-null的參數給metadata方法.

      因為metadata的方法很慢, 應用程序要盡可能有效的調用它們. 許多應用程序只傳遞少量的non-null參數給這些方法.

      例如:

    ResultSet WSrs = WSc.getTables (null, null, "WSTable", null);

      應該這樣:

    ResultSet WSrs = WSc.getTables ("cat1", "johng", "WSTable", "TABLE");

      在第一個getTables()的調用中, 程序可能想知道表'WSTable'是否存在. 當然, JDBC驅動程序會逐個調用它們并且會解譯不同的請求. JDBC驅動程序會解譯請求為: 返回所有的表, 視圖, 系統表, synonyms, 臨時表, 或存在于任何數據庫類別任何Schema中的任何別名為'WSTable'的對象.

      第二個getTables()的調用會得到更正確的程序想知道的內容. JDBC驅動程序會解譯這個請求為: 返回當前數據庫類別中所有存在于'johng'這個schema中的所有表.

      很顯然, JDBC驅動程序處理第二個請求比處理第一個請求更有效率一些.

      有時, 你所請求信息中的對象有些信息是已知的. 當調用metadata方法時, 程序能傳送到驅動程序的的任何有用信息都可以導致性能和可靠性的改善.

      使用'啞元'(dummy)查詢確定表的特性

      要避免使用getColumns()去確定一個表的特性. 而應該使用一個‘啞元’查詢來使用getMetadata()方法.

      請考慮這樣一個程序, 程序中要允許用戶選取一些列. 我們是否應該使用getColumns()去返回列信息給用戶還是以一個'啞元'查詢來調用getMetadata()方法呢?

      案例 1: GetColumns 方法

    ResultSet WSrc = WSc.getColumns (... "UnknownTable" ...);
    // getColumns()會發出一個查詢給數據庫系統
    . . .
    WSrc.next();
    string Cname = getString(4);
    . . .
    // 用戶必須從反復從服務器獲取N行數據
    // N = UnknownTable的列數

      案例 2: GetMetadata 方法

    // 準備'啞元'查詢
    PreparedStatement WSps = WSc.prepareStatement
    ("SELECT * from UnknownTable WHERE 1 = 0");
    // 查詢從來沒有被執行,只是被預儲
    ResultSetMetaData WSsmd=WSps.getMetaData();
    int numcols = WSrsmd.getColumnCount();
    ...
    int ctype = WSrsmd.getColumnType(n)
    ...
    // 獲得了列的完整信息

      在這兩個案例中, 一個查詢被傳送到服務器. 但在案例1中, 查詢必須被預儲和執行, 結果的描述信息必須確定(以傳給getColumns()方法), 并且客戶端必須接收一個包含列信息的結果集. 在案例2中, 只要準備一個簡單的查詢并且只用確定結果描述信息. 很顯然, 案例2執行方式更好一些.

      這個討論有點復雜, 讓我們考慮一個沒有本地化支持prepared statement的DBMS服務器. 案例1的性能沒有改變, 但案例2中, 因為'啞元'查詢必須被執行而不是被預儲使得它的性能增強了一些. 因為查詢中的WHERE子句總是為FALSE, 查詢在不用存取表的數據情況的下會生成沒有數據的結果集. 在這種情況下,第二種方式當然比第一種方式好一些.

      總而言之,總是使用ResultSet的metadata方法去獲取列信息,像列名,列的數據類型,列的數據精度和長度等. 當要求的信息無法從ResultSet的metadata中獲取時才去用getColumns()方法(像列的缺省值這些信息等)。
    主站蜘蛛池模板: 亚洲精品中文字幕乱码三区| 亚洲男人电影天堂| 另类免费视频一区二区在线观看| 久久久久亚洲AV无码专区首JN| 国产精品成人免费视频网站京东 | 精品亚洲一区二区三区在线播放| 最近国语视频在线观看免费播放| 亚洲国产精品免费在线观看| 免费人成激情视频| 香蕉免费一区二区三区| 亚洲国产成人AV在线播放 | 亚洲精品伊人久久久久| ZZIJZZIJ亚洲日本少妇JIZJIZ| 永久免费在线观看视频| 特a级免费高清黄色片| 亚洲国产成人超福利久久精品| 亚洲欧洲中文日韩av乱码| 50岁老女人的毛片免费观看| 免费很黄无遮挡的视频毛片| 亚洲国产成人精品无码区在线秒播 | 国产好大好硬好爽免费不卡| 亚洲av无码一区二区三区在线播放| 久久精品国产精品亚洲精品| 暖暖日本免费在线视频| 日本免费一区二区三区四区五六区| 老司机午夜在线视频免费观| 亚洲Av高清一区二区三区| 亚洲国产精品一区二区成人片国内 | 亚洲精品一卡2卡3卡四卡乱码| 婷婷亚洲综合五月天小说| 亚洲精品国产精品乱码不卞| 18禁超污无遮挡无码免费网站国产| 国产免费无码AV片在线观看不卡| 老外毛片免费视频播放| 亚洲熟女综合一区二区三区| 666精品国产精品亚洲| 亚洲高清国产AV拍精品青青草原| 亚洲?V无码乱码国产精品| 成人五级毛片免费播放| 黄页网站在线观看免费高清| 99爱免费观看视频在线|