首页 > 编程知识 正文

linux ls命令详解(FastDB简单介绍及实例(Linux))

时间:2023-05-05 12:10:19 阅读:121316 作者:1427

(正文内容主要是学习官网、博客,阅读官网demo后进行总结)

FastDB是内存数据库

1简要介绍

2访问类型

3使用流程

4面临的问题和解决方案

5代码示例

6总结

一、简要介绍1将数据完全加载到内存中,在内存中实现数据的管理;

2在只读模式线程、单个修改模式线程和多个只读模式线程之间同时执行;

3最小单位块:分配量化(16字节);

4提交事物协议基于影子根页算法对数据库执行原子更新操作,恢复效率高

影子根页算法:数据库中的每个对象都有唯一的标识符作为数组(对象索引)的后缀,元素值表示对象的句柄。 (FastDB有两个索引:当前索引和阴影索引。)

5内存数据结构组织: HASH,t树。

HASH:搜索效率最高(不适用于插入操作期间关键值冲突频繁的场景); 33558 www.Sina.com/:仅次于hash (不适用于具有频繁添加/删除操作的场景);

在FastDB中,声明为HASH的KEY采用HASH结构,声明为INDEXED的KEY采用t树结构。

二、访问类型1共有4种访问类型。 dbDatabase:dbReadOnly、dbDatabase:dbAllAccess、db database 3360: dbconcurrentread、dbdatabase360:

2 FastDB不支持客户端/服务器结构(内存数据库、服务器之间不可用);

3 T树:默认为此模式;

4 dbDatabase::dbReadOnly:如果进程使用修改数据库(如insert、update、delete )的操作,则访问库的所有其他进程(如open、select )的所有操作都将在(这个模式我自己写代码的时候还没有用过);

5 dbDatabase::dbAllAccess:一个进程对数据执行修改操作,另一个进程使用dbDatabase:dbReadOnly或db database 33603360 dbconcurrentread执行数据

但是,dbDatabase:dbReadOnly读取未提交的脏数据,而db database 33603360 dbconcurrentread则不然;

6在多个进程中使用db database :3360 dbconcurrentupdate的实际效果与dbDatabase:dbAllAccess相同;

7请勿将db database :3360 dbconcurrentupdate和db database :3360 dbconcurrentread模式混合使用。 不能同时启动两个线程。 一个以dbConcurrentUpdate模式打开数据库,另一个以dbConcurrentUpdate模式打开

8在db database :3360 dbconcurrentupdate模式下,请勿使用dbDatabase:precommit方法。

三、使用流程(Linux )在fastdb官网下载安装软件包;

2要在服务器上安装FASTDB,请参阅此博客文章(FASTDB安装配置)。

3创建测试文件或直接从下载的fastdb安装包中查找example文件进行测试;

请注意创建Makefile文件并添加以下内容: - I/usr/local/include/fastd B- l/usr/local/Li B- lrt-LZ 3358 www.Sina.com /

5编译世代通过,执行代码。

四.遇到的问题和解决方法dbDatabase::dbConcurrentUpdate

原因:相关头文件或. so文件部署失败。

解决方法:创建makefile时,没有添加相关的依赖关系。 (见上文第4点);

-lfastdb

原因: fastdb假设大多数Linux为64位,如果测试的是32位,则报告错误

解决方法:根据安装目录,找到fastdb目录下的config.h头文件并注释以下代码即可。 (运行的环境为64位,仍报告错误

感觉不是这个原因,但是按照这种方法可以解决,很迷~)

//#if!defined(_WIN32)||defined(_WIN64)//most unixes are now 64-bit,while 32-bit windows is still quite popular//#define LARGE_DATABASE_SUPPORT//#endif

3 当运行的数据大概达到一千万条以上的时候,即生成的文件内容达到2G之后,程序就会抛出异常,自动停止,这个问题找了很久一直也没有解决。

五、 代码实例

下面的代码只是一个简单的实例,包含了表关联(删除一个表的数据,另一个表相关的记录也会被删除),数组的使用,插入数据、查询数据、删除数据。

(ps:下面的代码是手撕的(不是copy的服务器上面的代码),没有实际测过,可能会有一些小小的问题,欢迎指出,不过大体上是没有什么问题的。)

#define _LARGEFILE_SOURCE#define _LARGEFILE64_SOURCE#define _FILE_OFFSET_BITS 64#include "fastdb.h"#include "database.h"#include <iostream>#include <stdio.h>#include <sys/time.h>#include <sring>using namespace std;USE_FASTDB_NAMESPACEdbDatabase db;#define random(a,b) (rand()%(b-a))+a+1 //生成随机数#define TeacherNum 5 //老师个数#define StudentNum 20 //学生个数class Student;class Teacher{public:const char* teacher_name;dbArray<dbReference<Student>> std_code;TYPE_DESCRIPTOR((KEY(teacher_name,INDEXED),OWNER(std_code,tech_code)));};class Student{public:const char* std_name;dbArray<int4> scores; //Chinese English MathdbReference<Teacher> tech_code;TYPE_DESCRIPTOR((KEY(std_name,INDEXED), FIELD(scores), RELATION(tech_code,std_code)));};REGISTER(Teacher); //注册Teacher表REGISTER(Student); //注册Student表//生成老师的编号void getRandomCharTeach(char * randnum){int num = random(0,10); snprintf(randnum,sizeof(randnum),"%d",num); //int类型转换为char *}//生成学生的编号void getRandomCharStu(char * randnum){int num = random(20,50);snprintf(randnum,sizeof(randnum),"%d",num); //int类型转换为char *}//生成0-100之间的随机数int4 getRandomIntSocre(){int num = random(0,100);return num;}//查询老师编号void selectTeachName(){cout<<"***** selectTeachName *****"<<endl;dbCursor<Teacher> cursorTeach; //只读游标int n = cursorTeach.select(); //查询cout<<"Teacher的数量为:"<<n<<endl;if(0<n){do{cout<<"teacher_name = "<<cursorTeach->teacher_name<<" ."<<endl;}while(cursorTeach.next()); //游标向后滚}}//查询学生信息void selectStuInfo(){cout<<"***** selectStuInfo *****"<<endl;dbCursor<Student> cursorStu; //只读游标int n = cursorStu.select(); //查询cout<<"Student的数量为:"<<n<<endl;if(0<n){do{cout<<"std_name = "<<cursorStu->std_name<<" , "<<"Chinese = "<<cursorStu->scores[0]<<" , "<<"English = "<<cursorStu->scores[1]<<" , "<<"Math = "<<cursorStu->scores[2]<<" ."<<endl;}while(cursorStu.next()); //游标向后滚}}//删除所有数据void removeAllRecord(){cout<<"***** removeAllRecord *****"<<endl;dbCursor<Teacher> cursorTeach(dbCursorForUpdate); //写游标对象cursorTeach.removeAll();dbCursor<Student> cursorStu(dbCursorForUpdate); //写游标对象cursorStu.removeAll();}int main(){Teacher techer;Student student;if(db.open(_T("test"))){cout<<"Start inserting data..."<<endl;for(int i = 0; i < TeacherNum; i++){char tech_num[2];getRandomCharTeach(tech_num);techer.teacher_name = tech_num;dbReference<Teacher> techer_class = insert(techer);cout<<"Insert "<<techer.teacher_name<<" to Teacher."<<endl;db.commit();//插入多个学生信息对应当前老师for(int j = 0; j < StudentNum; j++){char std_num[2];getRandomCharStu(std_num);student.std_name = std_num;int Chinese = getRandomIntSocre(); //语文成绩int English = getRandomIntSocre(); //英语成绩int Math = getRandomIntSocre(); //数学成绩student.scores(3); //数组大小为3student.scores.putat(0,Chinese); //把各科成绩放到数组中student.scores.putat(1,English);student.scores.putat(2,Math);student.tech_code = techer_class; //把当前学生的信息与对应老师相关联insert(student); cout<<"Insert std_name : "<<student.std_name<<" , "<<"Chinese : "<<Chinese<<" , "<<"English : "<<English<<" , "<<"Math : "<<Math<<" ."<<endl;}db.commit();}//查询、删除的实例可以在open表之后直接调就可以了,这里就不写了}db.commit();return 0;} 六、 总结

fastDB确地有它的优点,但是现有的相关资料比较少,所以使用起来会有难度,重点是文件超过2G的抛异常的问题没有找到相关的解决方案,如果有朋友有相关解决方案,可以一起交流学习。

----------如有侵权,联系删除!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。