您的位置:首页 > 博客中心 > 数据库 >

Berkeley DB Java Edition 简介

时间:2022-03-13 22:55

JE的记录包含两部分,key键值和value数据值,这两个值都是通过DatabaseEntry对象封装起来,所以说如果要使用记录,则你必须创建两个DatabaseEntry对象,一个是用来做为key,另外一个是做为value.
 
DatabaseEntry能够支持任何的能够转换为bytes数组形式的基本数据。包括所有的JAVA基本类型和可序列化的对象.
          
使用记录
 示例一:把字符串转换DatabaseEntry
 示例二:把DatabaseEntry里的数据转换成字符串
读和写database 记录
    读和写database记录的时候大体是基本一样的,唯一有区别的是每个key写是否允许写多条记录,默认情况下是不支持多条记录的。
a)     你可以使用如下方法向database 里添加记录
l        Database.put()
    向database中添加一条记录。如果你的database不支持一个key对应多个data或当前database中已经存在该key了,则使用此方法将使用新的值覆盖旧的值。
l        Database.putNoOverwrite()
    向database中添加新值但如果原先已经有了该key,则不覆盖。不管database是否允许支持多重记录(一个key对应多个value),只要存在该key就不允许添加,并且返回perationStatus.KEYEXIST信息。
l        Database.putNoDupData()
    想database中添加一条记录,如果database中已经存在了相同的 key和value则返回 OperationStatus.KEYEXIST.
使用示例:
b)     你可以使用如下方法从database 里读取记录
1.         Database.get()
       基本的读记录的方法,通过key的方式来匹配,如果没有改记录则返回OperationStatus.NOTFOUND。
l         Database.getSearchBoth()
       通过key和value来同时匹配,同样如果没有记录匹配key和value则会返回OperationStatus.NOTFOUND
使用示例:
c)     删除记录
   可以使用Database.delete()这个方法来删除记录。如果你的database支持多重记录,则当前key下的所有记录都会被删除,如果只想删除多重记录中的一条则可以使用游标来删除。
    当然你也可以使用Environment.truncateDatabase()这个方法来清空database 中的所有记录。
 
使用示例:
package je.gettingStarted;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
...
try {
    String aKey = "myFirstKey";
    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
    myDatabase.delete(null, theKey);
} catch (Exception e) {
}
d)     提交事务
   当你对database进行了写操作的时候,你的修改不一定马上就能生效,有的时候他仅仅是缓存在RAM中,如果想让你的修改立即生效,则可以使用Environment.sync()方法来把数据同步到磁盘中去。
e)     不同类型的数据的处理
1.     你可以使用DatabaseEntry来绑定基本的JAVA数据类型,主要有String、Character、Boolean、Byte、Short、Integer、Long、Float、Double.
       使用示例一:
              package je.gettingStarted;
              import com.sleepycat.bind.EntryBinding;
              import com.sleepycat.bind.tuple.TupleBinding;
              import com.sleepycat.je.DatabaseEntry;
              ...
              try {
                  String aKey = "myLong";
                  DatabaseEntry theKey = new
                  DatabaseEntry(aKey.getBytes("UTF-8"));   
 
                  Long myLong = new Long(123456789l);
                  DatabaseEntry theData = new DatabaseEntry();
                  EntryBinding myBinding =       
                  TupleBinding.getPrimitiveBinding(Long.class);
                  myBinding.objectToEntry(myLong, theData);
                  myDatabase.put(null, theKey, theData);
              } catch (Exception e) {
                  // Exception handling goes here
              }
       使用示例二:
       package je.gettingStarted;
       import com.sleepycat.bind.EntryBinding;
       import com.sleepycat.bind.tuple.TupleBinding;
       import com.sleepycat.je.Database;
       import com.sleepycat.je.DatabaseEntry;
       import com.sleepycat.je.LockMode;
       import com.sleepycat.je.OperationStatus;
       ...
       Database myDatabase = null;
       try {
           String aKey = "myLong";
           DatabaseEntry theKey = new
              DatabaseEntry(aKey.getBytes("UTF-8"));
           DatabaseEntry theData = new DatabaseEntry();
           EntryBinding myBinding =       
              TupleBinding.getPrimitiveBinding(Long.class);
           OperationStatus retVal = myDatabase.get(null, theKey, theData,
              LockMode.DEFAULT);
           String retKey = null;
           if (retVal == OperationStatus.SUCCESS) {
        Long theLong = (Long) myBinding.entryToObject(theData);
               retKey = new String(theKey.getData(), "UTF-8");
               System.out.println("For key: ‘" + retKey + "‘ found Long: ‘" +
                            theLong + "‘.");
           } else {
               System.out.println("No record found for key ‘" + retKey + "‘.");
           }
       } catch (Exception e) {
           // Exception handling goes here
       }
2.         可序列化的对象的绑定
1.         首先你需要创建一个可序列化对象
2.         打开或创建你的database,你需要两个,一个用来存储你的数据,另外一个用来存储类信息。
3.         实例化catalog类,这个时候你可以使用com.sleepycat.bind.serial.StoredClassCatalog,来存储你的类信息。
4.         通过com.sleepycat.bind.serial.SerialBinding来绑定数据和类。
5.         绑定并存储数据。
示例:
l         创建一个可序列化的对象
package je.gettingStarted;
import java.io.Serializable;
public class MyData implements Serializable {
    private long longData;
    private double doubleData;
    private String description;
    MyData() {
        longData = 0;
        doubleData = 0.0;
        description = null;
    }
    public void setLong(long data) {
        longData = data;
    }
    public void setDouble(double data) {
        doubleData = data;
    }
    public void setDescription(String data) {
        description = data;
    }
    public long getLong() {
        return longData;
    }
    public double getDouble() {
        return doubleData;
    }
    public String getDescription() {
        return description;
    }
}
 
l         存储数据
package je.gettingStarted;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
...
String aKey = "myData";
MyData data2Store = new MyData();
data2Store.setLong(123456789l);
data2Store.setDouble(1234.9876543);
data2Store.setDescription("A test instance of this class");
try {
    DatabaseConfig myDbConfig = new DatabaseConfig();
    myDbConfig.setAllowCreate(true);
    myDbConfig.setSortedDuplicates(true);
    Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig);
    myDbConfig.setSortedDuplicates(false);
       //打开用来存储类信息的库
    Database myClassDb = myDbEnv.openDatabase(null, "classDb", myDbConfig);
    // 3)创建catalog
    StoredClassCatalog classCatalog = new StoredClassCatalog(myClassDb);
   // 4)绑定数据和类
    EntryBinding dataBinding = new SerialBinding(classCatalog,
                                                 MyData.class);
    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
   // 向DatabaseEntry里写数据
    DatabaseEntry theData = new DatabaseEntry();
    dataBinding.objectToEntry(data2Store, theData);
    myDatabase.put(null, theKey, theData);
} catch (Exception e) {
    // 错误处理
}
l         读数据
package je.gettingStarted;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
...
// The key data.
String aKey = "myData";
try {
    DatabaseConfig myDbConfig = new DatabaseConfig();
    myDbConfig.setAllowCreate(false);
    Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig);
       //用来存储类信息的库
    Database myClassDb = myDbEnv.openDatabase(null, "classDb", myDbConfig);
 
    // 实例化catalog
    StoredClassCatalog classCatalog = new StoredClassCatalog(myClassDb);
    // 创建绑定对象
    EntryBinding dataBinding = new SerialBinding(classCatalog,
                                                 MyData.class);
    DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));
    DatabaseEntry theData = new DatabaseEntry();
    myDatabase.get(null, theKey, theData, LockMode.DEFAULT);
    // Recreate the MyData object from the retrieved DatabaseEntry using
    // 根据存储的类信息还原数据
 MyData retrievedData=(MyData)dataBinding.entryToObject(theData);
 
} catch (Exception e) {
    // Exception handling goes here
}
3.         自定义对象的绑定
       使用tuple binding 来绑定自定义数据的步骤
①.     实例化你要存储的对象
②.     通过com.sleepycat.bind.tuple.TupleBinding class来创建一个tuple binding。
③.     创建一个database,跟序列化的对象不同,你只需要创建一个。
④.     通过继承第二步的类来创建一个entry binding 对象。
⑤.     存储和使用数据
使用示例:
l         创建要存储的对象
package je.gettingStarted;
public class MyData2 {
    private long longData;
    private Double doubleData;
    private String description;
    public MyData2() {
        longData = 0;
        doubleData = new Double(0.0);
        description = "";
    }
    public void setLong(long data) {
        longData = data;
    }
    public void setDouble(Double data) {
        doubleData = data;
    }
    public void setString(String data) {
        description = data;
    }
    public long getLong() {
        return longData;
    }
    public Double getDouble() {
        return doubleData;
    }
    public String getString() {
        return description;
    }
}
l         创建一个TupleBinding对象
package je.gettingStarted;
 
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.bind.tuple.TupleInput;
import com.sleepycat.bind.tuple.TupleOutput;
 
public class MyTupleBinding extends TupleBinding {
 
    // 把对象转换成TupleOutput
    public void objectToEntry(Object object, TupleOutput to) {
 
        MyData2 myData = (MyData2)object;
        to.writeDouble(myData.getDouble().doubleValue());
        to.writeLong(myData.getLong());
        to.writeString(myData.getString());
    }
   //把TupleInput转换为对象
    public Object entryToObject(TupleInput ti) {
        Double theDouble = new Double(ti.readDouble());
        long theLong = ti.readLong();
        String theString = ti.readString();
 
        MyData2 myData = new MyData2();
        myData.setDouble(theDouble);
        myData.setLong(theLong);
        myData.setString(theString);
        return myData;
    }
}
l          读和写数据
package je.gettingStarted;
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.DatabaseEntry;
...
TupleBinding keyBinding = new MyTupleBinding();
MyData2 theKeyData = new MyData2();
theKeyData.setLong(123456789l);
theKeyData.setDouble(new Double(12345.6789));
theKeyData.setString("My key data");
 
DatabaseEntry myDate = new DatabaseEntry();
try {
    // 把theKeyData 存储到DatabaseEntry里
    keyBinding.objectToEntry(theKeyData, myDate);
    ...
    // Database 进行了一些读和写操作
    ...
    // Retrieve the key data
    theKeyData = (MyData2) keyBinding.entryToObject(myDate);
} catch (Exception e) {
    // 错误处理
}
f)      使用比较器
   JE是使用BTrees来组织结构的,这意味着当对database的读和写需要涉及BTrees间的节点比较。这些比较在key间是经常的发生的。如果你的database支持多重记录,那么也会存在data间的比较。
    默认的情况JE的比较器是按照字节的方式来进行比较的,这通常情况下能处理大多数的情况。但有的时候确实需要自定义比较器用于特殊的通途,比如说按照key来排序。
l        创建自己的比较器
    其实很简单,只要你重写Comparator class中的比较方法(compare)就可以了,通过Comparator.compare()会传递给你两个byte 数组形式的值,如果你知道结构,则可以根据你自己定义的方法来进行比较
 
示例:
package je.gettingStarted;
import java.util.Comparator;
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);
    }
}
l        让database使用你自定义的比较器
   如果你想改变database中基本的排序方式,你只能重新创建database并重新导入数据。
①.    DatabaseConfig.setBtreeComparator()
    用于在database里两个key的比较
②.    DatabaseConfig.setOverrideBtreeComparator()
    如果为true则代表让database使用 DatabaseConfig.setBtreeComparator()设置的比较器来代替默认的比较器。
③.    DatabaseConfig.setDuplicateComparator()
    用于database可以使用多重记录的时候的data的    比较。
④.    DatabaseConfig.setOverrideDuplicateComparator()
    如果为true则代表让database使用 DatabaseConfig. setDuplicateComparator()设置    的比    较器来代替默认的比较器。
使用示例:
package je.gettingStarted;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import java.util.Comparator;   
...
try {
    DatabaseConfig myDbConfig = new DatabaseConfig();
    myDbConfig.setAllowCreate(true);
 
    // 设置要使用的比较器
    myDbConfig.setDuplicateComparator(MyDataComparator.class);
    // 使用自己定义的比较器
    myDbConfig.setSortedDuplicates(true);
    Database myDatabase = myDbEnv.openDatabase(null, "myDb", myDbConfig);
} catch (DatabaseException dbe) {
    // Exception handling goes here
}
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import java.io.File;
...
Environment myDbEnvironment = null;
Database myDatabase = null;
Cursor myCursor = null;
try {
    myDbEnvironment = new Environment(new File("/export/dbEnv"), null);
    myDatabase = myDbEnvironment.openDatabase(null, "myDB", null);
    myCursor = myDatabase.openCursor(null, null);
} catch (DatabaseException dbe) {
    // Exception handling goes here ...
}
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.Environment;
...
try {
    ...
} catch ... {
} finally {
    try {
        if (myCursor != null) {
            myCursor.close();
        }
 
        if (myDatabase != null) {
            myDatabase.close();
        }
        if (myDbEnvironment != null) {
            myDbEnvironment.close();
        }
    } catch(DatabaseException dbe) {
        System.err.println("Error in close: " + dbe.toString());
    }
}
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode; 
import com.sleepycat.je.OperationStatus;
...
Cursor cursor = null;
try {
    cursor = myDatabase.openCursor(null, null);
    DatabaseEntry foundKey = new DatabaseEntry();
    DatabaseEntry foundData = new DatabaseEntry();
 
    // 通过cursor.getNex方法来遍历记录
 while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
        OperationStatus.SUCCESS) {
        String keyString = new String(foundKey.getData(), "UTF-8");
        String dataString = new String(foundData.getData(), "UTF-8");
        System.out.println("Key | Data : " + keyString + " | " +
                       dataString + "");
    }
} catch (DatabaseException de) {
    System.err.println("Error accessing database." + de);
} finally {
    // 使用后必须关闭游标
    cursor.close();
}
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode; 
import com.sleepycat.je.OperationStatus;
...
Cursor cursor = null;
try {
    ...
    // Open the cursor.
    cursor = myDatabase.openCursor(null, null);
    DatabaseEntry foundKey = new DatabaseEntry();
    DatabaseEntry foundData = new DatabaseEntry();
 
    // 使用cursor.getPrev方法来遍历游标获取数据
    while (cursor.getPrev(foundKey, foundData, LockMode.DEFAULT)
       == OperationStatus.SUCCESS) {
        String theKey = new String(foundKey.getData(), "UTF-8");
        String theData = new String(foundData.getData(), "UTF-8");
        System.out.println("Key | Data : " + theKey + " | " + theData + "");
    }
} catch (DatabaseException de) {
    System.err.println("Error accessing database." + de);
} finally {
    // 使用后必须关闭游标
    cursor.close();
}
查询的key
查询的data
游标指向
Alaska
Fa
Alaska/Fairbanks
Arizona
Fl
Arizona/Florence
Alaska
An
Alaska/Anchorage
package je.gettingStarted;
 
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
...
 
String searchKey = "Alaska";
String searchData = "Fa";
 
Cursor cursor = null;
try {
    ...
    cursor = myDatabase.openCursor(null, null);
    DatabaseEntry theKey =
         new DatabaseEntry(searchKey.getBytes("UTF-8"));
    DatabaseEntry theData =
         new DatabaseEntry(searchData.getBytes("UTF-8"));
    cursor = myDatabase.openCursor(null, null);
    OperationStatus retVal = cursor.getSearchBothRange(theKey,
 theData, LockMode.DEFAULT);
    if (retVal == OperationStatus.NOTFOUND) {
        System.out.println(searchKey + "/" + searchData +
                           " not matched in database " +
                           myDatabase.getDatabaseName());
    } else {
        String foundKey = new String(theKey.getData(), "UTF-8");
        String foundData = new String(theData.getData(), "UTF-8");
        System.out.println("Found record " + foundKey + "/" + foundData +
                           "for search key/data: " + searchKey +
                           "/" + searchData);
    }
 
} catch (Exception e) {
    // Exception handling goes here
} finally {
   cursor.close();
}
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
...
Cursor cursor = null;
try {
    ...
    // Create DatabaseEntry objects
    // searchKey is some String.
    DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
    DatabaseEntry theData = new DatabaseEntry();
    cursor = myDatabase.openCursor(null, null);
 
    OperationStatus retVal = cursor.getSearchKey(theKey,
theData, LockMode.DEFAULT);
   
    // 如果count超过一个,则遍历
    if (cursor.count() > 1) {
        while (retVal == OperationStatus.SUCCESS) {
            String keyString = new String(theKey.getData(), "UTF-8");
            String dataString = new String(theData.getData(), "UTF-8");
            System.out.println("Key | Data : " + keyString + " | " +
                               dataString + "");
            retVal = cursor.getNextDup(theKey, theData, LockMode.DEFAULT);
        }
    }
} catch (Exception e) {
    // Exception handling goes here
} finally {
   // Make sure to close the cursor
   cursor.close();
}
    如果存在相同的key在database里则返OperationStatus.KEYEXIS,
    如果不存在key则添加数据。
package je.gettingStarted;
   
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.OperationStatus;
...
String key1str = "My first string";
String data1str = "My first data";
String key2str = "My second string";
String data2str = "My second data";
String data3str = "My third data";
Cursor cursor = null;
try {
    ...
    DatabaseEntry key1 = new DatabaseEntry(key1str.getBytes("UTF-8"));
    DatabaseEntry data1 = new DatabaseEntry(data1str.getBytes("UTF-8"));
    DatabaseEntry key2 = new DatabaseEntry(key2str.getBytes("UTF-8"));
    DatabaseEntry data2 = new DatabaseEntry(data2str.getBytes("UTF-8"));
    DatabaseEntry data3 = new DatabaseEntry(data3str.getBytes("UTF-8"));
    cursor = myDatabase.openCursor(null, null);
 
    OperationStatus retVal = cursor.put(key1, data1); // 添加成功
    retVal = cursor.put(key2, data2); // 添加成功
    retVal = cursor.put(key2, data3); // 如果允许多重记录则添加成功                                                                                      //否则添加失败 
} catch (Exception e) {
    // Exception handling goes here
} finally {
   // Make sure to close the cursor
   cursor.close();
}
package je.gettingStarted;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
...
Cursor cursor = null;
try {
    ...
    DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
    DatabaseEntry theData = new DatabaseEntry();
    cursor = myDatabase.openCursor(null, null);
    OperationStatus retVal = cursor.getSearchKey(theKey, theData,                                        LockMode.DEFAULT);
    //如果date不是多重记录.
    if (cursor.count() == 1) {
            System.out.println("Deleting " +
                               new String(theKey.getData(), "UTF-8") +
                               "|" +
                               new String(theData.getData(), "UTF-8"));
            cursor.delete();//删除当前记录
    }
} catch (Exception e) {
    // Exception handling goes here
} finally {
   // Make sure to close the cursor
   cursor.close();
}
import com.sleepycat.je.Cursor;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
...
Cursor cursor = null;
try {
    ...
    DatabaseEntry theKey = new DatabaseEntry(searchKey.getBytes("UTF-8"));
    DatabaseEntry theData = new DatabaseEntry();
    cursor = myDatabase.openCursor(null, null);
    OperationStatus retVal = cursor.getSearchKey(theKey, theData,
LockMode.DEFAULT);
   
    //将要被替换的值
    String replaceStr = "My replacement string";
    DatabaseEntry replacementData =
        new DatabaseEntry(replaceStr.getBytes("UTF-8"));
    cursor.putCurrent(replacementData);//把当前位置用新值替换
} catch (Exception e) {
    // Exception handling goes here
} finally {
   // Make sure to close the cursor
   cursor.close();
}
package je.gettingStarted;
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryConfig;
import java.io.File;
...
DatabaseConfig myDbConfig = new DatabaseConfig();
//二级库的配置信息
SecondaryConfig mySecConfig = new SecondaryConfig();
myDbConfig.setAllowCreate(true);
mySecConfig.setAllowCreate(true);
// 通常二级库经常是允许多重记录的
mySecConfig.setSortedDuplicates(true);
 
// primary database
Environment myEnv = null;
Database myDb = null;
SecondaryDatabase mySecDb = null;
try {
    //打开primary库
       String dbName = "myPrimaryDatabase";
    myEnv = new Environment(new File("/tmp/JEENV"), null);
    myDb = myEnv.openDatabase(null, dbName, myDbConfig);
 
    //创建tuple binding
    TupleBinding myTupleBinding = new MyTupleBinding();
 
    // 创建二级库的key创建器
    FullNameKeyCreator keyCreator = new        FullNameKeyCreator(myTupleBinding);
 
    // 设置二级库的创建器
    mySecConfig.setKeyCreator(keyCreator);
 
    //打开二级库
    String secDbName = "mySecondaryDatabase";
    mySecDb = myEnv.openSecondaryDatabase(null, secDbName,
       myDb, mySecConfig);
} catch (DatabaseException de) {
    // 错误处理
}
try {
    if (mySecDb != null) {
        mySecDb.close();
    }
 
    if (myDb != null) {
        myDb.close();
    }
 
    if (myEnv != null) {
        myEnv.close();
    }
} catch (DatabaseException dbe) {
    // Exception handling goes here
}
package je.gettingStarted;
public class PersonData {
    private String userID;
    private String surname;
    private String familiarName;
    public PersonData(String userID, String surname, String familiarName) {
        this.userID = userID;
        this.surname = surname;
        this.familiarName = familiarName;
    }
    public String getUserID() {
        return userID;
    }
    public String getSurname() {
        return surname;
    }
    public String getFamiliarName() {
        return familiarName;
    }
}
 
package je.gettingStarted;、
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.SecondaryKeyCreator;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.SecondaryDatabase;
import java.io.IOException;
public class FullNameKeyCreator implements SecondaryKeyCreator {
    private TupleBinding theBinding;
    public FullNameKeyCreator(TupleBinding theBinding1) {
            theBinding = theBinding1;
    }
    public boolean createSecondaryKey(SecondaryDatabase secDb,
                                      DatabaseEntry keyEntry,
                                      DatabaseEntry dataEntry,
                                      DatabaseEntry resultEntry) {
 
        try {
            PersonData pd =
                (PersonData) theBinding.entryToObject(dataEntry);
                String fullName = pd.getFamiliarName() + " " +
                    pd.getSurname();
                resultEntry.setData(fullName.getBytes("UTF-8"));
        } catch (IOException willNeverOccur) {}
        return true;
    }
}
package je.gettingStarted;
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryConfig;
...
Environment myEnv = null;
Database myDb = null;
SecondaryDatabase mySecDb = null;
try {
...
    TupleBinding myDataBinding = new MyTupleBinding();
       //创建键创建器
    FullNameKeyCreator fnkc = new FullNameKeyCreator(myDataBinding);
 
    SecondaryConfig mySecConfig = new SecondaryConfig();
       //设置键创建器
    mySecConfig.setKeyCreator(fnkc);
    String secDbName = "mySecondaryDatabase";
    mySecDb = myEnv.openSecondaryDatabase(null, secDbName, myDb,
                                          mySecConfig);
} catch (DatabaseException de) {
    // Exception handling goes here
} finally {
    try {
        if (mySecDb != null) {
            mySecDb.close();
        }
        if (myDb != null) {
            myDb.close();
        }
 
        if (myEnv != null) {
            myEnv.close();
        }
    } catch (DatabaseException dbe) {
        // Exception handling goes here
    }
}
package je.gettingStarted;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.SecondaryDatabase;
...
try {
   ...
    String searchName = "John Doe";
    DatabaseEntry searchKey =
        new DatabaseEntry(searchName.getBytes("UTF-8"));
    DatabaseEntry primaryKey = new DatabaseEntry();
    DatabaseEntry primar

热门排行

今日推荐

热门手游