`
winzenghua
  • 浏览: 1326402 次
  • 性别: Icon_minigender_2
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

嵌入式内存数据库系统Berkeley DB

阅读更多

1.Berkeley DB支持几乎所有的现代操作系统,如LINUX、UNIX、WINDOWS等,也提供了丰富的应用程序接口,支持C、C++、JAVA、PERL、TCL、PYTHON、PHP等。

2.Berkeley DB for .net 0.95 版本是为.net2.0平台推出的,老外封装的,强。。。但是没有java版做的好。

3. Berkeley DB的设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API),调用本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。
第一:DB库和应用程序运行在同一个地址空间,没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;
第二:不需要对SQL代码解码,对数据的访问直截了当。

实际项目中非常适合快速本地文件存取。

4. DB数据访问算法

在数据库领域中,数据访问算法对应了数据在硬盘上的存储格式和操作方法。在编写应用程序时,选择合适的算法可能会在运算速度上提高1个甚至多个数量级。大多数数据库都选用B+树算法,DB也不例外,同时还支持HASH算法、Recno算法和Queue算法。接下来,我们将讨论这些算法的特点以及如何根据需要存储数据的特点进行选择。

B+树算法:B+树是一个平衡树,关键字有序存储,并且其结构能随数据的插入和删除进行动态调整。为了代码的简单,DB没有实现对关键字的前缀码压缩。B+树支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。

HASH算法:DB中实际使用的是扩展线性HASH算法(extended linear hashing),可以根据HASH表的增长进行适当的调整。关键字可以为任意的数据结构。

Recno算法: 要求每一个记录都有一个逻辑纪录号,逻辑纪录号由算法本身生成。实际上,这和关系型数据库中逻辑主键通常定义为int AUTO型是同一个概念。Recho建立在B+树算法之上,提供了一个存储有序数据的接口。记录的长度可以为定长或不定长。

Queue算法:和Recno方式接近, 只不过记录的长度为定长。数据以定长记录方式存储在队列中,插入操作把记录插入到队列的尾部,相比之下插入速度是最快的。

对算法的选择首先要看关键字的类型,如果为复杂类型,则只能选择B+树或HASH算法,如果关键字为逻辑记录号,则应该选择Recno或Queue算法。当工作集关键字有序时,B+树算法比较合适;如果工作集比较大且基本上关键字为随机分布时,选择HASH算法。Queue算法只能存储定长的记录,在高的并发处理情况下,Queue算法效率较高;如果是其它情况,则选择Recno算法,Recno算法把数据存储为平面文件格式。

(摘自 施聪 《嵌入式数据库系统Berkeley DB》)

5. .net平台序列化问题

.NET 内置的二进制序列化引擎
--System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 相对于BdbFormatter, .NET 内置的二进制序列化引擎有如下弱点:
1) 空间利用不充分,没必要为每条记录都存储元数据 meta-data
2) 速度慢,运行时才发现序列化类型
3) 不能部分反序列化
4) 没必要支持昂贵时间段数字类型排序
BDB 需要将对象转换成 byte[] 才能存储,定义的字段序列化转换类型XField,通过其构造方法注册到 BdbFormatter 引擎。

/// <summary>
/// 定义的字段序列化转换类型PeopleField,通过其构造方法注册到 BdbFormatter 引擎
/// Author:EKING
/// </summary>
/// <param name="dbf"></param>
private void useBDBFormatter(DbFile dbf)
{
People p = new People();
p.Name = "Tom";
p.Age = 23;

BdbFormatter formatter = new BdbFormatter(3, 2048);
new PeopleField(formatter, true);

// Put
DbEntry key = formatter.ToDbEntry<string>(p.Name);
DbEntry data = formatter.ToDbEntry<People>(p);
dbf.Put(null, ref key, ref data);

dbf.Sync();

// Get
data = DbEntry.Out(new byte[2048]);
dbf.Get(null, ref key, ref data, DbFile.ReadFlags.None);

People p2 = new People();
formatter.FromDbEntry<People>(ref p2, ref data);
MessageBox.Show( string.Format("{0},{1}", p2.Name, p2.Age));

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics