1.JDBM可以把它理解成一个嵌入式非常简单的数据库。官方网站:http://jdbm.sourceforge.net/ (OpenJMS和ActiveMQ 都用到了JDBM)
A:如果是以RecordManager.insert形式存储数据的话,它存储数据的格式是:一个自动生成的id + 一个序列化的对象。
B:如果是以BTree或HTree的insert形式存储数据的话,它存储数据的格式是:key + value ,类似Hashtable等
多数为个人理解,如果有不对的地方,望指正,谢谢:)
2.JDBM的普通存储(RecordManager.insert存储)
首先需要创建一个RecordManager,一般是通过RecordManagerFactory来创建它,需要一个字符串参数,这个参数用作JDBM创建的两个数据库文件名字的前缀。 例如:
java 代码
- RecordManager recman = RecordManagerFactory.createRecordManager("test");
然后如果要保存一条新的记录,只需要调用RecordManager插入方法insert,它会返回 保存这条数据自动生成的一个id。例如:
java 代码
-
- long recid = recman.insert(new Integer(100);
保持新记录之后,你需要通过使用RecordManager的commit方法(这个方法用来完成JDBM事件处理)来提交更改。你也可以使用rollback方法回滚到最后一次提交的地方,例如:
java 代码
也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。例如:
java 代码
-
- recman.setNamedObject("othername",recid);
为了取回保存的对象,如果你有记录id,那么可以通过RecordManager的fetch方法取,例如:
java 代码
- Integer person2 = (Integer)recman.fetch(recid);
也可以通过它的引用别名来取,可以通过RecordManager的getNamedObject来获得记录id。这将返回记录id,如果要取出的记录不存在的话,将返回0,例如:
java 代码
- long recid3 = recman.getNamedObject("othername");
- Integer person3 = (Integer)recman.fetch(recid3);
如果需要更新的话,可以调用RecordManager的update方法,例如:
java 代码
-
- recman.update(recid, new Integer(10011));
3 JDBM里的HTree和BTree存储(BTree或HTree的insert形式存储)
Htree会给JDBM一个简单的保持哈希树,你可以在其中put()和get()键值,但是它缺少排序和大小语义。BTree是一个可伸缩性和可管理性更强的树,具有排序和大小语义,并能够浏览该树。所以我们一般常用BTree.可以通过BTree的static方法createInstance获得一个BTree的实例化对象,createInstance需要2个参数,一个是RecordManager,另一个是java.util.Comparator (让其能够对键值进行比较),JDBM自身带有一组用于Long、String和ByteArray的Comparator 。
例如:
java 代码
- BTree bTree = BTree.createInstance(recman,new LongComparator());
这样就构建了一个BTree实例化对象,这个BTree拥有一个唯一的id(可以通过bTree.getRecid()获得到),这个id也就代表了这个BTree对象。也可以给这个BTree对象定义一个别名。例如:
java 代码
- recman.setNamedObject("bTreeName",bTree.getRecid());
然后你就可以通过这个别名(bTreeName)来获得到这个BTree的id了。例如:
java 代码
- long bTreeId = recman.getNamedObject("bTreeName");
通过BTree的load方法,也可以获得一个指定bTreeId的BTree对象,需要传递2个参数,一个是RecordManager,一个是要获得BTree对象的id值。
例如:
java 代码
- BTree bTree1 = BTree.load(recman, bTree.getRecid());
如果要想从BTree里取出存储的值,可以通过find方法,参数是key值
java 代码
- String key = "ttitfly"
- String strValue = (String)bTree.find(key);
如果要浏览这个树,可以使用通过browse()从BTree里获取的TupleBrowser,browse()方法返回一个TupleBrowser,放在树的键的开始部分。如果你向browse()提供了一个键,它就会位于树里的键的前面,如果你向它提供了一个“空(null)”作为键,那么它就会位于结尾。一旦有了TupleBrowser,就需要创建一个Tuple来保存键/值对(Tuple tuple=new Tuple(); ).当调用TupleBrowser.getNext()或者getPrevious()方法的时候,TupleBrowser将tuple作为一个参数。这两个方法都会返回一个布尔值,如果Tuple被取回,那么返回的就是“真(true)”,如果没有被取回,那么返回的就是“假(false)”。所以要在所有的键/值对里迭代,可以循环调用getNext()直到它返回false:
java 代码
- Tuple tuple=new Tuple();
- TupleBrowser browser = bTree.browse();
- while ( browser.getNext( tuple ) ) {
- System.out.println( tuple.getKey()+" "+tuple.getValue() );
- }
4 。两种方式存储详细demo例子:
A:基本方式存储
java 代码
- package ttitfly.jdbm;
-
- import java.io.Serializable;
-
- import jdbm.RecordManager;
- import jdbm.RecordManagerFactory;
-
- public class Test {
-
- public static void main(String[] args){
- try{
-
- RecordManager recman = RecordManagerFactory.createRecordManager("test" );
-
- Person person1 = new Person();
- person1.setAge(24);
- person1.setName("ttitfly");
- long recid = recman.insert(person1);
- recman.commit();
- System.out.println(recid);
-
-
- recman.setNamedObject("othername",recid);
-
- Person person2 = (Person)recman.fetch(recid);
- System.out.println(person2.getName());
- System.out.println(person2.getAge());
-
-
- long recid3 = recman.getNamedObject("othername");
- Person person3 = (Person)recman.fetch(recid3);
- System.out.println(person3.getName());
- System.out.println(person3.getAge());
-
-
- Person person4 = new Person();
- person4.setAge(25);
- person4.setName("test update");
- recman.update(recid, person4);
- recman.commit();
- Person person5 = (Person)recman.fetch(recid);
- System.out.println(person5.getAge());
- System.out.println(person5.getName());
-
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
- class Person implements Serializable{
- public String name;
- public int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
-
- }
输出结果为:
- 131130
- ttitfly
- 24
- ttitfly
- 24
- 25
- test update
B:BTree方式存储:
java 代码
- package ttitfly.jdbm;
-
- import jdbm.RecordManager;
- import jdbm.RecordManagerFactory;
- import jdbm.btree.BTree;
- import jdbm.helper.StringComparator;
- import jdbm.helper.Tuple;
- import jdbm.helper.TupleBrowser;
-
- public class TestBTree {
-
- public static void main(String[] args){
- try{
-
- RecordManager recman = RecordManagerFactory.createRecordManager("test" );
-
- BTree bTree = BTree.createInstance(recman,new StringComparator());
- System.out.println(bTree.getRecid());
- String key = "ttitfly";
- String value = "true";
- boolean replace = true;
-
-
- bTree.insert(key, value, replace);
-
-
- recman.setNamedObject("bTreeName",bTree.getRecid());
-
- long bTreeId = recman.getNamedObject("bTreeName");
- System.out.println(bTreeId);
-
-
- BTree bTree1 = BTree.load(recman, bTree.getRecid());
-
- bTree1.insert("testkey", "testvalue", replace);
-
-
- String strValue = (String)bTree.find("ttitfly");
- System.out.println(strValue);
-
-
- Tuple tuple=new Tuple();
- TupleBrowser browser = bTree.browse();
- while ( browser.getNext( tuple ) ) {
- System.out.println( tuple.getKey()+" "+tuple.getValue() );
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
-
-
- 输出结果为:
- 131150
- 131150
- true
- testkey testvalue
- ttitfly true