微調數據庫訪問會使應用程序和數據庫保持協調一致。
如果您在開發 Web 應用程序,那麼您很可能熟悉基於Java連接到數據庫的方法:JDBC 和 SQLJ。但是您知道如何能讓使用這些方法的應用程序獲得最佳性能嗎?
如果您認爲性能不是開發人員所關心的問題,那麼請您再想想,有的系統執行效率一般,有的系統執行效率很棒,造成這一區別的原因是什麼呢?我認爲這主要在於數據庫架構設計師、數據庫管理員和應用程序開發人員的技能和經驗。
儘管數據庫優化應該從最初的設計階段開始,但是也可以在生產環境中對早已建立的數據庫和相關的應用程序進行微調。提高性能並不僅僅包括在數據庫中創建索引和規範化,雖然這些也是必須要做的工作,但是僅有此還不夠。訪問數據庫的應用程序設計(及其訪問數據庫的方式)對獲得最佳性能也是至關重要的。
爲幫助您提高應用程序性能,針對通過 JDBC(或使用 JDBC 的 IBM WebSphere Application Server)和 SQLJ 來進行數據庫存取的應用程序,這裏提供了一些優化方面的技巧。
幾乎所有的企業級 Web 應用程序中都使用三層設計:表示層、應用層和數據層,在這種模型中,基於 Java 的應用程序連接到數據庫所採用的標準之一就是 JDBC。
儘量避免使用元數據方法。雖然不能完全避免使用元數據(描述其他數據和引用的數據)方法,但是請儘可能少使用它們。由於它們是添加的抽象層,因而訪問它們相對較慢。
避免使用 GETCOLUMNS
。不要使用 GETCOLUMNS
命令查找表的詳細信息,請嘗試用 GETMETADATA
命令進行“啞”查詢。
避免使用地毯式搜索。在 JDBC 查詢中使用數據庫命令 LIKE
和 AS
會降低性能,查詢大型表時尤其如此。查詢中使用空的自變量也會降低性能。請儘可能地消除這些語句。
關閉 AUTOCOMMIT
。這是優化數據庫中最重要的規則。您甚至不必去考慮它,只需設置 WSCONNECTION.SETAUTOCOMMIT(FALSE)
即可。
即使對於最複雜的、使用 JDBC 的 Web 應用程序,以上建議仍能使之獲得很好的性能。
因爲 WebSphere 符合J2EE規範,它的許多連接使用了 JDBC,所以用於 JDBC 的這些優化建議同樣適用於它。但是,使用 WebSphere 時,還需知道兩個重要的優化技巧:
GETBESTROWIDENTIFIER()
。使用這個命令來獲取最優的列集合,它將減少處理時間。使用 GETPRIMARYKEYS()
和 GETINDEXINFO()
來用格式化 WHERE
子句,這將有助於使開銷降到最少。 使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。PreparedStatement 對象的開銷比Statement大,對於一次性操作並不會帶來額外的好處。 顯式地關閉和釋放資源。如果連接到數據庫的應用程序需要長期運行,最重要的規則之一是在正確的時機清除活動會話。切記,任何人都不期望經常重新引導系統。
完成後關閉結果集。通常會遺漏這個步驟,但是如果您沒有執行這一步驟,則 Java 虛擬機(JVM)垃圾收集機制就不能回收對象。最後應用程序可能耗盡 JDBC 資源,甚至可能耗盡內存。
只更新和訪問需要的字段。再一次重申,應該只訪問需要的數據,不要超出此範圍。
定製 SQLJ profiler和請求聯機檢查。該步驟防止 SQLJ 動態地訪問數據,從而降低性能。這條規則將確保 SQLJ 靜態地運行。
調優 JVM 堆的大小。1MB 的缺省堆往往不夠大,會影響性能。增大堆的大小以滿足應用程序的需要。但是要注意:將堆的大小設置成最大會降低垃圾收集的頻率,其結果反而會影響性能。
使版本保持最新。儘量使用新的版本。雖然移植要花費一些精力,但通常值得我們這樣做。SQLJ 和 JDBC 都是比較新的標準,每個新的版本都會有比較顯著的性能提高。
打開高速緩存。該規則幫助您避免準備動態 SQL 所要的開銷。設置 CACHEDYN=YES
將有助於提高 SQLJ 代碼的性能。
通過微調 SQLJ,使 Web 應用程序訪問數據庫的性能能夠趕上甚至超越使用 JDBC 時的性能。