首页 > 代码库 > 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