`
mengyang
  • 浏览: 266117 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

BerkeleyDB-JE 使用BaseAPI(七)

    博客分类:
  • BDB
 
阅读更多
   本篇开始介绍二级数据库(Secondary Databases)的使用。

   通常情况下,我们根据key值来查找JE中的记录,但是key值不一定会包含你所要想要查询的值,比如JE中有个用户库,你使用一个唯一的没有什么意义的ID作为key值,而data值是一个复杂的java对象,它封装了用户名,性别,生日,年龄等信息,如果你想查找某个具有某个名字的用户记录,那么你可能要遍历整个数据库。这时候JE还提供了一个选择,就是使用Secondary Databases。

   在这里Secondary Databases可以使你创建一个基于用户名的索引,这样你就可以使用这个索引进行查询。在JE中,包含了你想要的数据的数据库叫做主数据库(Primary Database),而包含了可选的key集合的用于访问Primary database中数据的数据库称为二级数据库(Secondary Databases)。

   一旦你打开了一个Secondary Databases,JE会为你管理其中的数据。当你添加或者删除Primary Database中记录的时候,JE会自动对Secondary Databases中的数据作出必要的修改;当你修改了Primary Database中的记录,并且这个修改会导致Secondary Databases中的key发生变化的时候,JE也会调整Secondary Databases。

   一定要注意一点,你不能直接对Secondary Databases中的数据进行操作,虽然其中存在这样的API,但是如果你调用了这些API,则会报出异常。唯一的例外是你可以删除Secondary Databases中的数据。

   当你从Secondary Databases中获取记录值的时候,实际上返回的是对应在Primary Database中的记录。

   下面开始讲解如何打开和关闭Secondary Databases,有5个步骤:
   1.打开Primary Database
   2.实例化SecondaryKeyCreator对象
   3.实例化SecondaryConfig对象
   4.为SecondaryConfig设置SecondaryKeyCreator对象
   5.用Primary Database和SecondaryConfig打开Secondary Databases

   相比打开普通的Database,要打开Secondary Database,这里最大的区别就在于多了个SecondaryKeyCreator对象。这个对象是用来创建你想要的索引的。你能使用任何数据来创建key,一般情况下,你会使用Primary Database中的data值来创建这个key,当然你也可以使用Primary Database的key值。

   为此,你要实现SecondaryKeyCreator接口,这个接口要求你实现SecondaryKeyCreator.createSecondaryKey() 方法。有一点要注意的是,你要抽取的key值是来自于保存于Primary Database中的记录,而在JE中,一条记录键和值都是DatabaseEntry类型的,而且在这个方法中你要生成的key最终也要表现成DatabaseEntry形式,所以你可能需要依赖于Binding API,比如在你使用复杂对象的时候。这个方法的返回值是一个boolean,如果返回false,则说明不存在二级键,这就意味着Primary Database不会填充数据到Secondary Databases中,如果该Secondary Databases有记录,则会被删除。

下面演示下这个过程:
首先假设,我们有个数据库,名叫myPrimaryDatabase,里面存储的记录值是PersonData类型数据,key值是String,同时还有了个自定义的Binding:TupleBinding
public class FullNameKeyCreator implements SecondaryKeyCreator {
 
    private TupleBinding theBinding;
    public FullNameKeyCreator(TupleBinding theBinding1) {
            theBinding = theBinding1;
    }
    public boolean createSecondaryKey(SecondaryDatabase secDb,
                                      DatabaseEntry keyEntry, 
                                      DatabaseEntry dataEntry,
                                      DatabaseEntry resultEntry) {
        try {
            PersonData pd = (PersonData) theBinding.entryToObject(dataEntry);
            String fullName = pd.getFamiliarName() + " " + pd.getSurname();
            resultEntry.setData(fullName.getBytes("UTF-8"));
        } catch (IOException willNeverOccur) {}
        return true;
    }
}

然后我们这样打开和关闭Secondary Datab
DatabaseConfig myDbConfig = new DatabaseConfig();
SecondaryConfig mySecConfig = new SecondaryConfig();
myDbConfig.setAllowCreate(true);
mySecConfig.setAllowCreate(true);
mySecConfig.setSortedDuplicates(true);
Environment myEnv = null;
Database myDb = null;
SecondaryDatabase mySecDb = null;
try {
    String dbName = "myPrimaryDatabase";
    myEnv = new Environment(new File("/tmp/JEENV"), null);
    myDb = myEnv.openDatabase(null, dbName, myDbConfig);
    TupleBinding myTupleBinding = new MyTupleBinding();

    FullNameKeyCreator keyCreator = 
        new FullNameKeyCreator(myTupleBinding);
    mySecConfig.setKeyCreator(keyCreator);
    String secDbName = "mySecondaryDatabase";
    mySecDb = myEnv.openSecondaryDatabase(null, secDbName, myDb, 
                                          mySecConfig); 
} catch (DatabaseException de) {

}finally {
    //close的顺序要注意下
    try {
        if (mySecDb != null) {
            mySecDb.close();
        }
        if (myDb != null) {
            myDb.close();         
        }
        if (myEnv != null) {
            myEnv.close();
        }
    } catch (DatabaseException dbe) {

    }
}

   SecondaryConfig是DatabaseConfig的子类,你可以像设置DatabaseConfig一样设置它。这里有一个属性说明下:
   SecondaryConfig.setAllowPopulate():设置为Secondary Databases是否可以自动填充。是指当Secondary Databases为空的时候,在Primary Databases只读的时候,Secondary Databases中的记录会被自动的添加或修改。(This means that on open, if the secondary database is empty then the primary database is read in its entirety and additions/modifications to the secondary's records occur automatically.)
1
4
分享到:
评论

相关推荐

    BerkeleyDB-JE je-6.0.11

    Oracle BerkeleyDB-JE je-6.0.11

    BerkeleyDB-Core-C-GSG.pdf

    本手册是为初学者及有一定经验的开发者设计的,旨在提供一个全面、系统的指南来帮助读者理解 Berkeley DB 的基本概念、数据库管理、记录操作、游标使用以及二级数据库的实现等方面的知识。此外,手册还详细介绍了...

    Berkeley DB JE-7.0.6

    **Berkeley DB JE 7.0.6:深入理解分布式数据存储** Berkeley DB JE(Java Edition)是Oracle公司提供的一款开源、嵌入式、基于Java的键值对数据库系统。它以其轻量级、高性能和高可用性而受到广泛的青睐,尤其适合...

    Java-Edition-BerkeleyDB-3.1.0.zip_BerkeleyDB

    在Je-3.1.0版本中,BerkeleyDB使用特定的数据库文件格式,这些文件可以在不同平台上进行迁移,确保了跨平台的兼容性。 **7. 性能优化** BerkeleyDB提供了多种性能调优选项,如缓存大小设置、日志文件管理等,...

    BerkeleyDB-Core-Cxx-GSG.rar

    **Berkeley DB (BDB)** 是一款开源的、嵌入式数据库系统,由...通过详读并实践“BerkeleyDB-Core-Cxx-GSG.pdf”中的内容,开发者将能够熟练地在C++项目中集成和使用Berkeley DB,从而实现高效、可靠的数据存储和管理。

    BerkeleyDB-Core-Cxx-GSG.rar_Berkeley DB_berkeley Db cxx

    在C++接口方面,Berkeley DB提供了丰富的类库供开发者使用。例如,`Db`类用于表示数据库对象,`DbEnv`类用于管理数据库环境,而`Dbt`类则用于存储和检索数据库中的数据项。通过这些类,开发者可以方便地进行数据库的...

    db-4.7.25-master_db-4.7.25-master_berkeleydbvxworks_BerkeleyDB_源

    Berkeley DB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯、SQL解析等步骤,本文件是早期版本

    BerkeleyDB-0.26

    - 在并发处理方面,Sqlite 使用行级锁定,而 BerkeleyDB 使用多版本并发控制,对于高并发环境,BerkeleyDB 可能表现更好。 总的来说,BerkeleyDB 和 Sqlite 都是优秀的嵌入式数据库解决方案,选择哪一个取决于具体...

    BerkeleyDB-Core-JAVA-GSG.pdf

    根据提供的文档信息,“BerkeleyDB-Core-JAVA-GSG.pdf”主要介绍了如何在Java环境中使用Berkeley DB。该文档强调了Berkeley DB作为一种文件类型数据库的优势,包括快速的存取速度和方便的操作特性。 #### 二、...

    BerkeleyDB-0.27

    **BerkeleyDB** 是一款强大的、高度可定制的嵌入式数据库系统,广泛应用于各种软件开发,尤其是在需要高效存储和检索数据的场景中。这款数据库系统由Oracle公司开发,最初在1990年由Sleepycat Software推出,因其...

    Berkeley DB -- Access Method Configuration_iyangjian200599

    (二) Berkeley DB -- Access Method Configuration_iyangjian2005997_新浪博客.mht

    Berkeley DB4.8以上各版本

    3. **空间效率**:Berkeley DB通常关注内存和磁盘空间的使用效率,4.8版本可能进一步降低了存储开销,从而在资源有限的环境中更高效。 4. **错误处理和恢复**:为了提高系统的健壮性,4.8版本可能增强了错误检测和...

    Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht

    Berkeley DB -- 入门知识和一个小例子_iyangjian2005997_新浪博客.mht

    BerkeleyDB Manual C/C++

    《BerkeleyDB Manual C/C++》是一份详尽的官方文档,主要针对使用C和C++语言进行数据库操作的开发者。BerkeleyDB是一款轻量级、高性能的关系型数据库管理系统,常用于嵌入式系统和分布式应用程序。这篇手册将深入...

    berkeley db db-6.1.26.tar.gz

    db-6.1.26.tar.gz berkeley db

    Berkeley DB Java Edition (JE)

    Berkeley DB Java Edition (JE) 官方7.5.11下载版本。 相关介绍 https://blog.csdn.net/hadues/article/details/80854288

    BerkeleyDB_java_jar包

    2. **Java API**:一组接口和类,如`Database`、`DatabaseEntry`和`Transaction`,使得开发者可以使用Java代码与BerkeleyDB进行交互。 3. **示例和文档**:可能包含演示如何使用BerkeleyDB Java API的示例代码,以及...

    Berkeley DB C++编程入门教

    标题“Berkeley DB C++编程入门教程”意味着文档旨在引导读者通过C++语言了解和使用Berkeley DB。这种数据库提供了一个简洁的API,使得开发者可以快速地存储和检索数据,无需复杂的数据库配置或管理。 在描述中提到...

    BerkerleyDb-18.1.40.tar.gz

    3. **使用BerkeleyDB**:Scrapy-Deltafetch会利用BerkeleyDB的API,将抓取到的URL和数据存储为键值对,便于后续判断新旧和更新内容。 通过以上内容,我们了解了BerkeleyDB的核心特性和安装过程,以及它在Scrapy-...

Global site tag (gtag.js) - Google Analytics