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对比程序
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList; 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 Query {
private Environment dbEnvironment = null;
private Database db = null; private void DataConstruct(int t) throws UnsupportedEncodingException {
int Total = t;
long BDBTime = 0;
long start = System.currentTimeMillis();
/*
*
*/
OpenBDB();
while(Total!=0)
{ int k = Total;
int v = Total+1;
DatabaseEntry iKey = new DatabaseEntry(Integer.valueOf(k).toString().getBytes("UTF-8"));
DatabaseEntry iValue = new DatabaseEntry(Integer.valueOf(v).toString().getBytes("UTF-8")); //System.out.println("Writing : Key= " + k + " Value = " + v + " count: " + Total); db.put(null, iKey, iValue);
Total--;
}
long end = System.currentTimeMillis();
BDBTime = end - start;
System.out.println(BDBTime); } //各种查询比较 public void QueryCompare(int t) throws UnsupportedEncodingException{ DataConstruct(t);
//OpenBDB(); Cursor cursor = null;
cursor = db.openCursor(null, null); DatabaseEntry thekey = new DatabaseEntry();
String key = "12345";
thekey.setData(key.getBytes("utf-8")); DatabaseEntry thedata = new DatabaseEntry(); System.out.println(" >======== getSearchKey Start ========<");
cursor.getSearchKey(thekey, thedata, LockMode.DEFAULT);
byte[] temp = thedata.getData();
String res = new String(temp,"utf-8");
System.out.println(" Key " + key + " Value " + res);
System.out.println(" >======== getSearchKey End ========<");
System.out.println(); System.out.println(" >======== getSearchKeyRange Start ========<");
cursor.getSearchKeyRange(thekey, thedata, LockMode.DEFAULT);
temp = thedata.getData();
res = new String(temp,"utf-8");
System.out.println(" Key " + key + " Value " + res);
System.out.println(" >======== getSearchKeyRange End ========<");
System.out.println(); //如果要执行这个查询最后不用随机数,用随机数相查到结果不易
System.out.println(" >======== getSearchBoth Start ========<");
thedata.setData("12346".getBytes("utf-8"));
OperationStatus status = cursor.getSearchBoth(thekey, thedata, LockMode.DEFAULT);
if(status == OperationStatus.SUCCESS){
temp = thedata.getData();
res = new String(temp,"utf-8");
System.out.println(" Key " + key + " Value " + res);
}
else
System.out.println(" Not Such Record"); System.out.println(" >======== getSearchKeyBoth End ========<");
System.out.println(); System.out.println(" >======== getSearchBothRange Start ========<");
thedata.setData("123451".getBytes("utf-8"));
status = cursor.getSearchBoth(thekey, thedata, LockMode.DEFAULT);
if(status == OperationStatus.SUCCESS){
temp = thedata.getData();
res = new String(temp,"utf-8");
System.out.println(" Key " + key + " Value " + res);
}
else
System.out.println(" Not Such Record");
System.out.println(" RecordCount: " + cursor.count()); System.out.println(" >======== getSearchKeyBothRange End ========<");
System.out.println(); /*
* getSearchKeyRange和getSearchKey都是将游标定位到匹配key值相同的地方,如果再用Cursor.getNext无论如何都是能得到游标下一个。区别是当用到B树的时候
* 根据getSearchKeyRange和getSearchKey和Cursor.getNext的输出结果的规律可以看出,BDB内部存储采用树形结构,类似字符数
* getSearchBoth同时匹配Key和Value才有结果,才能返回OperationStatus.SUCCESS才算操作成功
*
*/
/*
* 实现模糊查询,用getSearchKey配合getNext即可
*
*/
//单条件模糊查询测试代码,匹配12345,结束应该是12346 System.out.println(" >======== Simple Pattern key = 12345 getSearchKey Start ========<");
thedata = new DatabaseEntry();//单条件查询,把之前的thedata设置为空
cursor.getSearchKeyRange(thekey, thedata, LockMode.DEFAULT);
temp = thedata.getData(); //
res = new String(temp,"utf-8");
System.out.println(" Key " + key + " Value " + res);
thekey = new DatabaseEntry();
while(cursor.getNext(thekey, thedata, LockMode.DEFAULT) != OperationStatus.NOTFOUND){ //结束条件是OperationStatus.NOTFOUND
temp = thedata.getData();
byte[] tempkey = thekey.getData();
res = new String(temp,"utf-8");
String res1 = new String(tempkey,"utf-8");
if(res1.equals("12346"))
break;
System.out.println(" Key " + res1 + " Value " + res);
}
System.out.println(" >======== Simple getSearchKey End ========<");
System.out.println(); //多条件模糊查询,如果没有相应的机制只能自己编写来查了,
//失败 System.out.println(" >======== multiplication Pattern Key=12345 Value = 123451 getSearchBothRange Start ========<");
thedata.setData("123451".getBytes("utf-8"));
thekey.setData(key.getBytes("utf-8"));
status = cursor.getSearchBothRange(thekey, thedata, LockMode.DEFAULT);
//首先会去匹配12345 123456
if(status==OperationStatus.SUCCESS){
temp = thedata.getData(); //
res = new String(temp,"utf-8");
System.out.println(" Key " + key + " Value " + res);
while(cursor.getNext(thekey, thedata, LockMode.DEFAULT) != OperationStatus.NOTFOUND){ //结束条件是OperationStatus.NOTFOUND
temp = thedata.getData();
byte[] tempkey = thekey.getData();
res = new String(temp,"utf-8");
String res1 = new String(tempkey,"utf-8");
if(res1.equals("12346"))
break;
System.out.println(" Key " + res1 + " Value " + res);
}
}
else
System.out.println(" Not Such Record"); System.out.println(" >======== multiplication getSearchBothRange End ========<");
System.out.println();
cursor.close();
CloseBDB(); } //创建数据库
public void OpenBDB(){
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
dbEnvironment = new Environment( new File("D:/dbEnv"), envConfig );
DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setAllowCreate(true);
dbConfig.setSortedDuplicates(true);
db = dbEnvironment.openDatabase(null,"BDB", dbConfig);
System.out.println("打开数据库成功");
}
//关闭数据库
public void CloseBDB(){
if(db != null){
db.close();
}
if(dbEnvironment != null){
dbEnvironment.close();
}
} //获取数据库中所有记录,
public ArrayList<String> getEveryItem() throws UnsupportedEncodingException {
Cursor cursor = null;
OpenBDB();
cursor= db.openCursor(null,null);
DatabaseEntry theKey=null;
DatabaseEntry theData=null;
theKey = new DatabaseEntry();
theData = new DatabaseEntry();
long total = 0;
ArrayList<String> list = new ArrayList<String>(); while (cursor.getNext(theKey, theData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
//System.out.println("Reading: Key: " + new String( theKey.getData()) + "Value: " + new String(theData.getData()));
list.add(new String( theKey.getData()) );
list.add(new String( theData.getData()) );
total++;
}
cursor.close();
System.out.println("total:" + total);
return list; } //getSearchKey }
序列化创建学生信息
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("".getBytes("utf-8"));
DatabaseEntry thedata=new DatabaseEntry();
Student st=new Student(); st.setStudentId();
st.setStudentName("邹颖玖");
st.setStudentAge();
st.setStudentDept("计算机科学与工程"); //绑定数据
dataBinging.objectToEntry(st, thedata);
//插入
db.put(null, thekey, thedata); DatabaseEntry data = new DatabaseEntry();
//DatabaseEntry key = new DatabaseEntry();
DatabaseEntry key = new DatabaseEntry("".getBytes("utf-8"));
Student st1 = new Student();
st1.setStudentId();
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的更多相关文章
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- 比Redis更快:Berkeley DB面面观
比Redis更快:Berkeley DB面面观 Redis很火,最近大家用的多.从两年前开始,Memcached转向Redis逐渐成为潮流:而Berkeley DB可能很多朋友还很陌生,首先,我们简单 ...
- Berkeley DB分布式探索
明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley ...
- Berkeley DB数据处理
设计一个结构,利用Berkeley DB完成大数据的存储,备份,查询功能. 已有的储备: 1.Berkeley DB的基本操作. 2.数据转存后数据不丢失. 3.过百GB以上数据的存储. 数据流如下, ...
- BDB (Berkeley DB)数据库简单介绍(转载)
近期要使用DBD,于是搜了下相关的资料,先贴个科普性的吧: 转自http://www.javaeye.com/topic/202990 DB综述DB最初开发的目的是以新的HASH訪问算法来取代旧的hs ...
- Oracle Berkeley DB Java 版
Oracle Berkeley DB Java 版是一个开源的.可嵌入的事务存储引擎,是完全用 Java 编写的.它充分利用 Java 环境来简化开发和部署.Oracle Berkeley DB Ja ...
- 新浪研发中心: Berkeley DB 使用经验总结
http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...
- Berkeley DB基础教程
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- 「JAVA」:Berkeley DB的JAVA连接
Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...
随机推荐
- PHP7安装问题解决
ext/standard/info.o: In function `php_info_print_request_uri’: /root/php-5.4.16/ext/standard/info.c: ...
- python 操作word文档
因为工作需要操作一些word文档,记录一下学习思路 #-*- encoding: utf8 -*- import win32com from win32com.client import Dispat ...
- Windows 之 删除保存的共享凭据(用户名和密码)
当我们在访问Windows共享文件夹或者NAS网络共享盘的时候,Windows会提示输入访问共享所需要的用户名和密码,如果我们勾选了“记住我的凭据”,Windows 就会将认证凭据保存到计算机中,以方 ...
- 2dx关于js响应layer触摸消息的bug
cocos2dx关于js响应layer触摸消息的bug cocos2d-x 3.7 问题描述: 目前这个版本中(3.7),c++层的layer触摸消息只能通过消息的方式发送给js,不能像lua一样直接 ...
- 【Android 界面效果25】android中include标签的使用
在一个项目中我们可能会需要用到相同的布局设计,如果都写在一个xml文件中,代码显得很冗余,并且可读性也很差,所以我们可以把相同布局的代码单独写成一个模块,然后用到的时候可以通过<include ...
- Sphinx 全文检索
什么是全文检索: 全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术.检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容. 简介: Sphinx是由俄罗斯人And ...
- ReactNative学习-滑动查看图片第三方组件react-native-swiper
滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...
- HTML5移动开发中的meta与link
meta HTML5移动开发中的一些webkit专属头部标签,能够帮助浏览器更好的解析HTML代码,从而为HTML5移动开发提供更好的前端表现与体验 viewport网页缩放 1 <meta n ...
- 六.CSS浮动与清除
浮动 把元素从常规文档流中取出.是元素脱离常规文档流 浮动的作用: ①实现文本绕排图片效果 ②让原本在上下方向上堆叠的块级元素可以变成左右并列,从而实现多栏布局 文本绕排图片 首先HTML代码如下 & ...
- 每天一道LeetCode--389. Find the Difference
Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...