(本文内容主要是通过学习官网、博客及阅读官网demo做出的总结)

FastDB是一个内存数据库,通过把数据加载到内存中实现对数据的操作,相比于传统的数据库,操作的速度更快,但是存在一个缺点就是使用FastDB数据库的应用程序都必须运行在同一台主机上。

1 简单介绍
2 访问类型
3 使用流程
4 遇到的问题及解决办法
5 代码实例
6 总结

一、 简单介绍

1 将数据完全加载到内存,在内存中实现对数据的管理;

2 只读模式线程、单个更改模式线程和多个只读模式线程间并发执行;

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

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

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

5 内存数据结构组织:HASH、T树。

HASH:具有最高查找效率(不适用于插入操作中,键值冲突发生频率较高的场景);
T树:仅次于HASH(不适用于有频繁的添加、删除动作的场景);

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

二、 访问类型

1 一共四种访问类型:dbDatabase::dbReadOnly、dbDatabase::dbAllAccess、dbDatabase::dbConcurrentRead、dbDatabase::dbConcurrentUpdate;

2 FastDB不支持客户端/服务器结构(内存数据库,不能跨服务器);

3 dbDatabase::dbReadOnly:默认是这种模式;

4 dbDatabase::dbAllAccess:如果该进程使用了insert、update、delete等修改数据库的操作,其他访问该库的进程的所有操作(包括open、select)都会被阻塞,直到该操作提交或回滚。(该模式我自己在写代码时还没有用到过);

5 dbDatabase::dbConcurrentUpdate:如果某进程对数据进行修改性操作,同时另外的进程使用 dbDatabase::dbReadOnly 或者 dbDatabase::dbConcurrentRead 读数据,不会出现阻塞情况。
但是 dbDatabase::dbReadOnly 会把未提交的脏数据读出来,而dbDatabase::dbConcurrentRead不会;

6 多个进程使用 dbDatabase::dbConcurrentUpdate 实际效果和 dbDatabase::dbAllAccess 一样(阻塞);

7 不要把 dbDatabase::dbConcurrentUpdate 和 dbDatabase::dbConcurrentRead 模式混用,不能同时启动两个线程,其中一个用 dbConcurrentUpdate 模式打开数据库,另一个用 dbConcurrentRead 模式;

8 在 dbDatabase::dbConcurrentUpdate 模式下不要使用 dbDatabase::precommit方法。

三、 使用流程(Linux)

1 在fastdb官网下载安装包进行安装;

2 在服务器上安装fastdb,可以参考这个博主的文章(fastdb安装配置);

3 编写测试文件,或者直接在下载的fastdb安装包中找一个example文件进行测试;

4 编写Makefile文件,注意添加以下内容:-I/usr/local/include/fastdb -L/usr/local/lib -lrt -lz -lfastdb (上面的内容根据自己的实际安装路径进行调整)。

5 编译代通过,运行代码。

四、 遇到的问题及解决办法

1 undefined reference to dbDatabase::~ 等报错

原因 :没有成功引入相关的头文件或者.so文件;

解决办法:编写Makefile文件时没有添加相关的依赖(参考上面的第4点内容);

2 Incompatibility between headers and library:6 vs. 4

原因:fastdb会假设绝大多数Linux是64-bit的,如果测试的是32-bit的,就会报错;

解决办法:根据安装目录,找到fastdb目录下的config.h头文件,将以下代码注释即可。(运行的环境是64-bit的,依旧报错,感觉不是这个原因,但是按照这种方法可以解决,很迷~)

//#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的抛异常的问题没有找到相关的解决方案,如果有朋友有相关解决方案,可以一起交流学习。

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

FastDB简单介绍及实例(Linux)相关推荐

  1. Dubbo简单介绍及实例

    1.概念 Dubbo是一个分布式服务框架,以及阿里巴巴内部的SOA服务化治理方案的核心框架.其功能主要包含:高性能NIO通讯及多协议集成.服务动态寻址与路由.软负载均衡与容错,依赖分析与降级等. 说通 ...

  2. Linux curl使用简单介绍

    http://www.linuxidc.com/Linux/2008-01/10891.htm -------------------------------------------------- L ...

  3. linux fg 参数,Linux的bg和fg命令简单介绍

    我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的 ...

  4. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  5. Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令

    Linux系统Vi/Vim编辑器的简单介绍.安装/卸载.常用命令 1.介绍 vi(Visual Interface)编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界 ...

  6. Linux 下UVCamp;V4L2技术简单介绍(二)

    通过前文Linux 下UVC&V4L2技术简单介绍(一)我们了解了UVC和V4L2的简单知识. 这里是USB设备的文档描写叙述:http://www.usb.org/developers/do ...

  7. jenkins linux虚拟机,Linux系统中jenkins使用的简单介绍

    jenkins是一个开放的软件平台,在Linux系统中的软件平台也不少,但是jenkins一直是比较受欢迎的那一个.本文就来简单介绍一下Linux系统中jenkins安装配置和使用. 安装jenkin ...

  8. linux复制文件夹 实例,linux复制文件夹与文件实例介绍linux操作系统 -电脑资料

    本文章来介绍一下关于linux复制文件夹与文件的一些基础用法,有需要学习的朋友可参考一下本文章, CP命令 格式: CP [选项] 源文件或目录  目的文件或目录 选项说明:-b 同名,备分原来的文件 ...

  9. linux驱动简单介绍

     linux驱动简单介绍 驱动基本介绍 驱动.顾名思义就是"驱使硬件设备行动".设备驱动与底层硬件之间打交道,按照硬件设备的具体操作方式来读写设备寄存器,最终完成一系列操作. 设备 ...

  10. 连接服务器用xshell还是linux,【linux☞5】xshell 连接服务器的简单介绍

    前言 linux连接工具有很多,但所有终端工具使用的目的都是为了连接上服务器,从而方便自己在终端工具上直接使用命令来操作想要做的事情.这里我就简单介绍一下xshell这款终端工具安装过程. xshel ...

最新文章

  1. php的Traits属性以及基本用法
  2. 主机访问虚拟机中linux上的web服务
  3. 递归时间/空间复杂度的分析(斐波那契为例)
  4. 三层聚合实验的注意事项
  5. concurrent 底层_JDK1.8 util-concurrent-ConcurrentLinkedQueue源码分析
  6. 寫下來,免得下次又忘了
  7. 深入理解JVM虚拟机笔记——类加载机制
  8. 初步用Echarts实现圆饼图
  9. vector初始化与清空
  10. openwrt 19 overlay 空间不足_新桥胡同拆除19处违建!背街小巷“瘦身”后宽敞多了...
  11. self.view.window, self.view.superView的意思
  12. java pdf电子签名_java多种方式实现pdf文件电子签名
  13. mongodb获取具体某一天的查询语句
  14. 如何将docx文本转换成使用微信小程序rich-text能编译的格式
  15. html可以联机玩的小游戏,数学趣味小游戏,在家也可以和孩子一起玩
  16. 关于使用2d照片进行3d建模
  17. signature=d363d26bda212f777fef81d270ecd42b,基于DNA-pooling全基因组重测序初步筛查CAD易感基因变异位点...
  18. 怎样购买笔记本电脑-世界十大品牌
  19. 程序员做什么副业最轻松最赚钱?
  20. 史上最全的CSS hack方式一览(解决IE6-IE11,Firefox/Safari/Opera/Chrome兼容问题)

热门文章

  1. 当编程语言都变成女孩子
  2. 圣诞素材网站推荐 这几个网站超多免费可商用素材
  3. ef 数据迁移mysql_ef数据库迁移
  4. 2020-11-12
  5. 软件项目管理大作业:项目内容介绍
  6. 用Hydra工具暴力破解Windows7管理员密码并访问它的共享服务
  7. 使用RssHub为网页生成RSS订阅源
  8. 用Python爬取网易云音乐全部歌手信息(歌手id和歌手名字)
  9. prepareStatement的批量处理数据
  10. 计算机研究生论文多少字,研究生一篇论文需要多少字?