Berkeley DB使用SecondKey给数据排序的实现方法
2014-08-25 09:13
357 查看
Berkeley DB使用SecondKey给数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法。它的官方示例和文档比较丰富,感觉比较 容易学习。在开发过程中出现了一个需求,要把数据根据插入时间遍历,个人认为通过第二主键(SecondKey)比较容易实现。
以下是我的基本实现过程:
1.在ValueBean中加入insertTime属性
public class ValueBean{
private String insertTime;
private String hostName;
private byte[] value;
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public String getInsertTime() {
return insertTime;
}
public void setInsertTime(String insertTime) {
this.insertTime = insertTime;
}
public byte[] getValue() {
return value;
}
public void setValue(byte[] value) {
this.value = value;
}
}
其中的hostName属性在主从同步和生成插入时间时用到,value属性就是key-value中的值
2.TupleBinding类
public class ValueBeanBinding extends TupleBinding<ValueBean> {
@Override
public ValueBean entryToObject(TupleInput input) {
String time = input.readString();
String name = input.readString();
byte[] value = new byte[input.getBufferLength()-input.getBufferOffset()];//获得value长度
input.read(value);
ValueBean data = new ValueBean();
data.setInsertTime(time);
data.setHostName(name);
data.setValue(value);
return data;
}
@Override
public void objectToEntry(ValueBean object, TupleOutput output) {
ValueBean value = object;
output.writeString(value.getInsertTime());
output.writeString(value.getHostName());
output.write(value.getValue());
}
}
此类用于将ValueBean和DatabaseEntry进行转换,两个方法中的属性读写顺序要统一。
3.SecondaryKeyCreator,第二主键生成器
public class SecondKeyCreator implements SecondaryKeyCreator{
private TupleBinding<ValueBean> theBinding;
SecondKeyCreator(TupleBinding<ValueBean> theBinding) {
this.theBinding = theBinding;
}
@Override
public boolean createSecondaryKey(SecondaryDatabase secondary,
DatabaseEntry key, DatabaseEntry data, DatabaseEntry result) {
ValueBean v =
(ValueBean) theBinding.entryToObject(data);
String time=v.getInsertTime();
result.setData(time.getBytes());
return true;
}
}
指定insertTime属性作为第二主键。
在插入一个新数据时生成insertTime十分关键,尤其在高并发和互为主从同步时极易出现“第二主键重复”的错误,造成数据无法插入,我了使用 当前时间毫秒数+AtomicInteger自增+hostName的asc码之和,保证insertTime的前后大小顺序。
System.currentTimeMillis()*1000000+(add_num.getAndIncrement()%1000)*1000 + host_key
4.创建第二数据库,用于存储secondkey
SecondaryConfig mySecConfig = new SecondaryConfig();
mySecConfig.setAllowCreate(true);
mySecConfig.setSortedDuplicates(false);
TupleBinding<ValueBean> tb =new ValueBeanBinding();
SecondKeyCreator keyCreator = new SecondKeyCreator(tb);
mySecConfig.setKeyCreator(keyCreator);
mySecConfig.setTransactional(envConfig.getTransactional());
String secDbName = "mySecondaryDatabase";
mySecDb = myEnv.openSecondaryDatabase(null, secDbName, storeDb, mySecConfig);
到此,便可以使用SecondaryCursor的getNext()和getPrev()前后遍历了,getSearchKey()可以找到你想要的位置。
关于Berkeley DB使用SecondKey给数据排序的实现方法的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!
以下是我的基本实现过程:
1.在ValueBean中加入insertTime属性
public class ValueBean{
private String insertTime;
private String hostName;
private byte[] value;
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public String getInsertTime() {
return insertTime;
}
public void setInsertTime(String insertTime) {
this.insertTime = insertTime;
}
public byte[] getValue() {
return value;
}
public void setValue(byte[] value) {
this.value = value;
}
}
其中的hostName属性在主从同步和生成插入时间时用到,value属性就是key-value中的值
2.TupleBinding类
public class ValueBeanBinding extends TupleBinding<ValueBean> {
@Override
public ValueBean entryToObject(TupleInput input) {
String time = input.readString();
String name = input.readString();
byte[] value = new byte[input.getBufferLength()-input.getBufferOffset()];//获得value长度
input.read(value);
ValueBean data = new ValueBean();
data.setInsertTime(time);
data.setHostName(name);
data.setValue(value);
return data;
}
@Override
public void objectToEntry(ValueBean object, TupleOutput output) {
ValueBean value = object;
output.writeString(value.getInsertTime());
output.writeString(value.getHostName());
output.write(value.getValue());
}
}
此类用于将ValueBean和DatabaseEntry进行转换,两个方法中的属性读写顺序要统一。
3.SecondaryKeyCreator,第二主键生成器
public class SecondKeyCreator implements SecondaryKeyCreator{
private TupleBinding<ValueBean> theBinding;
SecondKeyCreator(TupleBinding<ValueBean> theBinding) {
this.theBinding = theBinding;
}
@Override
public boolean createSecondaryKey(SecondaryDatabase secondary,
DatabaseEntry key, DatabaseEntry data, DatabaseEntry result) {
ValueBean v =
(ValueBean) theBinding.entryToObject(data);
String time=v.getInsertTime();
result.setData(time.getBytes());
return true;
}
}
指定insertTime属性作为第二主键。
在插入一个新数据时生成insertTime十分关键,尤其在高并发和互为主从同步时极易出现“第二主键重复”的错误,造成数据无法插入,我了使用 当前时间毫秒数+AtomicInteger自增+hostName的asc码之和,保证insertTime的前后大小顺序。
System.currentTimeMillis()*1000000+(add_num.getAndIncrement()%1000)*1000 + host_key
4.创建第二数据库,用于存储secondkey
SecondaryConfig mySecConfig = new SecondaryConfig();
mySecConfig.setAllowCreate(true);
mySecConfig.setSortedDuplicates(false);
TupleBinding<ValueBean> tb =new ValueBeanBinding();
SecondKeyCreator keyCreator = new SecondKeyCreator(tb);
mySecConfig.setKeyCreator(keyCreator);
mySecConfig.setTransactional(envConfig.getTransactional());
String secDbName = "mySecondaryDatabase";
mySecDb = myEnv.openSecondaryDatabase(null, secDbName, storeDb, mySecConfig);
到此,便可以使用SecondaryCursor的getNext()和getPrev()前后遍历了,getSearchKey()可以找到你想要的位置。
关于Berkeley DB使用SecondKey给数据排序的实现方法的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!
相关文章推荐
- Berkeley DB 使用SecondKey给数据排序
- jQuery实现使用sort方法对json数据排序的方法
- C#中使用GDI+实现饼状图和柱状图跟数据库联接显示数据的方法
- 使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。
- 使用Dojo实现页面不刷新提交数据时避免前台缓存的方法
- 使用navicat 8实现创建数据库和导入数据 管理用户与权限[图文方法]
- 在Ajax中使用Flash实现跨域数据读取的实现方法
- 使用sort()方法实现数组排序
- 使用asp.net递归的方法来实现treeview的数据绑定
- WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
- jQuery的ajax()检验用户名;通过jQuery的load()/get()/post()方法实现;使用XMLHTTPRequest对象来进行AJAX的异步数据交互
- *引-使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法。
- WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
- 【EntityFramework系列教程三,翻译】在ASP.NET MVC程序中使用EntityFramework对数据进行排序、过滤筛选以及实现分页
- 使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法
- C#中使用GDI+实现饼状图和柱状图跟数据库联接显示数据的方法
- C# 对排序的认识( Comparison ) ,使用匿名方法实现比较器
- PB中实现数据窗口动态排序的三种方法
- 往TreeSet中存入自定义对象,并且使用自定义排序方法(实现comparetor)