資料庫在操作少量測試資料和大量資料的時候,表現行為上有很大的差異。通常,在開發過程前期,人們不會關注資料庫效能的問題,但是隨著時間的發展,人們必須採取一些措施來保證資料庫在大量資料的情況下正常工作。
Derby這個完全Java開發的開源的資料庫也不例外,因此你必須保證它不會成為你程式的一個瓶頸。儘管人們可以在Derby的手冊中找到關於這個話題全面的資料,我還是想更詳盡的關注一下這些問題,基於我的經驗提供一些具體的例子。本文將著重於那些由在大的資料表中選取查詢資料而產生的程式效能問題。
首先,有很多關於調整Derby屬性(諸如頁面大小和緩衝大小等)的技巧。修改這些參數可以在一定程度上調整資料庫的效能,但是在通常情況下,更主要的問題來自與你的程式和資料庫的設計,因此,我們必須首先關注這些問題,最後再來考慮Derby的屬性。
在接下來的段落裡,我將介紹一些能夠最佳化程式中有問題部分的技術。但是,和其他效能最佳化操作一樣,我們需要在最佳化前先測量並確認問題所在。
一個簡單的例子
讓我們從一個簡單的例子開始:假設我們Web程式中擁有一個“search/list”的頁面,要處理一個有接近100,000行的表,並且那個表不是很小的(至少有10欄)。用簡單的JDBC來寫一個例子,這樣我們可以專註在資料庫和JDBC問題上來。這篇文章中介紹的所有準則對所有的物件導向的映射工具都適用。
為了使得使用者能夠列出一個大的表,通常使用下面簡單的查詢語句。
對應的JDBC語句如下:
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 rowDomainObject domainObject = populate(rs);allResults.add(modelObject);}System.out.println("Results Size: " + allResults.size()); |
在這兒,我們碰到了第一個問題。執行這樣的代碼,併產生100,000(或更多)個domain對象將肯定會導致java用完堆棧空間,產生一個“java.lang.OutOfMemoryError”的錯誤。對於初學者來說,我們首先必須找到一個方法來使得這個程式工作。
| 【內容導航】 |
| 第1頁:一個簡單的例子 |
第2頁:分頁Result Sets |
| 第3頁:確保使用索引(避免全表掃描) |
第4頁:使用合適的索引順序 |
| 第5頁:重建索引 |
第6頁:多欄索引 |
| 第7頁:索引的缺點、結論 |
|