Web 開發人員: 爲最佳性能而進行優化?

如果您在開發 Web 應用程序,那麼您很可能熟悉基於Java連接到數據庫的方法:JDBC 和 SQLJ。但是您知道如何能讓使用這些方法的應用程序獲得最佳性能嗎?

微調數據庫訪問會使應用程序和數據庫保持協調一致。

如果您在開發 Web 應用程序,那麼您很可能熟悉基於Java連接到數據庫的方法:JDBC 和 SQLJ。但是您知道如何能讓使用這些方法的應用程序獲得最佳性能嗎?

如果您認爲性能不是開發人員所關心的問題,那麼請您再想想,有的系統執行效率一般,有的系統執行效率很棒,造成這一區別的原因是什麼呢?我認爲這主要在於數據庫架構設計師、數據庫管理員和應用程序開發人員的技能和經驗。

儘管數據庫優化應該從最初的設計階段開始,但是也可以在生產環境中對早已建立的數據庫和相關的應用程序進行微調。提高性能並不僅僅包括在數據庫中創建索引和規範化,雖然這些也是必須要做的工作,但是僅有此還不夠。訪問數據庫的應用程序設計(及其訪問數據庫的方式)對獲得最佳性能也是至關重要的。

爲幫助您提高應用程序性能,針對通過 JDBC(或使用 JDBC 的 IBM WebSphere Application Server)和 SQLJ 來進行數據庫存取的應用程序,這裏提供了一些優化方面的技巧。


優化 JDBC

幾乎所有的企業級 Web 應用程序中都使用三層設計:表示層、應用層和數據層,在這種模型中,基於 Java 的應用程序連接到數據庫所採用的標準之一就是 JDBC。

要優化使用 JDBC 接口的數據庫訪問,請遵循這些準則:

儘量避免使用元數據方法。雖然不能完全避免使用元數據(描述其他數據和引用的數據)方法,但是請儘可能少使用它們。由於它們是添加的抽象層,因而訪問它們相對較慢。

避免使用 GETCOLUMNS不要使用 GETCOLUMNS 命令查找表的詳細信息,請嘗試用 GETMETADATA 命令進行“啞”查詢。

避免使用地毯式搜索。在 JDBC 查詢中使用數據庫命令 LIKEAS 會降低性能,查詢大型表時尤其如此。查詢中使用空的自變量也會降低性能。請儘可能地消除這些語句。

減少要檢索的數據量。僅查詢您需要的數據,不要超出此範圍。除非絕對必需,否則不要檢索很長的數據列表。最好設計一個終端程序,可以一次發送幾組數據,就像 Yahoo! 和 Google 這樣高度優化的搜索引擎一樣。除非使用 SELECT * FROM <TABLE NAME> 是必需的,否則請不要使用此方式。

減少要返回的數據量。通過 SETMAXROWSSETMAXFIELDSIZE 設置查詢的界限,將界限與所需的最大數據相匹配,這樣會有助於提高性能。例如,搜索引擎不需要返回一次查詢中所有 600,000 個匹配。相反,它可以設置合理的界限,使之能滿足 99% 的用戶,而對於剩下的 1% 的用戶,則需要再做一次額外的調用。這種方法要花費更多的時間去構建,並且要很好地瞭解用戶的需求和行爲。但是,在非常敏感的企業數據庫系統中,像這樣做來提高性能是很值得的。

選擇合適的數據類型。如果數據庫設計經常更改,這種方法可能會引起太多開銷。但通常情況下,在建表時選擇保存數據所需的最小存儲長度的數據類型是一個非常好的方法。例如,當需要整數時,使用整數類型而不是實數或浮點數(後兩者需要花費更多的時間來處理)。

使用參數來調用自變量。這一規則在任何應用程序中都是最佳編碼方式。固化自變量不靈活,經常導致以後的維護問題。同時,因爲在調用存儲過程時所有的參數都會作爲字符串送往數據庫,使用固定值的參數還會降低數據庫性能。在遠程過程調用(RPC)過程中使用變參效果會更好。

爲作業選擇正確的遊標。弄清楚表所需的遊標類型,使用其中能提供最高性能的遊標。對於只需順序讀的情況,應選擇正向遊標。對於需要查詢的數據量比較小的應用程序,最好使用Insensitive 遊標,該遊標會創建數據集的臨時拷貝,然後可以在該數據拷貝中遍歷,這種遊標在 Web 應用程序中尤其常見。Sensitive 遊標只用於大的數據集和動態的數據檢索,因爲它們通常是性能中開銷最大的。

管理連接。雖然像 WebSphere 這樣的應用服務器能處理大量的會話管理,但還是應該注意一些優化技巧。例如,一次只連接到一個數據源。避免執行 SQL 調用時需要對數據庫進行連接和斷開連接所帶來的高開銷。並且儘量共用連接以獲得更佳的性能。DB2 通用數據庫(UDB)V8.1 還提供了新的連接的集中和簡化機制,通過有效自動地管理數據庫連接來提高應用程序的性能。

關閉 AUTOCOMMIT這是優化數據庫中最重要的規則。您甚至不必去考慮它,只需設置 WSCONNECTION.SETAUTOCOMMIT(FALSE) 即可。

儘可能地使用本地事務。分佈式事務會比較慢。

使用 UPDATEXXX 命令取代一般的 update 命令。這個方法對於常要更改數據庫設計的系統來說是不適用的。但在設計相對靜態的系統中, UPDATEXXX 命令會提高性能,因爲具有針對性的命令總是比通用的命令快。

即使對於最複雜的、使用 JDBC 的 Web 應用程序,以上建議仍能使之獲得很好的性能。



優化 WebSphere

因爲 WebSphere 符合J2EE規範,它的許多連接使用了 JDBC,所以用於 JDBC 的這些優化建議同樣適用於它。但是,使用 WebSphere 時,還需知道兩個重要的優化技巧:

  • 使用 GETBESTROWIDENTIFIER()使用這個命令來獲取最優的列集合,它將減少處理時間。使用 GETPRIMARYKEYS()GETINDEXINFO() 來用格式化 WHERE 子句,這將有助於使開銷降到最少。
  • 使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。PreparedStatement 對象的開銷比Statement大,對於一次性操作並不會帶來額外的好處。

 




優化 SQLJ

SQLJ 可以替代 JDBC,它有特定的優勢。同樣達到最優的性能時,SQLJ 的效率比 JDBC要高好。但是,SQLJ 的靈活性不及 JDBC,因爲它使用了更多固定的靜態值,而沒有提供變量的替換方法。這兩個數據庫訪問方法之間的區別,類似於使用編譯型程序(SQLJ)和使用解釋型程序(JDBC)之間的區別(前者在運行時之前就執行了一些處理,後者在運行時編譯並執行)。

SQLJ 是一種高級語言,它涵蓋了 JDBC 的功能,但是它需要非常嚴格的、特定的函數以確保達到最高性能。和 JDBC 一樣,SQLJ 是 Java 程序的標準之一,它保持了 Java 的平臺獨立性。但是,SQLJ 不符合 J2EE,因此,在所有應用程序服務器中都不支持它。

在許多方法中,需要最高性能的企業級 Web 應用程序要高效地與 DB2 相連,SQLJ 就是關鍵因素之一。其它數據庫在這一級別不支持 SQLJ,因此它通常使 DB2 的工作性能比其競爭對手要好。支持 Web 的 DB2 要想避免性能損失可能很困難,對於事務處理系統來說尤其如此。但是,在真正的靜態實現中,SQLJ 和 DB2 具有的性能優勢超過其它數據庫。

以下準則將有助您利用這個前沿技術:

顯式地關閉和釋放資源。如果連接到數據庫的應用程序需要長期運行,最重要的規則之一是在正確的時機清除活動會話。切記,任何人都不期望經常重新引導系統。

完成後關閉結果集。通常會遺漏這個步驟,但是如果您沒有執行這一步驟,則 Java 虛擬機(JVM)垃圾收集機制就不能回收對象。最後應用程序可能耗盡 JDBC 資源,甚至可能耗盡內存。

只更新和訪問需要的字段。再一次重申,應該只訪問需要的數據,不要超出此範圍。

定製 SQLJ profiler和請求聯機檢查。該步驟防止 SQLJ 動態地訪問數據,從而降低性能。這條規則將確保 SQLJ 靜態地運行。

調優 JVM 堆的大小。1MB 的缺省堆往往不夠大,會影響性能。增大堆的大小以滿足應用程序的需要。但是要注意:將堆的大小設置成最大會降低垃圾收集的頻率,其結果反而會影響性能。

使版本保持最新。儘量使用新的版本。雖然移植要花費一些精力,但通常值得我們這樣做。SQLJ 和 JDBC 都是比較新的標準,每個新的版本都會有比較顯著的性能提高。

打開高速緩存。該規則幫助您避免準備動態 SQL 所要的開銷。設置 CACHEDYN=YES 將有助於提高 SQLJ 代碼的性能。

通過微調 SQLJ,使 Web 應用程序訪問數據庫的性能能夠趕上甚至超越使用 JDBC 時的性能

選擇自己的途徑

優化數據庫有許多可能的途徑。不要期望一次就應用所有的方法。如果您一次只從一個途徑着手,就應該可以得到性能的提高。通過準備工作和適當的計劃,即使是最複雜的數據庫應用也能達到最優的性能。別忘了,千里之行始於足下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章