Derby這個完全java開發的開源的數據庫也不例外,因此你必須保證它不會成為你程序的一個瓶頸。盡管人們可以在Derby的手冊中找到關于這個話題全面的資料,我還是想更詳盡的關注一下這些問題,基于我的經驗提供一些具體的例子。
首先,有很多關于調整Derby屬性(諸如頁面大小和緩存大小等)的技巧。修改這些參數可以在一定程度上調整數據庫的性能,但是在通常情況下,更主要的問題來自與你的程序和數據庫的設計,因此,我們必須首先關注這些問題,最后再來考慮Derby的屬性。
在接下來的段落里,我將介紹一些能夠優化程序中有問題部分的技術。但是,和其他性能優化操作一樣,我們需要在優化前先測量并確認問題所在。
一個簡單的例子
讓我們從一個簡單的例子開始:假設我們Web程序中擁有一個“search/list”的頁面,要處理一個有接近100,000行的表,并且那個表不是很小的(至少有10欄)。用簡單的JDBC來寫一個例子,這樣我們可以專注在數據庫和JDBC問題上來。這篇文章中介紹的所有準則對所有的面向對象的映射工具都適用。
為了使得用戶能夠列出一個大的表,通常使用下面簡單的查詢語句。
select * from tbl
對應的JDBC語句如下: 在這兒,我們碰到了第一個問題。執行這樣的代碼,并產生100,000(或更多)個domain對象將肯定會導致java用完堆??臻g,產生一個“java.lang.OutOfMemoryError”的錯誤。對于初學者來說,我們首先必須找到一個方法來使得這個程序工作。 分頁Result Sets 隨著程序中數據量的增多,你首先想到的應該做的事就是為特定的記錄(通常是視圖)提供分頁支持。正如你在這個介紹性的例子中看到的,簡單地去獲取龐大的result sets很輕易導致 out of memory的錯誤。 許多數據庫服務器支持特定的SQL結構,它們可以用于獲得一個查詢結果的特定的子集。例如,在MySQL中,提供了LIMIT和OFFSET要害字,它們可以用于select查詢。因此,假如你執行類似下面的查詢
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
Connection connection = DriverManager.getConnection (
"jdbc:derby://localhost:1527/testDb;");
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from tbl");
ArrayList allResults = new ArrayList();while (rs.next()) {
// Object-Relation mapping code to populate your
// object from result set row
DomainObject domainObject = populate(rs);
allResults.add(modelObject);
}
System.out.
select * from tbl LIMIT 50 OFFSET 100
新聞熱點
疑難解答