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. (转)为什么在 2013 十月番中出现了很多以 3D 渲染代替传统 2D 绘画来表现人物的镜头?

    一直都有的,特别是三次元这家公司一直致力于3d的风格化渲染既大家说的3d转2d.目前最厉害的商业化软件是pencil+,占领大部分的作品.而mentalray,早期用于disney的部分风格化渲染:i ...

  2. 微信小程序 input组件type属性3个值的作用

    input组件是小程序的内容输入框组件,通常是这样来使用的: <input type="text" placeholder="输入点内容吧" /> ...

  3. A1046 Shortest Distance (20)(20 分)

    1046 Shortest Distance (20)(20 分)提问 The task is really simple: given N exits on a highway which form ...

  4. mysql双机热备实现

    说明 机器A:(172.16.1.251),机器B:(172.16.1.252) 两台机器都创建数据库web:create database hello default charset utf8; 实 ...

  5. HDU - 5017 Ellipsoid(模拟退火)

    题意 给一个三维椭球面,求球面上距离原点最近的点.输出这个距离. 题解 模拟退火. 把\(z = f(x, y)\)函数写出来,这样通过随机抖动\(x\)和\(y\)坐标就能求出\(z\). 代码 / ...

  6. 动态规划:HDU1176-免费馅饼

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. CSS需要注意的问题1(转生活因拼搏而精彩的网易博客)

      1.检查HTML元素(如:<ul>.<div>).属性(如:class=”")是否有拼写错误.是否忘记结束标记(如:<br />) 因为Xhtml 语 ...

  8. sedgewick增量序列的希尔排序

    #include<bits/stdc++.h> using namespace std; int s[3]={1,5,19}; void shellsort(int *a,int n){ ...

  9. cakephp 中Console / Shell 有什么优点?

    Which is the advantage of using CakePHP Console / Shell for programmed tasks ? 查看原文 最近用到了cakephp中的sh ...

  10. Monkey官方帮助翻译&介绍

    都说想学好就看原文,英文不好为了翻译这个可费了大劲了.表格从GOOGLE官网复制到WORD里编辑,结果贴上来格式全乱了,只得不弄表格了.表格中官网的事件不是最新的,比最新的少2个,具体我会另发一篇文章 ...