• Berkeley DB使用SecondKey给数据排序的实现方法


    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<ValueBeantb =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给数据排序的实现方法的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

  • 相关阅读:
    任意用户密码重置漏洞
    0基础入门学习Python(第4章)
    dpwwn:2 Vulnhub Walkthrough
    The Library:2 Vulnhub Walkthrough
    WestWild: 1.1: Vulnhub Walkthorugh
    Canvas---折线图---绘制网格
    Canvas---绘制一个由黑到白渐变的矩形
    Canvas---绘制虚线
    Canvas---和线相关的属性和方法
    Canvas---绘制一个镂空正方形
  • 原文地址:https://www.cnblogs.com/zheh/p/3934238.html
Copyright © 2020-2023  润新知