優化數據訪問不是一件容易的事情——即使程序的性能很差,應用也不會拋出異常;即使程序包含了許多差勁的JDBC用法,編譯器也不會發出警告;即使網絡快要被龐大的通信量吞噬,也沒有一種數據庫工具能夠方便地檢測出拙劣的數據請求。
然而,當你把JDBC應用連接到WebSphere應用服務器時,仍可以采取一些措施讓應用更加高效。例如,下面兩則技巧能夠有效地提高更新數據庫數據的性能。
一、使用updateXXX方法
雖然用程序代碼更新數據庫的辦法不一定適用于所有的場合,但大家應該已經試過用程序執行更新和刪除操作了。ResultSet對象的updateXXX方法讓我們不必構造復雜的SQL命令就可以執行數據更新操作,我們只要提供待更新的列和數據,然后在把游標移出結果集的當前行之前,調用updateRow方法更新數據庫。在下面的例子中,getInt方法提取出ResultSet對象Age列的值:
int n = rs.getInt("Age");
// n包含rs結果集中Age列的值
. . .
rs.updateInt("Age", 25);
rs.updateRow();
updateInt方法將Age列的值更新為25,updateRow方法更新數據庫中包含被修改數據的行。
用程序代碼更新數據庫不僅改善了應用的可維護性,而且往往還提高了性能。這是因為,數據庫服務器已經在處理SELECT語句的過程中找到了待修改行的位置信息,不必再次執行代價昂貴的操作來尋找要修改的行。如果你確實需要該行的位置,數據庫服務器通常能夠提供可用行的內部指針,例如ROWID之類。
二、使用getBestRowIndentifier
利用getBestRowIndentifier(),我們可以確定在WHERE子句中最好用哪些列的集合。偽列通常是速度最快的數據訪問標識,但要確定這類列只能通過getBestRowIndentifier()。
有些應用程序不能利用定位式數據更新和刪除方式的優勢,這時,可以通過調用getPrimaryKeys()或getIndexInfo()來找出屬于唯一性索引的列,再用所有可搜索的列構造WHERE子句。這個辦法一般都有效,只是可能使最后得到的查詢變得相當復雜??紤]下面這個例子:
ResultSet WSrs = WSs.executeQuery
("SELECT user_name, ssn, address, city,
state, zip
FROM emp");
// 提取數據
...
WSs.executeQuery ("UPDATE EMP SET ADDRESS = ?
WHERE user_name = ? and ssn = ?
and address = ? and city = ? and state = ?
and zip = ?");
// 相當復雜的查詢
應用程序應當調用getBestRowIndentifier()來找出唯一地標識數據庫記錄的最優列集合(也許是一個偽列)。許多數據庫管理系統支持一些特殊的列,這些列不是用戶在定義表結構的時候顯式定義的,而是每一個表都有的隱含列(例如,ROWID,TID)。這些列稱為偽列,由于它們的值通常是直接指向記錄精確位置的指針,因此通過偽列訪問數據通常是最快的訪問方式。另外,由于偽列不是用戶定義表結構的時候顯式定義的,所以調用getColumns方法返回的結果中不會包含偽列。要確定是否有偽列可用,應當調用getBestRowIndentifier()。
如果數據源不包含特殊的偽列,getBestRowIndentifier()的結果集包含了指定表的最優唯一索引的列集合(如果存在唯一性索引的話)。也就是說,應用程序不必再調用getIndexInfo就可以得到最小的唯一性索引。
原文轉自:http://www.anti-gravitydesign.com