词条 | dbstl |
释义 | dbstl 是 Berkeley DB数据库的一种新的 API,自Berkeley DB 4.8.24 发布版本开始,出现在Berkeley DB的发布版本当中。它在各个方面都非常类似 C++ STL 类库,这样,用户使用 Berkeley DB就可以像使用 STL类库的容器一样,大大降低了Berkeley DB的使用难度。 背景Berkeley DB是一个业界文明的嵌入式数据库,在非常多的开源和商业软件当中广泛应用。要想使用Berkeley DB,必须用编程的方式调用它的API来控制数据库的行为,来插入/删除/更新/查找。在dbstl出现之前已有的API包括 C/C++/Java以及各类脚本语言如perl/python/php 的API。其中C++ API 是对C API 的简单封装,并没有有效利用C++语言的强大功能降低API的编程复杂性。而dbstl正是为了使得用户更加容易的用C++语言对Berkeley DB编程而设计的,可以把它看作是对Berkeley DB C++ API的有力补充。由于 STL 类库是C++语言的标准库, C++程序员都对它非常熟悉。有了dbstl后,C++程序员的stl编程知识可以直接拿来使用dbstl对Berkeley DB编程,降低了Berkeley DB的学习曲线。 用例1. 需要存储的数据量太大,直接存入内存数据结构,比如stl当中的话,机器性能大幅下降,甚至遇到分配内存失败而无法继续运行等问题; 2. 需要事务语义(ACID). C++ STL 无法提供这样的功能; 3. 需要完全的容器对象隔离性。当今大多数 STL实现无法提供容器对象级别的互斥,需要用户使用mutex来显式实现对多线程共享的容器对象的互斥保护。 4. 需要持久化对象。将对象通过dbstl存储到Berkeley DB数据库当中,就可以很好地实现对象持久化和激活。 结构与兼容性 dbstl包括几乎所有的stl容器类,在stl当中的 std名字空间下面的 vector, map, multimap, set, multiset以及它们的iterator 类模板 在dbstl当中都有它们对应的容器类,分别是 db_vector, db_map, db_multimap, db_set, db_multiset,以及它们的iterator类模板,这些类模板都在 dbstl名字空间下。与stl中的对应的类模板相比,dbstl当中这些类模板包含了完全相同的公有函数成员集合和语义/行为/用法,因而,一个原本使用stl的c++程序,只要在容器类模板名称前缀 ‘db_’,即可使用dbstl来操控 Berkeley DB数据库,把数据存储在数据库当中而不是内存数据结构当中, 这样的改动几乎就是移植到dbstl的全部所需的改动。 所以本文不再赘述dbstl的用法,除了stl与dbstl的不同之处以外。 用户可以使用C++ STL 类库当中的算法来通过dbstl中的标准的iterator概念实现来操纵dbstl当中的容器类,因而dbstl没有算法集合,只有容器类模板以及它们的iterator类模板。 dbstl类库完全通过了两个广泛使用的 C++ STL 实现的测试集当中的所有测试(微软的测试集和stlport的测试集),由此可见dbstl与c++ stl类库有高度的兼容性。 stl与dbstl的用法的区别这样的区别主要体现在如下几个方面。 首先,dbstl的类模板的模板参数列表与stl的有一些不同。比如stl的容器类都有一个 Allocator参数,使得用户配置一个分配器类型,而dbstl不需要自己处理存储细节,它把数据存入了Berkeley DB数据库,所以它没有Allocator类型参数。还有就是在很多stl类模板当中,需要配置比较类型,也就是定制比较的方法,在dbstl当中,这种定制是通过配置比较函数给Berkeley DB来完成的。使用dbstl的时候,通常还会用到 Berkeley DB的 C++ API,来完成数据库配置等数据存储/检索之外的任务。dbstl与原来的C++ API一起组成了一个功能更加强大的,更容易使用的新的 C++ API for Berkeley DB. 其次,dbstl是让用户持久化数据的,因而通常没有意义存储内存指针值,用户需要写一些额外的代码来保证存储的数据在下次加载后是有效的。dbstl提供了一些辅助手段帮助用户非常轻松地完成这个任务。 最后,dbstl的容器类有一些方法是特定的针对Berkeley DB的,在C++ STL类库当中没有对应的方法。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。