Berkeley DB使用SecondKey给数据排序的实现方法
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给数据排序的实现方法的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!
Berkeley DB使用SecondKey给数据排序的实现方法的更多相关文章
- 送你一个Python 数据排序的好方法
摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法.最常见的数据分析是使用电子表格.SQL或pandas 完成的.使用 Pandas 的一大优点是它可以处理大量数据 ...
- Berkeley DB基础教程
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- Berkeley DB基础教程 分类: H3_NUTCH 2014-05-29 15:21 2212人阅读 评论(0) 收藏
一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...
- 新浪研发中心: Berkeley DB 使用经验总结
http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...
- Berkeley DB 使用经验总结
作者:陈磊 NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列.最近使用BDB来发 ...
- 一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子
一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子 最近,由于云计算的发展,数据库技术也从结构式数据库发展到NoSQL数据库,存储模式从结构化的关系存储到现在如火如荼的key/val ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- Berkeley DB分布式探索
明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley ...
- Berkeley DB Java Edition 简介
一. 简介 Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据. l 能够高效率的 ...
随机推荐
- Spring中注解大全和应用
@Controller@RestController:@Service@Autowired@RequestMapping@RequestParam@ModelAttribute@Cacheable@C ...
- Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑
django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...
- WIFI共享大师无法开启发射功能
1.打开服务(ctrl+R)输入services.msc 2.将关于wifi的服务打开 这里有windows移动热点服务和WLAN开头的服务
- Python9-IO模型-day41
# 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...
- 3 View - 状态保持 session
1.状态保持 http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包 ...
- 网络流24题:P2762 太空飞行计划问题
P2762 太空飞行计划问题 题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,E ...
- 开源中国app说什么 旁边的那个图标是什么drawable
妈的,那就只是一个 ActionBarDrawerToggle: 配合侧滑菜单而生的而已.
- Go语言之并发编程(四)
同步 Go 程序可以使用通道进行多个 goroutine 间的数据交换,但这仅仅是数据同步中的一种方法.通道内部的实现依然使用了各种锁,因此优雅代码的代价是性能.在某些轻量级的场合,原子访问(atom ...
- loj2091 「ZJOI2016」小星星
ref 总的来说,就是 容斥转化为点对应到点集问题. 树形 dp 解决转化后的问题. #include <iostream> #include <cstring> #inclu ...
- Java资料整理
Java资料整理 原创 2017年08月25日 17:20:44 14211 1.LocalThread的应用场景,数据传输适合用LocalThread么 2.linux的基本命令 软链接.更 ...