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. 三十二、MySQL 导出数据

    MySQL 导出数据 MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件上. 使用 SELECT ... INTO OUTFILE 语句导出数据 以下实例中 ...

  2. phpspider案例

    phpspider案例 <?php require './autoload.php'; use phpspider\core\phpspider; /* Do NOT delete this c ...

  3. 【JavaScript】修改图片src属性切换图片

    今天做项目时其中一个环节需要用到js修改图片src属性切换图片,现在来记录一下 以下是示例: html <img src="/before.jpg" id="img ...

  4. myeclipse10.5 crack(2012-12-27-bd 写的日志迁移

    首先去网上下一个破解文件如图: 解压过后打开的文件夹如图: 再打开crack文件夹如图: 运行run.bat如果点击它没反应就是你没有安装jdk,它如果运行就如图所示: 到这一步就在第一个方框user ...

  5. python3 练习题100例 (八)

    题目八:暂停一秒输出,并格式化当前时间. #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 题目八:暂停一秒输出,并格 ...

  6. Python中的bytes

    bytes_lst = [ ('创建bytes',), ('bytes可哈希',), ('编码与解码',), ('常见编码类型',), ('ord() 与 chr()',), ] 创建bytes &g ...

  7. Cyclic Nacklace HDU - 3746 (kmp)

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. Java的多态性Polymorphism

    原文地址:http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继 ...

  9. this.$router 和this.$route 的区别

    1. this.$router: 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(), go()等方法: 2. thi ...

  10. loj2058 「TJOI / HEOI2016」求和

    推柿子 第二类斯特林数的容斥表达 fft卡精度就用ntt吧qwq. #include <iostream> #include <cstdio> using namespace ...