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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章