版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Berkeley DB数据库C语言入门教程12版本1 LibraryVersion TOC o 1-4 h u HYPERLINK l _Toc20638 序言 PAGEREF _Toc20638 4 HYPERLINK l _Toc30402 关于本手册 PAGEREF _Toc30402 9 HYPERLINK l _Toc8105 第一章 Berkeley DB概念 PAGEREF _Toc8105 10 HYPERLINK l _Toc16942 访问方式 PAGEREF _Toc16942 13 HYPERLINK l _Toc30049 如何选择访问方式 PAGEREF _Toc3
2、0049 14 HYPERLINK l _Toc29745 在BTree和Hash之间选择 PAGEREF _Toc29745 15 HYPERLINK l _Toc13433 在Queue和Recno之间选择 PAGEREF _Toc13433 16 HYPERLINK l _Toc27567 数据库的限制与可移植性 PAGEREF _Toc27567 17 HYPERLINK l _Toc4944 环境 PAGEREF _Toc4944 18 HYPERLINK l _Toc21584 错误返回信息 PAGEREF _Toc21584 19 HYPERLINK l _Toc19095 获取
3、和使用DB PAGEREF _Toc19095 20 HYPERLINK l _Toc22818 第二章 数据库 PAGEREF _Toc22818 21 HYPERLINK l _Toc16850 打开数据库 PAGEREF _Toc16850 21 HYPERLINK l _Toc20859 前期编译准备 PAGEREF _Toc20859 21 HYPERLINK l _Toc28993 新建项目 PAGEREF _Toc28993 23 HYPERLINK l _Toc25053 项目源代码 PAGEREF _Toc25053 25 HYPERLINK l _Toc11189 关闭数据
4、库 PAGEREF _Toc11189 28 HYPERLINK l _Toc6361 数据库打开标志 PAGEREF _Toc6361 29 HYPERLINK l _Toc22615 管理用的方法 PAGEREF _Toc22615 29 HYPERLINK l _Toc4178 报错函数 PAGEREF _Toc4178 30 HYPERLINK l _Toc9074 在环境中管理数据库 PAGEREF _Toc9074 32 HYPERLINK l _Toc7564 数据库例子 PAGEREF _Toc7564 33 HYPERLINK l _Toc9917 Gettingstarte
5、d_common.h PAGEREF _Toc9917 34 HYPERLINK l _Toc12003 Gettingstarted_common.c PAGEREF _Toc12003 35 HYPERLINK l _Toc19635 第三章数据库记录 PAGEREF _Toc19635 40 HYPERLINK l _Toc11306 使用数据库记录 PAGEREF _Toc11306 40 HYPERLINK l _Toc4097 读写数据库记录 PAGEREF _Toc4097 42 HYPERLINK l _Toc5880 存入记录 PAGEREF _Toc5880 43 HYPE
6、RLINK l _Toc32530 获取记录 PAGEREF _Toc32530 44 HYPERLINK l _Toc21105 删除记录 PAGEREF _Toc21105 45 HYPERLINK l _Toc27965 数据持久性 PAGEREF _Toc27965 46 HYPERLINK l _Toc30287 使用C结构体 PAGEREF _Toc30287 47 HYPERLINK l _Toc17956 使用指针的C结构体 PAGEREF _Toc17956 49 HYPERLINK l _Toc28470 数据库使用例子 PAGEREF _Toc28470 51 HYPER
7、LINK l _Toc23871 Example_database_load.c文件 PAGEREF _Toc23871 52 HYPERLINK l _Toc32404 第四章 使用游标 PAGEREF _Toc32404 59 HYPERLINK l _Toc8886 打开和关闭游标 PAGEREF _Toc8886 59 HYPERLINK l _Toc32415 使用游标获取记录 PAGEREF _Toc32415 60 HYPERLINK l _Toc12264 搜索记录 PAGEREF _Toc12264 61 HYPERLINK l _Toc13106 操作冗余记录集 PAGER
8、EF _Toc13106 64 HYPERLINK l _Toc29014 使用游标存储数据 PAGEREF _Toc29014 66 HYPERLINK l _Toc30354 使用游标删除记录 PAGEREF _Toc30354 69 HYPERLINK l _Toc8402 使用游标覆盖记录 PAGEREF _Toc8402 69 HYPERLINK l _Toc18792 游标例子 PAGEREF _Toc18792 71 HYPERLINK l _Toc6678 第五章 备用库(索引库) PAGEREF _Toc6678 78 HYPERLINK l _Toc18285 打开和关闭备
9、用库(索引库) PAGEREF _Toc18285 80 HYPERLINK l _Toc9525 索引库提取关键词 PAGEREF _Toc9525 81 HYPERLINK l _Toc20127 使用多个key PAGEREF _Toc20127 83 HYPERLINK l _Toc28044 从索引库中读取 PAGEREF _Toc28044 85 HYPERLINK l _Toc21752 删除索引记录 PAGEREF _Toc21752 86 HYPERLINK l _Toc20748 在索引库中使用游标 PAGEREF _Toc20748 88 HYPERLINK l _Toc
10、2299 数据库连接 PAGEREF _Toc2299 89 HYPERLINK l _Toc21277 使用Join Cursors PAGEREF _Toc21277 89 HYPERLINK l _Toc31640 索引库的例子 PAGEREF _Toc31640 92 HYPERLINK l _Toc6003 第六章 数据库配置 PAGEREF _Toc6003 92 HYPERLINK l _Toc17968 设置页面大小 PAGEREF _Toc17968 93 HYPERLINK l _Toc11388 Overflow Pages(溢出页) PAGEREF _Toc11388
11、93 HYPERLINK l _Toc30149 Locking(锁定) PAGEREF _Toc30149 94 HYPERLINK l _Toc27220 I/O效率 PAGEREF _Toc27220 95 HYPERLINK l _Toc3223 定义页大小的建议 PAGEREF _Toc3223 96 HYPERLINK l _Toc4717 选择缓冲大小 PAGEREF _Toc4717 96 HYPERLINK l _Toc13757 BTree配置 PAGEREF _Toc13757 97 HYPERLINK l _Toc32066 允许冗余记录集 PAGEREF _Toc32
12、066 97 HYPERLINK l _Toc25217 排序冗余记录 PAGEREF _Toc25217 97 HYPERLINK l _Toc20175 非排序的冗余记录 PAGEREF _Toc20175 98 HYPERLINK l _Toc1914 设置比较提取的回调函数 PAGEREF _Toc1914 98 HYPERLINK l _Toc12197 附录1:Linux下设置lib信息 PAGEREF _Toc12197 99 HYPERLINK l _Toc8139 附录2:Linux下一个完整的例子 PAGEREF _Toc8139 100 HYPERLINK l _Toc1
13、4297 操作系统安装 PAGEREF _Toc14297 100 HYPERLINK l _Toc3810 安装Berkeley DB PAGEREF _Toc3810 101 HYPERLINK l _Toc25112 设置操作系统环境 PAGEREF _Toc25112 102 HYPERLINK l _Toc32178 修改初始化文件 PAGEREF _Toc32178 102 HYPERLINK l _Toc20644 设置链接库路径 PAGEREF _Toc20644 102 HYPERLINK l _Toc30271 写程序 PAGEREF _Toc30271 102 HYPER
14、LINK l _Toc15119 编译程序 PAGEREF _Toc15119 104序言这个文章是我参考Oracle网站的官方英文版Oracle Berkeley DB Getting Starged with Berkeley DB for C 12c Release 1文件进行的翻译描述。我个人是希望通过翻译这个资料,把我们学习Barkeley DB所需要的技术做一个完整的梳理,完成这个文档后,希望能够把安装和编译BerkeleyDB所需的技术做一个相对完整的描述。能为大家今后学习做一个铺垫。实验室 段吉民 2014-7-11欢迎来到Berkeley DB的世界,这篇文档对Berkele
15、y DB12c第一版进行介绍,提供的数据库版本是 。 本文作为介绍DB API的设置与使用的快速入门手册,目标是提供一个快速有效地机制,能让你进入Berkeley DB研发的世界。在本文中侧重于C语言的研发人员,以及研究进城内数据管理解决方案的资深架构师。研究本文无需特定的Berkeley DB的基础或者前提。(不过最起码的C语言基础和数据库知识,还是需要的。)首先介绍的是排版格式与内容描述,一般会用加粗字体表示函数名称。例如:DB-open() 就是一个函数名称,或者变量名称。对于变量,或者一些定义类的,用斜体字表示,例如 DB_INSTALL 目录名称对于展现的源代码信息,一般使用特殊背景
16、色表示,例如:/*File: gettingstarted_common.h*/Typedef struct stock_dbs DB *inventory_dbp; /*Database containing inventory information*/DB *vendor_dbp; /*Database containing vendor information */Char *db_home_dir; /*Directory containing the database files */Char *inventory_db_name ;Char *vendor_db_name;STO
17、CK_DBS;获取更多信息,可以参考以下资料:Getting Started with Transaction Processing for CBerkeley DB Getting Started with Replicated Applications for CBerkeley DB C API Reference GuideBerkeley DB C+ API Reference GuideBerkeley DB STL API Reference GuideBerkeley DB TCL API Reference GuideBerkeley DB Installation and
18、Build GuideBerkeley DB Upgrade GuideBerkeley DB Getting Started with the SQL APIs以上书籍的英文版可以在网上下载。后期会根据实际需求,逐步翻译完成这些书籍的。第一章 简介Berkeley DB欢迎来到Berkeley DB(简称DB)。DB是一个通用的嵌入式数据库引擎。能够提供海量数据管理服务。它从萌芽设计开始,就是为了应对嵌入进程的高吞吐量应用,高可用性数据管理(bullet-proof -防弹的 mission critical 关键业务)。DB能够从容应对从少数字节处理到TB级数据的业务。在绝大多数情况下,对
19、DB唯一的限制是你的硬件资源。你可以通过编程操作DB提供的API完成一系列的数据库操作,包括读、写数据,管理多个数据库,执行高级的数据操作活动(例如事物处理Transactions)。由于DB是一个嵌入式的数据库引擎,它是极为高速快捷的。(可以做实时数据库,效率绝非现在我们使用的大多数臃肿的关系型数据库可比。-译者注)可以做为第三方的代码库或者直接编译到你的应用软件里面。这意味着数据库将与你的应用程序在相同的内存空间中运行。与使用独立运行的数据库服务器相比,DB为你节省大量的交互操作开销。(想象一下你的程序调用各种接口(包括ADO,ODBC,JDBC等层层包装),然后再通过拥塞的网络发送请求,
20、服务器接收请求再反向编译成可执行的代码,再提交服务器进程解析,后面一系列的操作直到最后把数据再通过网络返回来,重新通过接口返回到你的应用程序内存。-译者注)如果还嫌不够快,还有更快的,可以直接把DB放在内存中。通过把经常使用的数据放入内存的方法,一次性设置,后面会自动处理该数据库的缓冲,它的操作无需牵扯程序员太大的精力。除了高速度,DB也提供极为便捷的可配置性(这里的可配置性,是指数据存储的方式,并非指数据库的编译方式-译者注)。它提供了不同的数据组织方式,命名为“Access Methods”(访问方式)。DB对于不同存储特性的数据结构,提供了不同的访问方式(截止12C版本,提供四种,BTr
21、ee,Hash,Queue,Recno),程序员可以根据数据的不同组织方式,为每个数据库选择其适合的访问方式。(注意本书把精力全部集中在Btree的访问方式上,涉及的应用程序以BTree方式为主。)另一特性是DB提升了它的可配置性(是指附加的子系统模块,也不是编译方式-译者注)。DB提供了多个不同的子系统,每个子系统都能在某些方面扩展DB的能力。比如某些应用,要求具有数据写保护功能,来确定数据不会因为某些异常因素造成不一致性。(比如突然的断电或者硬件故障造成的数据不一致)。为了某些应用系统,启动事物子系统(Transaction Subsystem)能够启动事物级的数据库写保护。DB能够支持的
22、操作系统太多以至于不方便在这里列出(好有自信的描述-译者注),但可以肯定的是Berkeley DB支持所有的商用操作系统,以及众多的嵌入式平台。最后,DB支持大量的程序开发语言。除了明确指出的C语言,C+语言,Java语言接口之外,编译后的Libarary在众多的编程语言,脚本语言(例如Perl,Python)上得到完美的支持。注:在继续了解DB之前,必须明确DB不是一个关系型的数据库系统,虽然可以通过它构建一个关系型数据库系统(比如使用BerkeleyDB作为数据库引擎的Mysql),同样,DB也不支持诸如SQL(结构化查询语言),触发器等高级结构体。但是作为替代的解决方案,DB提供了最少的
23、API操作要求来完成存储和获取数据的操作,以最高效率为追求目标。关于本手册 本手册介绍了Berkeley DB,象这样的一本手册不能够完全涵盖DB的所有中级和高级功能,例如线程库的使用或者事物的使用。但是本手册提供了一个导航式的一步一步介绍DB的基础内容和库的用法。而且,本手册特别介绍了关于DB environments(数据库环境),数据库,数据库记录,存储和获取数据库记录。并且本书介绍了游标和他的用法,并且描述了辅助数据库的概念。本书中的大部分篇幅,描述集中在使用BTree访问方法。最后使用一个专门的章节介绍了使用BTree用法,描述记录复制和比较例程。本书中给出的所有例子都是被设计为使用
24、API的举例。每一个章节的结束,都会给出一个复杂的例子,重点培养你对这一章节内容的理解和使用。并且这些例子,你可以在DB_INSTALL/examples/c/getting_started 目录下找到,并且,此类用法与C+,Java的语言环境相似。第一章 Berkeley DB概念在继续介绍DB之前,有必要对BerkeleyDB的诸多概念进行一个梳理,尤其是以前使用关系型数据库的读者,这是入门的第一关。(这种嵌入式数据库的概念与传统我们接触过的Oracle,DB2,Mysql,SqlServer,Access等数据库都不一样,尤其是基础概念的差距非常大,但是可以用Mysql做一个中转站,因为
25、Berkeley DB曾经是Mysql5版本以前选择的数据库引擎!译者注)关于数据库记录(records)的概念:DB数据库包含有记录,理论上讲,每个记录相当于数据库中的一个单独的条目(entry,或者翻译成入口)。每一个记录包含两个信息片段:Key和Data。本书中用记录的Key和记录的Data来描述它们。(可以这样理解,Key是用来在一个表中描述唯一值的属性,相当于Oracle表中RowID的概念,或者说Mysql表中的主键;而Data是一个数据结构,这个数据结构中的每一个值都对应表的一列。可以把一个Mysql表中,除了主键以外的所有列,用一个数据结构描述,这个数据结构的整体就是Data。
26、详细的说明本文后面的例子会描述-译者注)正是由于DB数据库中使用了Key/Data配对的方式描述记录,因此有时可以被理解为一个包含有两列的表。然而,Data(有时是Key,这个要依赖于访问模式)能够保存任意复杂的数据。通常情况下,C的结构体或者其他类似机制能够在记录中保存。把一个具有N列的表,分为1(Key)和N-1(Data)列,然后作为一个有两列的表来操作。注意Berkeley DB的数据库的概念非常接近关系型数据库中表的概念。因此一个DB的应用程序,往往要调用到多个数据库,就好像在一个RDBMS的应用中(关系型数据库管理系统)要用到多个表一样。与关系型系统不同,一个BerkeleyDB的
27、数据库,只能包含一种数据组织方式,它可以(也只能是)下面四种方式之一:BTree,Hash,Queue,Recno。而在关系型数据库系统中,底层的数据访问方式通常是被隐藏起来的。无论如何,大多数的DB数据库应用,要求为每一种单独的数据应用设计一个独立的数据库来存储此类数据,因而大多数DB应用要求会存在多种类型的数据。举例来讲,在一个用户管理系统中,可能会要求管理银行客户,检查客户信息,存储,地区等等资料。在关系型数据库中,会要求多个表来进行操作。而在DB中,要求设计多个数据库来满足要求。既然会存在多个数据库,那么如何才能有效管理这些数据库呢?DB应用能够使用一个名为环境(environment
28、)的子系统扩展来有限的管理多个数据库系统。有关“环境”的概念后面会详细介绍,这里是借着多个库管理的问题引入一下。当你使用特定的结构体,调用DB API接口与数据库交互时,这些接口通常被称为“方法”(Method),因为他们与C+类的方法是如此相似。同样,用来访问数据库的变量通常被称为handle(句柄)。举例:要使用一个数据库,你必须获取这个数据库的句柄!从数据库获取结果集,通常被称为getting,因为使用get()这个函数来获取。同样,向数据库保存记录,被称为put,因为使用put()函数。当你想数据库存储一条记录,这条记录会按照预定的排序方式,被有序的存放入数据库。排序的一句往往依赖于K
29、ey,但有时也会去参考Data的数值。如果你存储的数据与已有的Key相同,现有记录的Data将被新记录的Data所取代。然而,如果数据库支持duplicate records (多重记录,即一个Key和多个Data),那么新记录将被作为多重记录保存,不会覆盖已有的记录。同样,如果数据库支持了多重记录,当使用数据库句柄获取时,只能获取结果集中的第一条记录。(从多重记录的概念引发需求,然后讲解解决方案-游标译者注)另一个扩展机制是游标,你可以使用游标读写特定的数据。游标是用来操作数据的基本的重复者,使用游标可以对一个数据库进行从头到尾(或者从尾到头)的遍历。还可以使用游标定位特定记录。在支持多重记
30、录的数据库中,游标是唯一的方法。最后介绍一下Secondary Database。Berkeley DB提供一种特定的数据库,名为辅助库(Secondary单词翻译含义:二级,辅助,备用,由于后面用了Primary这个词,与之对应,翻译为辅助译者注)。按照功能描述,辅助库作为索引而存在,为普通库(为了与辅助库区分,这里称为Primary Database。主库)提供索引服务。由于DB的记录能够包含复杂数据类型,也就是前面我们说的,把多个列(比如:姓名,年龄,籍贯,住所,邮编)包装成一个数据结构X,然后把这个数据结构X作为一个整体存进去,但是对一个给定结果的检索,只能基于这个记录的Key。通过这
31、个Key找到一个X,再把X提取出来,由我们的程序进行分解,提取出姓名,年龄,籍贯,住所,邮编等信息。但是如果我们想查查姓名等于“张无忌”的信息,这时候就需要引入辅助库来进行操作了。(这里举例Oracle的tbl_users表和索引来对应一下。Oracle的RowID相当于BerkeleyDB的Key,是一个唯一的值,这时表tbl_users就相当于Berkeley DB的数据库db_users。我们在表tbl_users上面建立一个索引idx_users,针对用户姓名建立索引,索引本身就是一个数据段,相当于Berkeley DB的辅助库dbsec_users。索引idx_users中会存储对应
32、tbl_users的RowID和用户名,而不是存全部的tbl_users的数据。同样,dbsec_users里面会存储db_users的Key和用户名,也不会存储整个用户的数据结构译者注)访问方式虽然本书着重介绍BTree访问方式,但是依然会对所有DB能够支持的访问方式做一个简短的介绍。需要注意对于一个数据库来讲,访问方式在创建数据库的时候就被确定了。一旦选中,实际的API操作就都会通过这个方式来访问这个数据库。即使是在某些异常事件发生的时候,也只能通过选中的方式对数据库进行访问。(特定的访问方式决定了数据库文件的格式,用BTree方式创建的数据库,当然无法用Queue的算法解释译者注)确定访
33、问方式的第一个把关者是对Key的使用方式,或者说Key的结构类型。第二个是考虑性能。首先对四种访问方式进行一下描述:BTree 数据被存储在一个排序过的,平衡的树状结构中。对BTree中的Key或者Data的数据复杂度,不做限制。也就是说,他们可以包含一个简单的字符串或者数字,也可以是一个复杂的数据结构体。另外,虽然不是默认的行为,但是确实存在两个记录使用一个相同的Key的情况。在这种情况下,会根据数据库设置的条件,是否启用了允许重复记录,来判断是覆盖掉,还是允许多重记录的情况。Hash 数据被存储在一个可扩展的线性哈西表中。与BTree相似,使用Hash存储方式的数据库,Key和Data记录
34、都可以存储复杂的数据结构。同样,Hash存取方式的数据库也支持多重记录(duplicate records)Queue 数据存储在队列中,每个成员都是固定长度的记录。每个记录使用一个逻辑数字作为它的Key。这种访问方式设计的目标是快速的在队列的尾部插入记录。并且它有一个特殊设置是从队列的头部开始删除或者获取结果记录。使用Queue访问方式的特点是它能够提供与众不同的记录级别的锁定,对于并发性访问频繁的应用,queue能够提供特殊的性能优化。Recno 数据存储可以使用固定长度,或者可变长度的记录。与Queue相似,Recno的记录也是使用逻辑记录号做为Key。如何选择访问方式在确定数据库访问方
35、式之前,首先需要确定如何使用你数据库中记录的Key,也就是先确定一个Key的类型,如果要使用任意类型的数据(比如String类型),应该选择BTree或者Hash作为访问方式;如果使用逻辑记录号码(本质上是整数),那么应该选择Queue或者Recno。如果对Key的类型选定了,下一步就需要在BTree或者Hash之间选择一个访问类型。(或者在Queue和Recno之间选择一个访问类型)在BTree和Hash之间选择对于可以完全放在内存中的小数据集来讲,BTree和Hash没有明显区别。他们的工作效率一样好。这种情况下,可以选择BTree即可,因为主流的Berkeley DB使用它。选择访问方式
36、的关注点,并非您整个数据集的大小,而是你工作时需要操作的数据集的大小。许多应用包含有大量的数据,但是只有极少数的数据需要被频繁的访问和操作。因此需要考虑的因素只是你实际需要操作的范围,而不是整个的数据集。然而随着你数据集的增长,超出了内存能够负载的范围的时候,就需要更加小心的选择你的数据库访问方式。特别关注的:当你的Key有位置相关性,(也就是Key值之间有关联,就是Key的数值不是随意的,这些值之间存在着某种关联。译者注)应该选择BTree。因为BTree会对Key的值进行排序,因此在提取数据的时候,往往会按照这些预定顺序进行提取,提取一个数据之后,下一个很有可能就是与它相邻的记录。这样效果
37、会好一些。而如果要提取的数据集的确非常大的时候,则建议使用Hash。对于任意给定的访问方式,Berkeley DB必须维护一定数量的内部信息,用来为访问方式提供服务。当需要提取一个大的数据集的时候,DB使用Hash所需要的内存资源,会远远低于使用BTree所需的内存资源。当你的数据量增长时,内部信息维护所需的缓冲也会增带,增大到物理内存空间不足时,就会引起磁盘缓冲交互,从而引发大量的磁盘I/O操作,从而降低系统性能。(也就是说,当你要提取的数据量超出了操作系统分配给你的内存能容纳的上限时,操作系统必然会才用类似虚拟内存之类的技术,用磁盘空间来补充。这样当然会降低性能。而Hash由于需要的内存相
38、对小,也就不容易引发这类情况,所以Berkeley DB在这里推荐使用Hash。但是如果你的数据达到了一定级别,即使你使用Hash,一样也会引发磁盘缓冲。因此数据库的前期规划很重要。译者注)总结,如果你的数据集会变得非常巨大以至于Berkeley DB不得不频繁的执行磁盘I/O来读取数据,那么使用Hash算法将比BTree更有优势,因为Hash本身占用的资源比BTree小很多。在Queue和Recno之间选择Queue或者Recno是在应用程序希望使用逻辑记录号作为主数据库的Key的时候。逻辑记录号本质上是一个整数,唯一的表示数据库中的一条记录。他们能够被设置为可变长度的或者固定的,一个可变记
39、录号在数据库的记录被保存或者删除时,能够被改变;固定逻辑记录号则不会理会数据库执行的操作,都不能改变固定逻辑记录号(fixed logical Record number)当在Queue和Recno之间选择访问方式的时候,可供参考的条件:Queue访问方式主要适用于应用程序存在高并发性的应用。因为Queue可以支持记录级别的锁定(其他访问方式只能提供页面级别的锁定)。并且可以在高并发的环境中快速返回结果集。但是Queue只能支持固定长度的记录。因此如果你希望数据的大小是可变的,能够兼容更多的记录类型,也许应该考虑Queue之外的访问方发。Recno访问方式适合可变的记录数量。Queue只能适应
40、固定记录数量。而且Recno访问方式还可以支持数据库存储完整的文本文件。Recno访问方式经常在业务应用的快速查找,临时存储中被用到。当你的数据需要被快速查找,或者修改的时候,可以用Recno方式。数据库的限制与可移植性Berkeley DB能够对几乎所有的数据管理提供支持。从非常小的完全运行在内存中的数据库,到扩展的包含有数百万记录与TB级别的数据的大型数据库;一个独立的Berkeley DB数据库能够存储最多256TB的数据(一个独立BDB数据库的概念,相当于一个表。与RDBMS中数据库概念不同译者注)。通过使用多个数据库相互配合,完全可以使用Berkeley DB来管理PB(petaby
41、tes)级别的数据信息。在一个单独的数据库中,一条独立的记录可以存储最多4GB的数据。Berkeley DB的数据库存储方式是以二进制格式存储。因此可以在不同的平台之间通用。即使是在不同endian-ness(大数在前还是小数在前。前面讲过由于CPU结构的不同,Intel x86系列的处理器,是小数在高位,大数在低位,例如32位的十六进制数0 x1234abcd,存储的时候,实际上是0 xabcd在前,0 x1234在后。而其他的架构,例如Sun Space处理器,却是高位数在前,低位数在后,存储为0 x1234和0 xabcd译者注)需要注意,抛开可移植性不谈,在使用小位结尾(也就是Inte
42、l x86这一类)的结构平台上移植时,可能会突然出现某些性能问题。后文会有关于这一类的讨论。同样的,Berkeley DB和它的数据结构被设计为支持并发访问-他们是线程安全的,可以在多个进程间共享数据。但是为了提供并发支持,Berkeley DB并不支持在网络文件系统(NFS或者Windows的网络共享)上安装执行数据库操作。因此需要注意,在本地的文件系统上安装配置Berkeley DB。环境本手册只是对BerkeleyDB的一个简短的介绍,它只是描述了如何构建一个非常简单的,单线程的应用。因此大量的数据库引擎的功能函数,被忽略掉。“环境”就是被忽略掉的强大功能之一。虽然“环境”在嵌入式的系统
43、中很少被用到,但是在大多数的应用中,客户是需要有这样一个虚拟化的数据库管理子系统。环境从本质上讲,就是对一个或多个数据库的封装。首先打开一个环境,并初始化,构造一个封装的容器,然后再这个容器中再打开数据库。当使用环境的时候,数据库被创建和安装在“环境”容器所指定的目录路径下。“环境”提供了大量单独数据库不具备的功能特性:多数据库文件(Multi-database files):允许在一个单独的物理文件或磁盘上创建多个数据库。对于那些需要打开多个数据库进行操作的应用来讲,具有多数据库文件支持是非常有价值的。多线程与多进程支持,当使用“环境”时,资源能够被所有打开的数据库共享,包括内存中缓冲(in
44、-memory cache)和锁定。“环境子系统”被设计为允许多个线程 或/和 多个进程 来访问数据库。例如:你可以使用一个环境子系统启动并发数据存储,锁定子系统,以及内存共享池的功能。事物支持(Transactional Processing):提供一个事物支持子系统允许你的数据库完全遵从ACID-保护机制(ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。译者注)建立数据库写机制。你可以使用环境来启动事物子系统支持,并且获取对应的事物ID。高可用性支持(数据
45、复制):DB提供一个复制子系统,允许一个单独的主库存在多个只读的副本文件,通过环境子系统,可以设置该功能。日志子系统:Berkeley DB为应用提供一个前写日志功能,让应用系统得到高级别的恢复能力。启动该功能后,日志子系统允许应用执行两种恢复(“普通”级别和“灾难性”级别),通过记录的日志可以恢复数据库信息。错误返回信息在继续学习前,有必要花几分钟时间,看一下DB返回的错误信息。在程序执行过程中,DB接口总是为成功的操作返回0。如果操作不成功的话,返回非零的数值。如果一个操作系统错误发生(比如:DB无法获取到磁盘空间,或者权限不够),DB返回一个错误号,所有可能返回的错误号都比零大。如果一个
46、操作不是由于操作系统错误,但是也没有成功执行的话,DB会返回一些特定的错误值。比如:你想获取一个并不存在的记录,DB将会返回DB_NOTFOUND,一个预定义的数值,表示要求的Key没有在数据库中出现。所有可能出现的特定值都是小于0的。DB同样也提供一个用来展示错误返回值得机制。首先,db_strerror函数会把给定错误号的数据库错误描述返回一个字符串。这个函数的功能与标准C语言的strerror相似,但是它可以同时返回操作系统错误和数据库特定错误。其次,还有两个错误函数,分别是DB-err和DB-errx。这两个函数的工作方式与标准C的printf函数相似,获取方式与printf语法和参数
47、列表相似。能够获取标准的错误字符串信息。获取和使用DB可以通过网站 HYPERLINK /technetwork/database/berkeleydb/downloads/index.html /technetwork/database/berkeleydb/downloads/index.html下载,详细的安装数据库步骤,可以在Oracle Berkeley DB Installation and Build Guide一文中找到。第二章 数据库在Berkeley DB中,数据库是一组记录的集合。记录由Key/data的对组成。从概念上讲,可以把数据库理解成具有两列的一个表。一列包含有K
48、ey,令一列包含Data。Key和Data都是用被称为DBT的结构。从根本上讲,使用一个DB的数据库包括了putting,getting,和deleting数据库记录。后面的章节将逐一介绍如何使用这些功能。打开数据库要打开一个数据库,首先需要执行db_create()函数来初始化一个DB句柄。一旦完成了句柄的初始化,你能用open()方法打开数据库。默认情况下,DB不会在数据库不存在的时候自动创建。如果希望DB能够自动创建一个数据库,可以为open()函数指定DB_CREATE标志。使用VC2010做的例子:(Win32 debug)前期编译准备下载源代码,解压缩,我的目录如下:E:db-6.
49、0.30build_windows。其中E:db-6.0.30是整个压缩文件的解压缩目录,build_windows是有关Windows平台下的源代码所在目录。文件列表如下图所示:可以看到所需的头文件都在这个目录下,双击Berkeley_DB_vs2010.sln,打开解决方案。设置编译方式为Win32平台下的Debug模式。如下图所示:在解决方案中,右键点击db,选择“生成”。如下图所示。输出结果如下:1 正在生成代码.1Link:1正在创建库.build_windowsWin32Debuglibdb60d.lib 和对象 .build_windowsWin32Debuglibdb60d.e
50、xp1db.vcxproj - E:db-6.0.30build_windowsVS10.build_windowsWin32Debuglibdb60d.dll1FinalizeBuildStatus:1 正在删除文件“./.build_windowsWin32Debugdbdb.unsuccessfulbuild”。1 正在对“./.build_windowsWin32Debugdbdb.lastbuildstate”执行 Touch 任务。11生成成功。11已用时间 00:00:53.37= 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 =在目录E:db-6.0.30bu
51、ild_windowsWin32Debug下产生了两个文件,分别是libdb60d.dll和libdb60d.lib。如下图所示:新建项目编译完了lib和dll之后,新建一个项目,用来测试数据库的打开(包括创建)和关闭的全过程。输入项目的名称,点击下一步,如图所示:点击下一步,继续。选择“控制台应用程序”,点击完成。此时完成了一个项目的构建,但是源代码部分是空的。项目源代码首先调整环境变量:在探出窗口中选择VC+目录,首先设置“包含目录”,在包含目录的最后增加上“;E:db-6.0.30build_windows;”注意多个目录是使用分号来分隔的,因此E字母前面的分号,是分隔新增目录与前一个目
52、录的。第二步,把刚才产生的libdb60d.dll和libdb60d.lib复制到程序的目录下,跟其他的源代码(E:ProjectBerkeleyDB001BerkeleyDB001)放在一起,如下图所示:然后源代码描述如下:/ BerkeleyDB001.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #pragma comment(lib, libdb60d.lib) /把编译好的Lib添加进来,作为函数声明,程序会自动调用libdb60d.dll文件int _tmain(int argc, _TCHAR* argv)DB *dbp; /*DB
53、 结构句柄*/u_int32_t flags; /* 数据库打开标志 */int ret; /* 函数返回值 */ret = db_create(&dbp,NULL,0);if(0!=ret)return -1;flags = DB_CREATE;ret=dbp-open(dbp,NULL,my_db.db,NULL,DB_BTREE,flags,0);if(dbp!=NULL)dbp-close(dbp,0);return 0;编译后,直接在Debug目录下执行该程序,执行前目录内容如下:双击“BerkeleyDB001.exe”文件,自动创建数据库文件。运行后目录如下:关闭数据库一旦使用了
54、数据库,你必须关闭它。可以使用DB-close()方法来关闭(上面的例子已经描述了)关闭一个数据库将导致它不能再被访问,直到你再次打开它。在关闭数据库之前,请先关闭该数据库的游标。在关闭数据库期间,如果有活动的游标存在,将会导致出现数据冲突错误。游标的详细描述在后面介绍。需要注意当你关闭数据库的时候,默认的情况会把缓冲的内容写入到硬盘上。你可以手工调用DB-sync()方法。(注:目前为止,所有的例子都是在Windows上做的,现在主要是先接触,把Berkeley DB的入门东西熟练了。后面慢慢的扩展。一下子弄得太大,贪多嚼不烂译者注)数据库打开标志下面介绍几个常用的数据库打开时的参数标志,注
55、意实际的参数很多,这里只介绍在单线程下简单应用会用到的几个例子。更多的变量标志信息,参考BerkeleyDB C API 相关手册当需要用多个参数打开数据库的时候,可以使用“或运算”合并多个标志位,例如:u_int32_t open_flags=DB_CREATE|DB_EXCL; DB_CREATE 如果数据库当前并不存在,则创建它。默认情况下,如果数据库不存在,会返回错误。DB_EXCL 独占式数据库创建。当数据库已经存在时,使用该参数将返回错误信息。这个参数也只能与DB_CREATE一起使用。DB_RDONLY 以只读的方式打开数据库,将导致所有多数据库发出的写操作失败。DB_TRUNC
56、ATE 物理截断(清空)一个磁盘上包含有数据库的文件。该操作将会导致所有在该文件中存放的数据库信息被物理清除。管理用的方法以下介绍的方法可能在进行数据库管理工作的时候会非常有用。DB-get_open_flags()返回当前数据库打开时的标志。如果指定的数据库尚未打开,则会导致返回一个错误信息。#include .DB *dbp; u_int32_t open_flags; dbp-get_open_flags(dbp,&open_flags); /获取当前的打开的信息。DB-remove()删除特定的数据库,如果不指定参数,整个与这个方法相关的文件将被删除。永远不要删除一个句柄处于打开状态的
57、数据库。也永远不要删除一个打开数据库的文件。#include .DB *dbp;dbp-remove(dbp,”mydb.db”,NULL,0);DB-rename() 重命名一个特定的数据库,如果没有给定database参数,那么将会把与该方法相关的整个文件重命名。永远不要重命名一个具有打开句柄的数据库。永远不要重命名一个打开句柄数据库所属的文件。#include DB *dbp;dbp-rename(dbp,”mydb.db”,NULL,”newdb.db”,0);报错函数为了便于管理错误机制,Berkeley DB提供了多种游泳的机制1,set_errcall()函数:指定在应用程序中,
58、用来处理错误信息的函数的名称。在应用程序执行的过程中,当一个错误发生时,可以使用set_errcall()函数,指定用来处理这个错误信息的函数。2,set_errfile()函数,调用C语言库的FILE*来处理错误信息的显示,也就是说,把DB输出的错误信息显示到一个文件中来。3,set_errpfx()函数,当数据库运行出现错误信息时,设置错误信息显示的前缀头。4,err()函数可以人为的产生一个错误信息,当用户使用set_errcall()函数设置过错误信息处理函数时,该错误信息被发送给指定的处理函数。如果没有指定函数,则发送给set_errfile()函数指定的文件。如果连文件也没有指定的
59、话,这个错误信息被发送给标准错误处理。一个错误信息可以包含前缀字符串(由set_errpfx()函数指定),一个随意的printf-style格式的信息,错误信息和后缀信息。5,errx()函数的功能与err()函数一致,除了errx()函数不会把与错误值关联的DB消息追加到错误串。此外,可以直接使用db_strerror()函数直接返回与特定错误号码对应的错误字符串。例如:需要把一个给定数据库的所有错误信息发送给一个指定的句柄,首先必须创建自己的回调函数。/* Function called to handle any database error messages issued by DB
60、*/void my_error_handler(const DB_ENV *dbenv, const char *error_prefix,const char *msg)/*Put your code to handle the error prefix and error message here .* Note that one or both of these parameters may be NULL depending * on how the error message is issued and how the DB handle is * configured.*/随后注册
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026-2027学年济南天桥区泺口实验学校七年级9月份英语月考考试试题以及答案
- 建筑幕墙设计师岗前价值创造考核试卷含答案
- 硬质合金精加工工操作管理评优考核试卷含答案
- 乐器维修工安全实操水平考核试卷含答案
- 巧克力塑形师基础实战测试考核试卷含答案
- 纺织印花制版工安全文明能力考核试卷含答案
- 酱油制作工岗中应急准备考核试卷含答案
- 搅拌工岗前技能理论考核试卷含答案
- 矿车修理工岗前专业应用考核试卷含答案
- 钻石检验员岗中安全检查考核试卷含答案
- 2026年部编版新教材道德与法治五年级上册第一单元检测题(含答案)
- 口腔诊所诊疗服务规范
- Unit 2 My feelings(单元自测基础卷)A4版英语人教PEP版五年级上册2026秋
- 2025年全国人大机关公开遴选公务员真题(附答案)
- 中国广电山东网络有限公司2026年度市县公司招聘145个模拟试卷附答案
- 2025年江苏(专升本)民法考试真题及答案
- 合成生物产品质量检测工程师岗位招聘考试试卷及答案
- 高危心电图课件
- 重师新生入学教育考试试题及答案
- 大公司办公职场管理制度
- 数学读书分享课件
评论
0/150
提交评论