-
Berkeley DB学习笔记2
2007-07-12 | Tag:无题
BerkeleyDB中,数据库相当于关系数据库中的表,且每个表只有两列:key和data。需要有程序员自己将数据封装入data中,key相当于主键,用于区分不同的记录。通常使用结构或类对数据进行封装,将2列表变成n列表,其中n-1列封装在结构中。
使用DBAPI时,一般是与特定的数据结构交互。数据结构中保存函数指针,称为句柄(handle)。操作流程一般是获得数据库句柄,对其调用get、put函数进行操作。向DB中put数据时,一般根据key排序,如果DB中已存在待插入的key,则用新的data替换已有data,除非DB支持重复key。
除了使用句柄,可以使用游标(cursor)遍历数据库,包括正向、逆向、随机查询记录。另外,当数据库支持重复key时,句柄只能获得相同key的第一条记录,只有游标可以遍历重复key记录。
DB提供一种特殊的数据库称为二级数据库(secondarydatabase),通常意义的数据库称为主数据库(primarydatabase)。原理类似于倒排索引,用于支持按照data进行检索。
DB的存储模式包括BTree、Hash、Queue、recno。BTree和Hash允许key、data均为结构,而另两个只能用int作为key,Queue在尾部插入,头部取出,支持记录级别的加锁。
environment
environment是对一个或多个数据库的封装,因为空间的限制,在嵌入式数据库中很少用,但其他应用一般都会用到,使用DB时,先打开environment,再在该environment下打开数据库。
environment提供单个数据库不提供的优势:
1、多数据库文件:在一个物理文件中包含多个数据库,则必须使用environment
2、多线程多进程支持
3、事务处理
4、replication支持
5、日志子系统,用于数据库恢复
异常处理:抛出DbException,并且操作不成功都返回非零数值。返回零意味着操作成功。#include
...
try
{
// DB and other code goes here
}
catch(DbException &e)
{
// DB error handling goeshere
}
catch(std::exception &e)
{
// All other error handling goes here
}
数据库的打开与关闭
#include
...
Db db(NULL,0); // Instantiate the Db object
u_int32_t oFlags = DB_CREATE; // Open flags;
try {
// Open thedatabase
db.open(NULL, //事务指针
"my_db.db", //数据库文件名
NULL, //可选数据库逻辑名称
DB_BTREE, //存取模式
oFlags, //打开标志位
0); //文件模式(默认)
//DbException is not subclassed from std::exception, so
// need tocatch both of these.
}catch(DbException &e)
{
// Errorhandling code goes here
}catch(std::exception &e)
{
// Errorhandling code goes here
}
收藏到:Del.icio.us
引用地址:








评论