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

BerkeleyDB-JE 使用BaseAPI(一)

    博客分类:
  • BDB
阅读更多
本篇开始介绍JE的具体使用。
在JE中,一个数据库(database)就是一系列键值对的集合。你可以把JE中的数据库理解为只有两个列的表,一个列是键,一个列是值。同时要注意的是,键和值可以是简单的数据类型,比如数字型或字符串型,也可能是复杂的对象类型。我们可以使用database来管理键和值,比如对它们的增删改操作。
下面演示打开和关闭database。
Environment myDbEnvironment = null;   
Database database = null; 
try {   
    EnvironmentConfig envConfig = new EnvironmentConfig();   
    envConfig.setAllowCreate(true);   
    myDbEnvironment = new Environment(new File("/export/dbEnv"),    
                                      envConfig);   
    DatabaseConfig dbConfig = new DatabaseConfig();   
    dbConfig.setAllowCreate(true);   
    database = env.openDatabase(null, "baseAPIDemo", dbConfig); 

    ...
    // do work
    ...
} catch (DatabaseException dbe) {   
    // Exception handling goes here   
} finally{   
    database.close();   
    myDbEnvironment.close();   
} 

通常我们使用Environment来打开一个database,在打开的时候要指定这个database的名字。先打开Environment,再用这个Environment打开一个database,然后在所有事情做完后,要记得关闭database和Environment,先关闭database,再关闭Environment。

接着我们讨论下database的属性配置
跟Environment一样,database也可以通过DatabaseConfig进行配置。
  • DatabaseConfig.setAllowCreate()
  • 设置当不存在该数据库的时候是否创建一个新的库
  • DatabaseConfig.setBtreeComparator()
  • 设置用来决定数据库中记录顺序的排序器
  • DatabaseConfig.setDuplicateComparator()
  • 设置用来比较重复数据的排序器
  • DatabaseConfig.setSortedDuplicates()
  • 设置该数据库是否允许重复的数据
  • DatabaseConfig.setExclusiveCreate()
  • 设置当存在该数据库的时候是否会打开数据库失败
  • DatabaseConfig.setReadOnly()
  • 设置数据库是否只读
  • DatabaseConfig.setTransactional()
  • 设置事务属性
  • DatabaseConfig.setDeferredWrite()
  • 设置延迟写属性
  • DatabaseConfig.setTemporary()
  • 设置该数据库是否为临时数据库(Temporary Databases)

设置这些数据库的属性非常简单,只要实例化一个DatabaseConfig对象,然后设置它,并在打开数据库的时候传入就可以了。以下演示下database属性设置
DatabaseConfig dbConfig = new DatabaseConfig();   
dbConfig.setAllowCreate(true);   
dbConfig.setReadOnly(false); 
dbConfig.setTransactional(false); 
database = env.openDatabase(null, "baseAPIDemo", dbConfig);

以上关于排序器和重复数据的讨论我们将放到后续章节中进行。我们现在重点讨论两个属性:
[list]
  • 延迟写数据库(Deferred Write Databases)
  • 默认情况下,数据库会在操作的时候写入变化到磁盘中,如果你使用了事务,那么将会在事务提交的时候写入变化。但是如果你启用了延迟写配置,数据库不会把变化立即写入,除非1.显式的调用了Database.sync()方法;2.缓存满了;3.到达了检查点(checkpoint)。
    延迟写可以带来以下两个好处:
    1.在多线程情况下,可以减少写操作的瓶颈。
    2.可以减少写操作数据库,比如你一条记录你多次修改了它,那只会最后一次的改变会被写入到数据库中。
    数据库也可以在延迟写和普通库之间进行转换,比如你要加载很大量的数据到数据库中,明显的延迟写数据库相较于普通数据库有更好的性能,这时你可以在加载大数据的时候设置延迟写,在加载完毕之后一次性的写入到数据库中。然后关闭数据库,再使用普通数据库配置属性打开。
    设置DatabaseConfig.setDeferredWrite(true),可以让数据库变成延迟写数据库。
    DatabaseConfig dbConfig = new DatabaseConfig();
    // Make it deferred write
    dbConfig.setDeferredWrite(true);
    myDatabase = myDbEnvironment.openDatabase(null, 
                                                  "sampleDatabase", 
                                                  dbConfig); 
    ...
    // do work
    ...
    
    myDatabase.sync();
    
  • 临时数据库(Temporary Databases)
  • 这是一个很特殊的数据库,打开临时数据库后,你可以像一般的数据库一样对它进行操作,但是在关闭这个数据库后所有的数据将被清除。也就是说临时数据库中的数据不是持久性的。
    并且临时数据库内部采用了延迟写,但是这并不意味着临时数据库将不会发生I/O操作,当缓存满的时候,数据库仍然会把数据写入到磁盘上。临时数据库拥有延迟写数据库的所有优点,但是有一点不同于延迟写数据库,它不会在到达检查点的时候进行写入。
    设置DatabaseConfig.setTemporary(true),可以让数据库变成延迟写数据库。
    DatabaseConfig dbConfig = new DatabaseConfig();
    dbConfig.setTemporary(true);
    myDatabase = myDbEnvironment.openDatabase(null, 
                                                  "sampleDatabase", 
                                                  dbConfig); 
    

    [/list]
    0
    0
    分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics