首页 > 代码库 > Berkeley DB

Berkeley DB

最近用BDB写点东西,写了挺多个测试工程。列下表,也理清楚最近的思路

1.测试BDB程序,包括打开增加记录,查询记录,获取所有记录。将数据转存mysql

   程序的不足,增加记录仅仅只有key和value,查询记录仅仅是简单的根据key或者同时制定key和value来查,只获取所有记录,没有获取部分记录,转存mysql消耗比较大

2.mysql和BDB插入和选择数据比较。

   在java虚拟机内存相同的条件下,mysql插入数据量比较大时会报内存溢出,BDB 插入数据的量可以比mysql大。而且速度也快。查询所有记录mysql非常快,BDB相对来说比较慢,hbase只测试了下插入记录,插入一千条记录都慢得要死。单个数据选择BDB相对于mysql来说有绝对的优势。

3.修改1中的数据转存mysql。通过两台电脑,两个BDB+mysql进行。

   大致流程是一个一台电脑A上有BDB,另外一台电脑B上有BDB和mysql。A上采集数据存储在BDB中。然后自己写一个文件发送的程序把BDB在硬盘上的.jdb文件发送到另外一台电脑。另外一台电脑通过BDB读取.jdb文件写进mysql里面。运行效果比较好,但是时间比直接插入一千万条记录进BDB要长。现在没看到应用领域。

4.序列化存储。实现用BDB存储学生信息

5.BDB游标的使用。对比getSearchKey,getSearchBoth,getSearchKeyRange,getSearchBothRange函数。最后写了个key的模糊查询。

以上基本上是一个星期学到的有关Berkeley DB的知识。

 

getSearchKey,getSearchBoth,getSearchKeyRange,getSearchBothRange对比程序

  1 import java.io.File;  2 import java.io.UnsupportedEncodingException;  3 import java.util.ArrayList;  4   5 import com.sleepycat.je.Cursor;  6 import com.sleepycat.je.Database;  7 import com.sleepycat.je.DatabaseConfig;  8 import com.sleepycat.je.DatabaseEntry;  9 import com.sleepycat.je.Environment; 10 import com.sleepycat.je.EnvironmentConfig; 11 import com.sleepycat.je.LockMode; 12 import com.sleepycat.je.OperationStatus; 13  14  15 public class Query { 16     private Environment dbEnvironment = null; 17     private Database db = null; 18      19      20     private void DataConstruct(int t) throws UnsupportedEncodingException { 21         int Total = t; 22         long BDBTime = 0; 23         long start = System.currentTimeMillis(); 24         /* 25          *  26          */ 27         OpenBDB(); 28         while(Total!=0) 29         { 30  31             int k = Total; 32             int v = Total+1; 33             DatabaseEntry iKey = new DatabaseEntry(Integer.valueOf(k).toString().getBytes("UTF-8")); 34             DatabaseEntry iValue = http://www.mamicode.com/new DatabaseEntry(Integer.valueOf(v).toString().getBytes("UTF-8")); 35             36              37             //System.out.println("Writing : Key= " + k + "  Value = "http://www.mamicode.com/+ v +" count: " + Total); 38             39              40             db.put(null, iKey, iValue); 41             Total--; 42             } 43         long end = System.currentTimeMillis(); 44         BDBTime = end - start; 45         System.out.println(BDBTime); 46          47          48          49     } 50      51     //各种查询比较 52      53     public void QueryCompare(int t) throws UnsupportedEncodingException{ 54          55         DataConstruct(t); 56         //OpenBDB(); 57          58         Cursor cursor = null; 59         cursor = db.openCursor(null, null); 60          61         DatabaseEntry thekey = new DatabaseEntry(); 62         String key = "12345"; 63         thekey.setData(key.getBytes("utf-8")); 64          65         DatabaseEntry thedata = http://www.mamicode.com/new DatabaseEntry(); 66          67         System.out.println("   >======== getSearchKey Start ========<"); 68         cursor.getSearchKey(thekey, thedata, LockMode.DEFAULT); 69         byte[] temp = thedata.getData(); 70         String res = new String(temp,"utf-8"); 71         System.out.println("          Key " + key + " Value " + res); 72         System.out.println("   >======== getSearchKey End ========<"); 73         System.out.println(); 74          75         System.out.println("   >======== getSearchKeyRange Start ========<"); 76         cursor.getSearchKeyRange(thekey, thedata, LockMode.DEFAULT); 77         temp = thedata.getData(); 78         res = new String(temp,"utf-8"); 79         System.out.println("          Key " + key + " Value " + res); 80         System.out.println("   >======== getSearchKeyRange End ========<"); 81         System.out.println(); 82          83         //如果要执行这个查询最后不用随机数,用随机数相查到结果不易 84         System.out.println("   >======== getSearchBoth Start ========<"); 85         thedata.setData("12346".getBytes("utf-8")); 86         OperationStatus status = cursor.getSearchBoth(thekey, thedata, LockMode.DEFAULT); 87         if(status == OperationStatus.SUCCESS){ 88             temp = thedata.getData(); 89             res = new String(temp,"utf-8"); 90             System.out.println("          Key " + key + " Value " + res); 91         } 92         else 93             System.out.println("   Not Such Record"); 94          95         System.out.println("   >======== getSearchKeyBoth End ========<"); 96         System.out.println(); 97          98         System.out.println("   >======== getSearchBothRange Start ========<"); 99         thedata.setData("123451".getBytes("utf-8"));100         status = cursor.getSearchBoth(thekey, thedata, LockMode.DEFAULT);101         if(status == OperationStatus.SUCCESS){102             temp = thedata.getData();103             res = new String(temp,"utf-8");104             System.out.println("          Key " + key + " Value " + res);105         }106         else107             System.out.println("   Not Such Record");108         System.out.println("    RecordCount: " + cursor.count());109         110         System.out.println("   >======== getSearchKeyBothRange End ========<");111         System.out.println();112         113         /*114          * getSearchKeyRange和getSearchKey都是将游标定位到匹配key值相同的地方,如果再用Cursor.getNext无论如何都是能得到游标下一个。区别是当用到B树的时候115          * 根据getSearchKeyRange和getSearchKey和Cursor.getNext的输出结果的规律可以看出,BDB内部存储采用树形结构,类似字符数116          * getSearchBoth同时匹配Key和Value才有结果,才能返回OperationStatus.SUCCESS才算操作成功117          * 118          */119         /*120          * 实现模糊查询,用getSearchKey配合getNext即可121          * 122          */123         //单条件模糊查询测试代码,匹配12345,结束应该是12346124         125         System.out.println("   >======== Simple  Pattern key = 12345 getSearchKey Start ========<");126         thedata = http://www.mamicode.com/new DatabaseEntry();//单条件查询,把之前的thedata设置为空127         cursor.getSearchKeyRange(thekey, thedata, LockMode.DEFAULT);128         temp = thedata.getData();  //129         res = new String(temp,"utf-8");130         System.out.println("          Key " + key + " Value " + res);131         thekey = new DatabaseEntry();132         while(cursor.getNext(thekey, thedata, LockMode.DEFAULT) != OperationStatus.NOTFOUND){        //结束条件是OperationStatus.NOTFOUND133             temp = thedata.getData();134             byte[] tempkey = thekey.getData();135             res = new String(temp,"utf-8");136             String res1 = new String(tempkey,"utf-8");137             if(res1.equals("12346"))138                 break;139             System.out.println("          Key " + res1 + " Value " + res);140         }141         System.out.println("   >======== Simple  getSearchKey End ========<");142         System.out.println();143         144         //多条件模糊查询,如果没有相应的机制只能自己编写来查了,145         //失败146         147         System.out.println("   >======== multiplication  Pattern Key=12345 Value = http://www.mamicode.com/123451 getSearchBothRange Start ========<");148         thedata.setData("123451".getBytes("utf-8"));149         thekey.setData(key.getBytes("utf-8"));150         status = cursor.getSearchBothRange(thekey, thedata, LockMode.DEFAULT);151         //首先会去匹配12345 123456152         if(status==OperationStatus.SUCCESS){153             temp = thedata.getData();  //154             res = new String(temp,"utf-8");155             System.out.println("          Key " + key + " Value " + res);156             while(cursor.getNext(thekey, thedata, LockMode.DEFAULT) != OperationStatus.NOTFOUND){        //结束条件是OperationStatus.NOTFOUND157                 temp = thedata.getData();158                 byte[] tempkey = thekey.getData();159                 res = new String(temp,"utf-8");160                 String res1 = new String(tempkey,"utf-8");161                 if(res1.equals("12346"))162                     break;163                 System.out.println("          Key " + res1 + " Value " + res);164             }165         }166         else167             System.out.println("   Not Such Record");168             169         170         System.out.println("   >======== multiplication  getSearchBothRange End ========<");171         System.out.println();172         cursor.close();173         CloseBDB();174         175     }176     177     //创建数据库178     public void OpenBDB(){179         EnvironmentConfig envConfig = new EnvironmentConfig();180         envConfig.setAllowCreate(true);181         dbEnvironment = new Environment( new File("D:/dbEnv"), envConfig );182          DatabaseConfig dbConfig = new DatabaseConfig();183 184          dbConfig.setAllowCreate(true);185          dbConfig.setSortedDuplicates(true);186          db = dbEnvironment.openDatabase(null,"BDB", dbConfig); 187          System.out.println("打开数据库成功");188     }189     //关闭数据库190     public void CloseBDB(){191         if(db != null){192             db.close();193         }194         if(dbEnvironment != null){195             dbEnvironment.close();196         }197     }198     199     200     //获取数据库中所有记录,201     public ArrayList<String> getEveryItem() throws UnsupportedEncodingException {202         Cursor cursor = null;203         OpenBDB();204         cursor= db.openCursor(null,null);205         DatabaseEntry theKey=null;206         DatabaseEntry theData=http://www.mamicode.com/null;    207         theKey = new DatabaseEntry();208         theData = http://www.mamicode.com/new DatabaseEntry();209         long total = 0;210         ArrayList<String> list = new ArrayList<String>(); 211         212         while (cursor.getNext(theKey, theData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {213             //System.out.println("Reading: Key: " + new String( theKey.getData()) + "Value: " + new String(theData.getData()));214             list.add(new String( theKey.getData()) );215             list.add(new String( theData.getData()) );216             total++;217         }218         cursor.close();219         System.out.println("total:" + total);220         return list;221          222     }223     224     //getSearchKey225     226     227 228         229     230     231     232 }

序列化创建学生信息

import java.io.File;import com.sleepycat.bind.EntryBinding;import com.sleepycat.bind.serial.SerialBinding;import com.sleepycat.bind.serial.StoredClassCatalog;import com.sleepycat.je.Cursor;import com.sleepycat.je.Database;import com.sleepycat.je.DatabaseConfig;import com.sleepycat.je.DatabaseEntry;import com.sleepycat.je.Environment;import com.sleepycat.je.EnvironmentConfig;import com.sleepycat.je.LockMode;import com.sleepycat.je.OperationStatus;public class SeriableDemo {    public static void main(String args[]){      Environment dbEnv = null;      Database db = null;      Cursor cursor=null;      try {                 EnvironmentConfig envconfig = new EnvironmentConfig();       envconfig.setAllowCreate(true);       dbEnv = new Environment(new File("D:/dbEnv/"),envconfig);              DatabaseConfig dbconfig = new DatabaseConfig();       dbconfig.setAllowCreate(true);       dbconfig.setReadOnly(false);       dbconfig.setSortedDuplicates(false);       //data       db = dbEnv.openDatabase(null, "Student_Data", dbconfig);       //class       Database myclassdb=dbEnv.openDatabase(null, "Student_class", dbconfig);       //cataglog存储类信息       StoredClassCatalog classCatalog =new StoredClassCatalog(myclassdb);            //创建绑定对象       EntryBinding dataBinging=new SerialBinding(classCatalog,Student.class);              DatabaseEntry thekey=new DatabaseEntry("1200340233".getBytes("utf-8"));       DatabaseEntry thedata=new DatabaseEntry();       Student st=new Student();              st.setStudentId(1200340233);       st.setStudentName("邹颖玖");       st.setStudentAge(20);       st.setStudentDept("计算机科学与工程");              //绑定数据       dataBinging.objectToEntry(st, thedata);       //插入       db.put(null, thekey, thedata);              DatabaseEntry data = new DatabaseEntry();       //DatabaseEntry key = new DatabaseEntry();       DatabaseEntry key = new DatabaseEntry("1200340233".getBytes("utf-8"));       Student st1 = new Student();       st1.setStudentId(1200340233);       dataBinging.objectToEntry(st1, data);       //获取       OperationStatus status=db.get(null, key, data, LockMode.DEFAULT);       if(status==OperationStatus.SUCCESS){        Student s=(Student) dataBinging.entryToObject(thedata);        System.out.println(s.getStudentId()+"   "+s.getStudentName()+"    "+        s.getStudentAge() + "   " + s.getStudentDept());       }             }catch(Exception e){          e.printStackTrace();      }    }}

上面代码用到学生类。

import java.io.Serializable;public class Student implements Serializable {        private long StudentId;    private String StudentName;    private int StudentAge;    private String StudentDept;        public long getStudentId() {        return StudentId;    }        public void setStudentId(long studentId) {        StudentId = studentId;    }        public String getStudentName() {        return StudentName;    }        public void setStudentName(String studentName) {        StudentName = studentName;    }        public int getStudentAge() {        return StudentAge;    }        public void setStudentAge(int studentAge) {        StudentAge = studentAge;    }        public String getStudentDept() {        return StudentDept;    }        public void setStudentDept(String studentDept) {        StudentDept = studentDept;    }    }

以上是老师将来项目需要,估计以后我也有这种需要。没有时间,还是想自己实践弄一套音乐推荐系统出来。

 

Berkeley DB