BerkeleyDB-JE 使用BaseAPI(一)

本篇开始介绍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进行配置。
[list]
[*]DatabaseConfig.setAllowCreate()
设置当不存在该数据库的时候是否创建一个新的库
[*]DatabaseConfig.setBtreeComparator()
设置用来决定数据库中记录顺序的排序器
[*]DatabaseConfig.setDuplicateComparator()
设置用来比较重复数据的排序器
[*]DatabaseConfig.setSortedDuplicates()
设置该数据库是否允许重复的数据
[*]DatabaseConfig.setExclusiveCreate()
设置当存在该数据库的时候是否会打开数据库失败
[*]DatabaseConfig.setReadOnly()
设置数据库是否只读
[*]DatabaseConfig.setTransactional()
设置事务属性
[*]DatabaseConfig.setDeferredWrite()
设置延迟写属性
[*]DatabaseConfig.setTemporary()
设置该数据库是否为临时数据库(Temporary Databases)
[/list]
设置这些数据库的属性非常简单,只要实例化一个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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章