開發一個注重效能的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 方法