Berkeley DB使用SecondKey数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法。它的官方示例和文档比较丰富,感觉比较 容易学习。在开发过程中出现了一个需求,要把数据根据插入时间遍历,个人认为通过第二主键(SecondKey)比较容易实现。

以下是我的基本实现过程:

1.在ValueBean中加入insertTime属性

  1. public class ValueBean{
  2. private String insertTime;
  3. private String hostName;
  4. private byte[] value;
  5. public String getHostName() {
  6. return hostName;
  7. }
  8. public void setHostName(String hostName) {
  9. this.hostName = hostName;
  10. }
  11. public String getInsertTime() {
  12. return insertTime;
  13. }
  14. public void setInsertTime(String insertTime) {
  15. this.insertTime = insertTime;
  16. }
  17. public byte[] getValue() {
  18. return value;
  19. }
  20. public void setValue(byte[] value) {
  21. this.value = value;
  22. }
  23. }

其中的hostName属性在主从同步和生成插入时间时用到,value属性就是key-value中的值

2.TupleBinding类

  1. public class ValueBeanBinding extends TupleBinding<ValueBean> {
  2. @Override
  3. public ValueBean entryToObject(TupleInput input) {
  4. String time = input.readString();
  5. String name = input.readString();
  6. byte[] value = new byte[input.getBufferLength()-input.getBufferOffset()];//获得value长度
  7. input.read(value);
  8. ValueBean data = new ValueBean();
  9. data.setInsertTime(time);
  10. data.setHostName(name);
  11. data.setValue(value);
  12. return data;
  13. }
  14. @Override
  15. public void objectToEntry(ValueBean object, TupleOutput output) {
  16. ValueBean value = object;
  17. output.writeString(value.getInsertTime());
  18. output.writeString(value.getHostName());
  19. output.write(value.getValue());
  20. }
  21. }

此类用于将ValueBean和DatabaseEntry进行转换,两个方法中的属性读写顺序要统一。

3.SecondaryKeyCreator,第二主键生成器

  1. public class SecondKeyCreator implements SecondaryKeyCreator{
  2. private TupleBinding<ValueBean> theBinding;
  3. SecondKeyCreator(TupleBinding<ValueBean> theBinding) {
  4. this.theBinding = theBinding;
  5. }
  6. @Override
  7. public boolean createSecondaryKey(SecondaryDatabase secondary,
  8. DatabaseEntry key, DatabaseEntry data, DatabaseEntry result) {
  9. ValueBean v =
  10. (ValueBean) theBinding.entryToObject(data);
  11. String time=v.getInsertTime();
  12. result.setData(time.getBytes());
  13. return true;
  14. }
  15. }

指定insertTime属性作为第二主键。

在插入一个新数据时生成insertTime十分关键,尤其在高并发和互为主从同步时极易出现“第二主键重复”的错误,造成数据无法插入,我了使用 当前时间毫秒数+AtomicInteger自增+hostName的asc码之和,保证insertTime的前后大小顺序。

System.currentTimeMillis()*1000000+(add_num.getAndIncrement()%1000)*1000 + host_key

4.创建第二数据库,用于存储secondkey

  1. SecondaryConfig mySecConfig = new SecondaryConfig();
  2. mySecConfig.setAllowCreate(true);
  3. mySecConfig.setSortedDuplicates(false);
  4. TupleBinding<ValueBean> tb =new ValueBeanBinding();
  5. SecondKeyCreator  keyCreator = new  SecondKeyCreator(tb);
  6. mySecConfig.setKeyCreator(keyCreator);
  7. mySecConfig.setTransactional(envConfig.getTransactional());
  8. String secDbName = "mySecondaryDatabase";
  9. mySecDb = myEnv.openSecondaryDatabase(null, secDbName,  storeDb, mySecConfig);

到此,便可以使用SecondaryCursor的getNext()和getPrev()前后遍历了,getSearchKey()可以找到你想要的位置。

关于Berkeley DB使用SecondKey给数据排序的实现方法的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

Berkeley DB使用SecondKey给数据排序的实现方法的更多相关文章

  1. 送你一个Python 数据排序的好方法

    摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法.最常见的数据分析是使用电子表格.SQL或pandas 完成的.使用 Pandas 的一大优点是它可以处理大量数据 ...

  2. Berkeley DB基础教程

    一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...

  3. Berkeley DB基础教程 分类: H3_NUTCH 2014-05-29 15:21 2212人阅读 评论(0) 收藏

    一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2 ...

  4. 新浪研发中心: Berkeley DB 使用经验总结

    http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...

  5. Berkeley DB 使用经验总结

    作者:陈磊 NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列.最近使用BDB来发 ...

  6. 一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子

    一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子 最近,由于云计算的发展,数据库技术也从结构式数据库发展到NoSQL数据库,存储模式从结构化的关系存储到现在如火如荼的key/val ...

  7. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  8. Berkeley DB分布式探索

    明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley ...

  9. Berkeley DB Java Edition 简介

    一.             简介        Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据. l         能够高效率的 ...

随机推荐

  1. oracle一些常用的数据类型

    字符数据类型 char数据类型 当需要固定长度时,使用char数据类型,此数据类型长度可以使1-2000字节.若是不指定大小默认占1字节,如果长度有空余时会以空格进行填充,如果大于设定长度 数据库则会 ...

  2. 【解决】ERROR in xxx.js from UglifyJs

    当我们运行打包脚本npm run build或者打包iosweexpack build ios有可能会遇到以下报错 ERROR in index.js from UglifyJs ![](https: ...

  3. 07.VUE学习之解决phpstorm不识别ECMASCRIPT6语法的问题

    此时已经识别:

  4. CyclicBarrier源码分析

    CyclicBarrier是通过ReentrantLock(独占锁)和Condition来实现的.下面,我们分析CyclicBarrier中3个核心函数: 构造函数, await()作出分析. 1. ...

  5. 《鸟哥的Linux私房菜》学习笔记(4)——用户和组

    一.用户和组的基本概念                                              1.用户 用户:用于获取计算机资源或服务的标识符,比如用户名.计算机处理的是UID,用 ...

  6. setTimeout相关整理

    setTimeout里面函数有无双引号的区别 双引号中的作用域不捕捉局部变量,不用双引号包着的是捕捉局部作用域 var a = function(){ alert(1111) } function a ...

  7. Django基于Pycharm开发之三[命名空间 与过滤器]

    关于命名空间的问题,在project项目中,我们可以设置路由类似于: from django.conf.urls import url,includefrom django.contrib impor ...

  8. 创建 PSO

    TechNet 库 Windows Server Windows Server 2008 R2 und Windows Server 2008 浏览 Windows Server 技术 Active ...

  9. Effictive C++ 学习记录

    这是前段时间看的书,整理到这里吧,以后查看也方便. 这些条款需要反复查看. 条款01:视C++为一个语言联邦 条款02:尽量用const.enum.inline替换#define 条款03:尽可能的使 ...

  10. 11 JVM 垃圾回收(上)

    引用计数法和可达性分析 垃圾回收,就是将已经分配出去的,但却不在使用的内存回收回来,以便再次分配.在 Java 虚拟机语境下,垃圾指的是死亡的对象所占据的堆空间.下面就总结一下如何如何辨别一个对象是否 ...