BerkeleyDB-JE 使用BaseAPI(四)

本篇開始介紹使用比較器
JE中的數據庫內部是使用B樹來組織的,這意味着大多數數據庫操作(插入,刪除,讀取,等等)涉及B樹節點的比較。這種比較一般情況下是基於記錄的鍵,但是如果你的數據庫支持重複數據,那麼比較也會涉及到記錄的值。
默認情況下,JE使用一個一個字節來進行字典比較(byte-by-byte lexicographic comparison)。這種機制適用於大多數的數據。然而,在某些情況下,你也可以使用自定義的比較器,比如說你要執行一個跟語言相關的記錄鍵的字符串比較(perform a language sensitive lexical ordering of string keys)。
要創建一個自定義的比較器非常簡單,你只要實現java中的Comparator接口即可。JE會爲 Comparator.compare()方法傳遞以字節數組存在於數據庫中的參數。
下面我們演示一個例子,我們想自定義一個比較器,不使用字節數組而是使用字符串來進行比較:

public class MyDataComparator implements Comparator {
public MyDataComparator() {}
public int compare(Object d1, Object d2) {
byte[] b1 = (byte[])d1;
byte[] b2 = (byte[])d2;
String s1 = new String(b1, "UTF-8");
String s2 = new String(b2, "UTF-8");
return s1.compareTo(s2);
}
}

要使用這個比較器,你可以使用以下的方法。
[list]
[*]DatabaseConfig.setBtreeComparator()
用於比較數據庫中記錄的鍵。
[*]DatabaseConfig.setDuplicateComparator()
用於比較允許重複數據的數據庫中的重複記錄的值。
[/list]
你也可以覆蓋默認的比較器,通過使用以下的方法。
[list]
[*]DatabaseConfig.setOverrideBtreeComparator()
指定覆蓋B書節點的比較器
[*]DatabaseConfig.setOverrideDuplicateComparator()
指定覆蓋重複記錄的比較器
[/list]
這兩者之間的不同,我現在還不太清楚o(╯□╰)o有一點需要注意,不管你用什麼比較器,返回的順序都應該是一樣的。也就是說新的比較器和舊的比較器對同一個記錄進行比較必須返回相同的值。
下面演示使用自定義的比較器

try {
// Get the database configuration object
DatabaseConfig myDbConfig = new DatabaseConfig();
myDbConfig.setAllowCreate(true);
// Set the duplicate comparator class
myDbConfig.setDuplicateComparator(MyDataComparator.class);
// Open the database that you will use to store your data
myDbConfig.setSortedDuplicates(true);
Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig);
} catch (DatabaseException dbe) {
// Exception handling goes here
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章