fastdb简介:1)、小型实时内存数据库,支持多种操作系统,包括windows与linux;2)、由C++编写的,提供方便易用的C++接口;3)、支持对数据库的并发访问,且用户程序无需考虑同步与互斥的问题;4)、支持类SQL查询语言;5)、可将数据库文件存于内存实现快速快速访问,亦可将其存磁盘。6)、优异的查询、插入性能,有网友对其进行过测试,参考: http://www.360doc.com/content/10/0330/22/2633_20944303.shtml1、多线程访问数据库1)线程访问数据库前dbDatabase::attach,结束后dbDatabase::detach。2)各个线程(包括主线程)访问数据库后要执行commit 或precommit操作释放锁,使得其他线程能访问该数据库,否则程序会挂起。2、多进程访问数据库Access typeDescriptiondbDatabase::dbReadOnlyRead only modedbDatabase::dbAllAccessNormal modedbDatabase::dbConcurrentReadRead only mode in which application can access the database concurrently with application updating the same database in dbConcurrentUpdate modedbDatabase::dbConcurrentUpdateMode to be used in conjunction with dbConcurrentRead to perform updates in the database without blocking read applications for a long time以dbConcurrentUpdate模式打开/创建数据可使多个进程同时更新同一个数据库文件; 以dbConcurrentRead 模式打开数据库可使多个进程同时查询同一个数据库文件;勿将这两个模式与其他模式混合使用;同一个进程勿同时使用这两个模式;dbConcurrentUpdate模式下勿使用dbDatabase::precommit操作3、提升数据库访问速率1)批量操作(insert、update等)后commit2)每个操作后precommit,使用定时器定时commit3)平行查询,设置nThreads参数为CPU核心数4)多线程应用程序采用延迟参数绑定(delayed parameter binding)5)dbQuery对象在执行查询操作之前会先compile一次,可将dbQuery对象声明为全局变量,程序启动时初始化一次4、内存模式fastdb可完全工作于内存模式,即不创建数据库文件,数据全部存于内存。在Makefile内设置DISKLESS_CONFIGURATION 宏,重新编译fastdb即可。 其他进程也可并发地访问数据库,当有进程使用数据库的时候数据库才会存在于内存,当所有进程关闭了数据库之后数据库对象被销毁,数据丢失。5、线索化查询关键字在定义table的时候,fields descriptor可选如下:FIELD(name)无线索化,查询该field时使用SequentialsearchKEY(name, index_type)线索化查询关键字,index_type=HASHED时建立哈希索引表,查询该field时使用哈希算法;index_type=INDEXED时建立T-tree(一种平衡二叉查找树)索引表,查询该field时使用平衡二叉查找树算法。UDT(name, index_type, comparator)表示该field是用户自定义的类型RAWKEY(name, index)Raw binary type with predefinedcomparator. This macro is just specialized version of UDT macro with memcmp used as comparator.RAWFIELD(name)One more specialization of UDT macro for raw binary fields with predefined comparator memcmp and without indices.SUPERCLASS(name)在派生类中,声明该类的基类RELATION(reference, inverse_reference)修饰定义为dbReference的成员,表示本table与其他table的关系OWNER(reference, inverse_reference)修饰定义为dbReference的成员,表示该field从属于哪一个field(可以是另一个table的field)METHOD(name)声明一个查询方法,在查询语句中会用到,例如table中有一个method名为year(),则查询该table时可用q=”year=”,1999; 线索化与非线索化查询的时间复杂度:Type of searchAverageMaximalSequential searchO(N)O(N)Sequential search with sortingO(N*log(N))O(N*log(N))Search using hash tableO(1)O(N)Search using T-treeO(log(N))O(log(N))Access by referenceO(1)O(1)6、引用(reference) 引用表示两张表之间的关联,两张表可互为引用;在table的定义中声明为dbReference的成员,在TYPE_DESCRIPTOR或CLASS_DESCRIPTOR时用宏RELATION(reference, inverse_reference) 修饰两张表之间的关系。 一个table中,声明为dbReference的成员,可在查询该成员时使用点分表示法访问dbReference的成员,例如:class table1{dbReference t2;};class table2 {intx; int y;};则查询语句 dbCursor cusor; q=“t2.x=”,1,”andt2.y=”,2;cusor.select(q);表示通过table1查询table2中x=1,y=2的记录。7、容错处理 (Faulttolerant support)从2.49版本开始,fastdb实现了容错处理的机制,做法是:增加若干备用机(standby nodes),主机(primary node)数据库的内容被复制到备用机,并实现多机同步更新的机制;当主机crashed掉之后,其中一个备用机被启用;待主机重启成功后,它将成为备用机。各个机间采用socket通信。为了支持容错处理,须开启REPLICATION_SUPPORT选项,在Makefile设置宏FAULT_TOLERANT为1,重新编译fastdb。在构造数据库对象时,使用dbReplicatedDatabase,而不是dbDatabase。打开数据库时,须指定:主机及备用机的identifier ( 0~(N-1)),各机地址 (hostname:port pair) ,机子的数目 (N)。然后每台机分别启动你的应用程序。8、备份 调用dbDatabase::backup对数据库进行备份。从备份文件恢复的方法很简单,只需重命名备份文件即可。 12-04 17:44