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

BerkeleyDB-JE 使用BaseAPI(八)

    博客分类:
  • BDB
 
阅读更多
   本篇继续介绍Secondary Databases,主要介绍如何使用Secondary Databases。

   一.读记录
   从Secondary Databases中读取数据跟一般数据库中读取数据没啥两样,最大的区别在于返回的key和data是来自于Primary Database中的。例如下面的例子使用上面一篇创建的Secondary Data,根据名字来查询用户信息。
try {
    String searchName = "John Doe";
    DatabaseEntry searchKey = 
        new DatabaseEntry(searchName.getBytes("UTF-8"));
    DatabaseEntry primaryKey = new DatabaseEntry();
    DatabaseEntry primaryData = new DatabaseEntry();
    OperationStatus retVal = mySecondaryDatabase.get(null, searchKey, 
                                                     primaryKey, 
                                                     primaryData, 
                                                   LockMode.DEFAULT); 
} catch (Exception e) {
    
}

   跟Database.get()方法一样,如果数据库支持重复记录,你只能获取到重复记录集的第一条记录,要想遍历所有的记录,你必须使用SecondaryCursor。

   二.删除记录
   一般情况下,你不能直接对Secondary Databases进行修改操作。如果你想修改Secondary Databases,你应该修改Primary Database,并且设置允许JE为你管理Secondary Databases。
   但是你可以直接删除Secondary Databases中的记录,这会导致Primary Database中的相应记录被删除掉,而反过来,跟这条记录对应的Secondary Databases中的所有记录信息也会被删除掉。
   这以上讨论的一切,必须是基于Primary Database是可写的。
try {
    String searchName = "John Doe";
    DatabaseEntry searchKey = new DatabaseEntry(searchName.getBytes("UTF-8"));
    OperationStatus retVal = mySecondaryDatabase.delete(null, searchKey);
} catch (Exception e) {

}

如果数据库支持重复记录,SecondaryDatabase.delete()方法只能删除重复集中的第一条记录,要想删除全部记录,你必须使用游标。

   三.使用游标(Secondary Cursors)

   在Secondary Databases使用游标跟你在普通的数据库中使用游标基本上是一样的,你可以使用游标遍历重复记录集。主要的不同有两个:
   1.游标返回的值是对应的存在于Primary Database中的记录值
   2.SecondaryCursor.getSearchBoth() 方法将不是根据键和值来查询,而是匹配secondary key和primary key。
try {
    DatabaseEntry secondaryKey = 
        new DatabaseEntry(secondaryName.getBytes("UTF-8"));
    DatabaseEntry foundData = new DatabaseEntry();
    SecondaryCursor mySecCursor = 
        mySecondaryDatabase.openSecondaryCursor(null, null);
    OperationStatus retVal = mySecCursor.getSearchKey(secondaryKey, 
                                                      foundData, 
                                                    LockMode.DEFAULT);
    while (retVal == OperationStatus.SUCCESS) {
        mySecCursor.delete();
        retVal = mySecCursor.getNextDup(secondaryKey, 
                                        foundData, 
                                        LockMode.DEFAULT);
    } 
} catch (Exception e) {

}


   四.数据库连接
   如果你有多个secondary databases关联到一个primary database,你可以使用join cursor来进行关联查询。实际上,就是给你了提供一种可以一次联合查询多个条件的机制。
    比如说我们有一个关于用户的Primary Database有两个关联的Secondary Databases,分别是关联了性别,年龄,这时候我们想查询的是所有20岁的女性的用户信息,我们就可以使用连接来查询,步骤如下:
1.打开多个二级游标,这些游标必须从关联同一个Primary Datsbase的Secondary Database中获得。
2.定位每个游标到你想查询的位置。
3.创建一个二级游标数组,把之前创建的游标放到这个数组中去。
4.使用Database.join()得到一个连接的游标(join cursor),你要把上一步创建的游标数组传递给这个方法。
5.现在可以操作连接游标了,比如使用JoinCursor.getNext()方法可以访问下个值。
6.关闭连接游标。
7.关闭所有的二级游标。
String theSex = "female";
String theAge = "20";

SecondaryCursor sexSecCursor = null;
SecondaryCursor ageSecCursor = null;

JoinCursor joinCursor = null;
DatabaseEntry foundKey = new DatabaseEntry();
DatabaseEntry foundData = new DatabaseEntry();
try {
    DatabaseEntry sex = new DatabaseEntry(theSex.getBytes("UTF-8"));
    DatabaseEntry age = new DatabaseEntry(theAge.getBytes("UTF-8"));

    sexSecCursor = sexDB.openSecondaryCursor(null, null); 
    ageSecCursor = ageDB.openSecondaryCursor(null, null); 

    OperationStatus sexRet = 
        sexSecCursor.getSearchKey(sex, foundData, LockMode.DEFAULT);
    OperationStatus ageRet = 
        ageSecCursor.getSearchKey(age, foundData, LockMode.DEFAULT);

    if (sexRet == OperationStatus.SUCCESS &&
        ageRet == OperationStatus.SUCCESS ) {

        SecondaryCursor[] cursorArray = {sexSecCursor, ageSecCursor};

        joinCursor = personDB.join(cursorArray, null);
        while (joinCursor.getNext(foundKey, foundData, LockMode.DEFAULT) ==
                        OperationStatus.SUCCESS) {
            ...
        }
    }
} catch (DatabaseException dbe) {

} catch (Exception e) {

} finally {
    try {
        if (sexSecCursor != null) {
            sexSecCursor.close();
        }
        if (ageSecCursor != null) {
            ageSecCursor.close();
        }
        if (joinCursor != null) {
            joinCursor.close();
        }
    } catch (DatabaseException dbe) {

    }
}

最后,你还能为JoinCursor设置一个属性:
JoinConfig.setNoSort():指定游标的自动排序是否被禁止。默认情况下,游标会按关联最少的数据量的开始一直到关联对多数据量的。(The cursors are sorted from
the one that refers to the least number of data items to the one that refers to the most.)
JoinConfig config = new JoinConfig();
config.setNoSort(true);
JoinCursor joinCursor = myDb.join(cursorArray, config);
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