浏览 4438 次
锁定老帖子 主题:JDBM存储
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-24  

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 代码
  1. RecordManager recman = RecordManagerFactory.createRecordManager("test");  

然后如果要保存一条新的记录,只需要调用RecordManager插入方法insert,它会返回 保存这条数据自动生成的一个id。例如:

java 代码
  1. //返回一个保存对象new Integer(100)后生成的一个id值   
  2. long recid = recman.insert(new Integer(100);  

 保持新记录之后,你需要通过使用RecordManager的commit方法(这个方法用来完成JDBM事件处理)来提交更改。你也可以使用rollback方法回滚到最后一次提交的地方,例如:

java 代码
  1. recman.commit();  

也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。例如:

java 代码
  1. //也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。   
  2. recman.setNamedObject("othername",recid);   

 

为了取回保存的对象,如果你有记录id,那么可以通过RecordManager的fetch方法取,例如:

java 代码
  1. Integer person2 = (Integer)recman.fetch(recid);   

 

也可以通过它的引用别名来取,可以通过RecordManager的getNamedObject来获得记录id。这将返回记录id,如果要取出的记录不存在的话,将返回0,例如:

java 代码
  1. long recid3 = recman.getNamedObject("othername");    
  2. Integer person3 = (Integer)recman.fetch(recid3);  

 如果需要更新的话,可以调用RecordManager的update方法,例如:

java 代码
  1. //可以把一个完全不同的类放到更新里,但是JDBM不会报错,因为它会把这些东西看作是可序列化的对象   
  2. 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 代码
  1. BTree bTree = BTree.createInstance(recman,new LongComparator());   

 这样就构建了一个BTree实例化对象,这个BTree拥有一个唯一的id(可以通过bTree.getRecid()获得到),这个id也就代表了这个BTree对象。也可以给这个BTree对象定义一个别名。例如:

java 代码
  1. recman.setNamedObject("bTreeName",bTree.getRecid());   

 然后你就可以通过这个别名(bTreeName)来获得到这个BTree的id了。例如:

java 代码
  1. long bTreeId = recman.getNamedObject("bTreeName");  

 

通过BTree的load方法,也可以获得一个指定bTreeId的BTree对象,需要传递2个参数,一个是RecordManager,一个是要获得BTree对象的id值。

例如:

java 代码
  1. BTree bTree1 = BTree.load(recman, bTree.getRecid());  

 

如果要想从BTree里取出存储的值,可以通过find方法,参数是key值

java 代码
  1. String key = "ttitfly"  
  2. 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 代码
  1. Tuple tuple=new Tuple();    
  2. TupleBrowser  browser = bTree.browse();   
  3. while ( browser.getNext( tuple ) ) {   
  4.           System.out.println( tuple.getKey()+" "+tuple.getValue() );   
  5. }  

 

4 。两种方式存储详细demo例子:

A:基本方式存储

java 代码
  1. package ttitfly.jdbm;   
  2.   
  3. import java.io.Serializable;   
  4.   
  5. import jdbm.RecordManager;   
  6. import jdbm.RecordManagerFactory;   
  7.   
  8. public class Test {   
  9.   
  10.     public static void main(String[] args){   
  11.         try{   
  12.             //创建RecordManager实例对象   
  13.             RecordManager recman = RecordManagerFactory.createRecordManager("test" );   
  14.             //插入   
  15.             Person person1 = new Person();   
  16.             person1.setAge(24);   
  17.             person1.setName("ttitfly");   
  18.             long recid = recman.insert(person1);   
  19.             recman.commit();   
  20.             System.out.println(recid);   
  21.                
  22.             //也可以为插入的记录设置一个别名,方便通过这个别名来取这条数据。   
  23.             recman.setNamedObject("othername",recid);    
  24.             //查询   
  25.             Person person2 = (Person)recman.fetch(recid);   
  26.             System.out.println(person2.getName());   
  27.             System.out.println(person2.getAge());   
  28.   
  29.             //通过别名查询   
  30.             long recid3 = recman.getNamedObject("othername");    
  31.             Person person3 = (Person)recman.fetch(recid3);   
  32.             System.out.println(person3.getName());   
  33.             System.out.println(person3.getAge());   
  34.        
  35.             //更新   
  36.             Person person4 = new Person();   
  37.             person4.setAge(25);   
  38.             person4.setName("test update");   
  39.             recman.update(recid, person4);   
  40.             recman.commit();   
  41.             Person person5 = (Person)recman.fetch(recid);   
  42.             System.out.println(person5.getAge());   
  43.             System.out.println(person5.getName());   
  44.   
  45.         }catch(Exception e){   
  46.             e.printStackTrace();   
  47.         }   
  48.     }   
  49. }   
  50.   
  51. class Person implements Serializable{   
  52.     public String name;   
  53.     public int age;   
  54.     public int getAge() {   
  55.         return age;   
  56.     }   
  57.     public void setAge(int age) {   
  58.         this.age = age;   
  59.     }   
  60.     public String getName() {   
  61.         return name;   
  62.     }   
  63.     public void setName(String name) {   
  64.         this.name = name;   
  65.     }   
  66.        
  67. }   

输出结果为:

  1. 131130  
  2. ttitfly   
  3. 24  
  4. ttitfly   
  5. 24  
  6. 25  
  7. test update  

B:BTree方式存储:

java 代码
  1. package ttitfly.jdbm;   
  2.   
  3. import jdbm.RecordManager;   
  4. import jdbm.RecordManagerFactory;   
  5. import jdbm.btree.BTree;   
  6. import jdbm.helper.StringComparator;   
  7. import jdbm.helper.Tuple;   
  8. import jdbm.helper.TupleBrowser;   
  9.   
  10. public class TestBTree {   
  11.   
  12.     public static void main(String[] args){   
  13.         try{   
  14.             //创建RecordManager实例对象   
  15.             RecordManager recman = RecordManagerFactory.createRecordManager("test" );   
  16.             //构建一个BTree对象   
  17.             BTree bTree = BTree.createInstance(recman,new StringComparator());   
  18.             System.out.println(bTree.getRecid());   
  19.             String key = "ttitfly";   
  20.             String value = "true";   
  21.             boolean replace = true;   
  22.                
  23.             //insert插入   
  24.             bTree.insert(key, value, replace);   
  25.                
  26.             //给该BTree对象起个别名   
  27.             recman.setNamedObject("bTreeName",bTree.getRecid());    
  28.             //通过该别名获得到该BTree的id值   
  29.             long bTreeId = recman.getNamedObject("bTreeName");   
  30.             System.out.println(bTreeId);   
  31.                
  32.             //通过BTree的id值,获取指定的BTree对象   
  33.             BTree bTree1 = BTree.load(recman, bTree.getRecid());   
  34.             //insert   
  35.             bTree1.insert("testkey""testvalue", replace);   
  36.                
  37.             //查找   
  38.             String strValue = (String)bTree.find("ttitfly");   
  39.             System.out.println(strValue);   
  40.                
  41.             //查找出该BTree树里的所有的key,value值   
  42.             Tuple tuple=new Tuple();    
  43.             TupleBrowser  browser = bTree.browse();   
  44.             while ( browser.getNext( tuple ) ) {   
  45.                 System.out.println( tuple.getKey()+" "+tuple.getValue() );   
  46.             }   
  47.         }catch(Exception e){   
  48.             e.printStackTrace();   
  49.         }   
  50.     }   
  51. }   
  52.   
  53.   
  54.   
  55. 输出结果为:   
  56. 131150  
  57. 131150  
  58. true  
  59. testkey testvalue   
  60. ttitfly true  

 

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics