FastDb client-server模式

浅析开源内存数据库Fastdb FastDB支持具有类似SQL语法的查询语言。FastDB使用的符号在面向对象编程中比在关系数据库中更受欢迎。表行被视为对象实例,表是这些对象的类。与SQL不同,FastDB面向的是使用对象,而不是SQL元组。因此,每次查询执行的结果都是一个类的一组对象。FastDB查询语言与标准SQL的主要区别在于:1、 没有几个表和嵌套子查询的联接。查询总是从一个表中返回一组对象。2、 标准C类型用于原子表列。3、 除了空引用之外,没有空值。我完全同意C.J.Date对三值逻辑的批评,以及他使用默认值的建议。 阅读详情

就个人理解而言,fastdb client-server模式,只是在client和server之间添加了一个socket通信,其实操作都是在server端完成的。

但是client-server也有很多好处,其中一个就是可以同一个进程可以同时运用fastdb的无盘模式,和磁盘模式。

当然其中一个模式只是client(比如这个进程开启时需要用无盘模式,将数据全部存入内存,以方便读取,但是记录日志时希望用fastdb记录到库中,这时候就可以另外开始一个server进程,用磁盘模式打开数据库,client连接到server进行insert操作。)

server端代码:

// Sev_log.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include "fastdb.h"
 
class CLog
{
	public:
		char const* sdatetime;
		int4		ProcessNo;
		int4		level;
		char const* logtext;
		char const* ifwrited;
 
	TYPE_DESCRIPTOR((FIELD(sdatetime),
					 FIELD(logtext),
					 FIELD(ProcessNo),
					 FIELD(level),
					 FIELD(ifwrited)
					 ));
};
 
#pragma comment(lib, "fastdb.lib")
#pragma comment(lib, "wsock32.lib")
 
#if THREADS_SUPPORTED && !defined(NO_SOCKETS)
#define SERVER_SUPPORTED 1
#include "server.h"
#else
#define SERVER_SUPPORTED 0
#endif
 
USE_FASTDB_NAMESPACE
 
REGISTER(CLog);
 
int _tmain(int argc, _TCHAR* argv[])
{	
	//由于不关闭数据库的话,内存占用会越来越大,所以定时重启数据库
	while(1)
	{
		dbDatabase* m_pdb;
		m_pdb = NULL;
 
		size_t dbInitSize = 16 * 1024 * 1024;			// 16M	指定了数据库文件的初始大小	缺省值为4MB
		size_t dbExtensionQuantum = 1 * 1024 * 1024;		//  1M	内存分配位图的扩展量子		缺省值为4MB
		size_t dbInitIndexSize = 2 * 1024 * 1024;		//  2M	指定了初始的索引大小			64K个对象标识符
 
		m_pdb = new dbDatabase(dbDatabase::dbAllAccess, dbExtensionQuantum, dbInitIndexSize);
	
		if(m_pdb->open("test"))
		{
			m_pdb->scheduleBackup("backup.fdb",2); //定时备份 2s备份一次
			char serverURL[64];
			strcpy(serverURL, "localhost:2100");
			dbServer* server = dbServer::find(serverURL);
 
			if (server == NULL){
				/*
				dbServer::dbServer(dbDatabase* db,
					char const* serverURL, 
					int optimalNumberOfThreads, 
					int connectionQueueLen)
				*/
				server = new dbServer(m_pdb, serverURL, 8);
				if (server != NULL){
					server->start();
					printf("Server started for URL %s\n", serverURL);
				}
			}
 
			Sleep(60000);
 
			if (server != NULL) { 
				server->stop();
				delete server;
				server = NULL;
				printf("Server stopped for URL %s\n", serverURL);
			} 
 
			m_pdb->close();
			printf("fastdb close!\n");
		}
 
		delete m_pdb;
		m_pdb=NULL;
	}
	return 0;
}

client端代码:

// cli_writelog.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include "cli.h"
#include <string.h>
#include <process.h> //windows
//#include "unistd.h"  //linux
 
#include "fastdb.h"
 
class CLog
{
	public:
		char const* sdatetime;
		int4		ProcessNo;
		int4		level;
		char const* logtext;
		char const* ifwrited;
 
	TYPE_DESCRIPTOR((FIELD(sdatetime),
					 FIELD(logtext),
					 FIELD(ProcessNo),
					 FIELD(level),
					 FIELD(ifwrited)
					 ));
};
 
#pragma comment(lib, "cli.lib")
#pragma comment(lib, "wsock32.lib")
 
USE_FASTDB_NAMESPACE;
 
#define SUCCESS			1
#define CREATE_STATEMENT_ERROR -1
#define BIND_COLUMN_ERROR      -2
#define INSERT_ERROR	       -3
#define PRECOMMIT_ERROR        -4
#define FREE_STATEMENT_ERROR   -5
 
 
int WriteLog(char *format,...)
{
	FILE * fp;
	va_list args;
	char sLogFile[100];
	
	memset(sLogFile,0,sizeof(sLogFile));
	
	strcpy(sLogFile,"log.txt");
	
	if((fp=fopen(sLogFile,"a+"))==NULL)
	{
		//printf("open file happened errors!\n");
		return -1;
	}
 
	va_start(args,format);
	vfprintf(fp,format,args);
	va_end(args);
	
	fclose(fp);
	return 0;
}
 
int WriteLog(const char* log , const int level , const int session)
{
	const int MAXSTRLEN = 256;
	int inst_level,inst_processno;
	char inst_sdatetime[MAXSTRLEN];
	char inst_logs[MAXSTRLEN];
 
	int StatementToInst = cli_statement(session, "insert into CLog");
 
	if (StatementToInst < 0) { 
		WriteLog("cli_statement failed with code %d\n", StatementToInst);
		return CREATE_STATEMENT_ERROR;
	}
 
	int rc;//用于返回错误代码
	if ((rc = cli_column(StatementToInst, "sdatetime",cli_asciiz, NULL, &inst_sdatetime)) != cli_ok ||
		(rc = cli_column(StatementToInst, "logtext", cli_asciiz, NULL, &inst_logs)) != cli_ok		||
		(rc = cli_column(StatementToInst, "ProcessNo", cli_int4, NULL, &inst_processno)) != cli_ok   ||
		(rc = cli_column(StatementToInst, "level", cli_int4, NULL, &inst_level)) != cli_ok )
	
	{
		WriteLog("cli_column failed with code %d\n", rc);
		return BIND_COLUMN_ERROR;
	}
 
	char buf[MAXSTRLEN];//用于临时存储时间
 
	strcpy(inst_sdatetime,dbDateTime::current().asString(buf,sizeof buf,"%Y-%m-%d %H:%M:%S"));
	strcpy(inst_logs,log);
	inst_processno = (int)getpid();
	inst_level = level;
 
	if((rc = cli_insert(StatementToInst,NULL))!= cli_ok)
	{
		WriteLog("cli_insert failed with code %d\n", rc);
		return INSERT_ERROR;
	}
 
	/*
	if((rc = cli_commit(session)) != cli_ok)       //直接commit非常慢!
	{
		printf("cli_commit failed with code %d\n", rc);
		return PRECOMMIT_ERROR;
	}
	*/
	
	
	
	if((rc = cli_precommit(session)) != cli_ok)
	{
		WriteLog("cli_precommit failed with code %d\n", rc);
		return PRECOMMIT_ERROR;
	}
	
	
	if((rc = cli_free(StatementToInst)) != cli_ok){
		WriteLog("cli_free failed with code %d\n", rc);
		return FREE_STATEMENT_ERROR;
	}
 
	return SUCCESS;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	char* const serverURL = "127.0.0.1:2100";
 
	int session = cli_open(serverURL,10,1);//重连次数10,重连间隔1s
	if (session < 0) { 
        printf("cli_open failed with code %d\n", session);
		return -1;
    }
	
	DWORD dstart = GetTickCount();
 
	for(int i=0;i < 10;i++)
		WriteLog("this is a log test",i%10,session);
 
	printf("time is %d\n",GetTickCount()-dstart);
 
	int rc;
	/*
	if((rc = cli_commit(session)) != cli_ok)  //批量提交速度最快  但是在提交之前,这部分日志无法取出
	{
		printf("cli_commit failed with code %d\n", rc);
		return PRECOMMIT_ERROR;
	}
	*/
 
	//precommit最好加上定时备份日志
	/*FastDB为数据库提供了precommit的接口,用于完成除sync到磁盘文件外的所有事物操作
	,如释放mutex资源等。同时提供了backup接口,用来完成内存数据到磁盘文件的备份,
	甚至支持打开数据库时同时指定定时备份到磁盘文件的间隔,但是cli这个功能还没完善*/
 
 
	if ((rc = cli_close(session)) != 0) { 
		printf("cli_close failed with code %d\n", rc);
		return -1;	
	}
	printf("fastdb insert successfully!\n");
 
	dstart = GetTickCount();
	for(int i=0;i < 100;i++)
		WriteLog("this is a log test\n",i%10);
 
	printf("time is %d\n",GetTickCount()-dstart);                                                                  
	printf("file insert successfully!\n");
 
 
	getchar();
 
	return 0;
}


原文:https://blog.youkuaiyun.com/fuyun10036/article/details/8620816 
 

FastDB使用记录 前言 FastDB是一个C++语言实现的开源的关系型内存数据库,支持基础的SQL语法,速度也不错,适合中小型项目用。 它是作为库文件在项目中使用,不是独立的服务,这点和LevelDB相同。之前在项目中使用内存数据库FastDB作为缓存,使用的过程中出现了一些问题,现在把当时记录的内容发出来,希望能为使用FastDB的朋友提供一些帮助。 FastDB官方网站:www.garret.ru/fas 阅读详情

相关推荐

fastdb开源数据库:高效查询与定制优化

开源数据库fastdb作为内存数据库领域的一颗新星,因其高性能、可扩展性以及丰富的核心功能而备受关注。本章将详细介绍fastdb的核心特性,以助于读者了解其在现代IT架构中的重要角色。开发自定义功能通常包括定义功能需求、设计实现方案、编码实现以及功能测试。例如,如果需要增加一种新的索引策略,开发者首先需要明确索引策略的需求,然后设计算法,并在数据库源码中实现它,最后编写测试用例验证新功能的正确性和性能表现。// 示例:注册自定义索引的代码段// 假设已经设计了一种新的索引算法。

weixin_42443533的博客 1399

FastDB简单介绍及实例(Linux)

(本文内容主要是通过学习官网、博客及阅读官网demo做出的总结) FastDB是一个内存数据库,通过把数据加载到内存中实现对数据的操作,相比于传统的数据库,操作的速度更快,但是存在一个缺点就是使用FastDB数据库的应用程序都必须运行在同一台主机上。 1 简单介绍 2 访问类型 3 使用流程 4 遇到的问题及解决办法 5 代码实例 6 总结 一、 简单介绍 1 将数据完全加载到内存,在内存中实现对数据的管理; 2 只读模式线程、单个更改模式线程和多个只读模式线程间并发执行; 3 最小单位块:分配量子(16字

qq_37845417的博客 4611

深入解析内存数据库FastDB源码

内存数据库(In-Memory Database,简称IMDB)是一种将数据存储在内存中以获取更快的数据访问速度的数据库系统。与传统的磁盘数据库相比,内存数据库的优势在于其数据读写性能的大幅提升,因为内存访问速度远超磁盘I/O。

weixin_42234168的博客 956

fastdb

如果内容存在,会重复插入多条。

qixiang2013的专栏 313

在 Ubuntu 22.04 上配置 SonarQube 与 CI/CD 流水线实现自动化代码审查

本文详细介绍了在Ubuntu 22.04系统上配置SonarQube并与CI/CD流水线集成的完整流程,实现自动化代码审查。从环境准备、数据库配置到核心参数调优,再到与Jenkins和GitHub Actions的深度集成,提供了实战技巧和性能优化建议,帮助团队提升代码质量监控效率。

weixin_28829325的博客 258

西门子S7-1200控制伺服/步进电机方法与接线(全)

西门子S7-1200控制伺服/步进电机方法与接线(全) 伺服/步进电机在非标自动化控制中十分常用,但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服/步进电机的教程,于是今天想着跟大家分享一下。 本文共分为一下几个四个内容。 文章目录西门子S7-1200控制伺服/步进电机方法与接线(全)前言一、准备二、接线1.PLC接线:2.伺服接线:3. 步进电机的接线:三、代码组态代码四、可能出现的问题 前言 工程控制常用到三项异步电机、直流电机等,但他们都无法准确的控制电机角度;于是有了步进电机、

weixin_46060068的博客 7万+

FastDB 磁盘和无盘模式

在网上看到了一下主存数据库的性能测试,相对于BerkeleyDB和SQLite来比,fastdb的性能还是略胜一筹,时间精力有限,本人没有对SQLite,BerkeleyDB进行系统的分析研究。这里仅是简单剖析fastdb高效性的实现。 在其他报告中有提到,在fastdb磁盘模式下,当批量提交事务时fastdb的性能比SQLite的性能高出3-10倍,可当逐条提交事务时fastdb的性能却急剧下...

jinking01的专栏 913

Android应用之【巧妙隐藏桌面图标的进阶方案】

本文详细探讨了Android应用中隐藏桌面图标的进阶方案,解决了传统方法在Android 10及以上版本中出现的黑色图标残留问题。通过Intent-Filter配置和厂商适配技巧,实现子应用真正隐身,同时确保主应用正常启动。适用于企业工具套件、模块化系统等场景,提升用户体验和安全性。

weixin_28363123的博客 504

FastDB 应用开发指南(一)

FastDB 应用开发指南(一)    简介FastDB 是一个高效率的内存数据库系统,具有实时性能和方便的C++ 接口。FastDB 并不支持客户端/ 服务器结构,所有使用FastDB数据库的应用程序都必须运行在同一台主机上。FastDB 为具有主导读取访问模式的应用程序作了优化。通过消除数据传输的开销和使用高性能的锁工具实现了查询执行的高速度。数据库文件和使用该

6891

单细胞分析实战:用R语言绘制带连线的堆叠柱状图(附完整代码)

本文详细介绍了如何使用R语言绘制带连线的堆叠柱状图进行单细胞转录组数据分析,特别适用于展示细胞比例变化趋势。通过完整代码示例和实战技巧,帮助研究者优化多组别比较的可视化效果,提升科研图表质量。

yhn4567890的博客 389

熵编码(五)-CABAC(一) 基础篇

前两篇算术编码文章介绍了算术编码原理和步骤。本篇文章介绍CABAC,基于上下文自适应的二进制算术编码。本文对CABAC的基本原理进行了详细的介绍和分析,下篇文章将会对H264编码中的CABAC熵编码的实际应用进行介绍。

尹佑壮的博客 3879

fastdb分析

因为项目中使用的fastdb,前2天的面试也有所提到,就想着要仔细yanjiu

huanzai2的专栏 2275

YOLOv8改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归

现有基于IoU的损失函数存在不合理的惩罚因子,导致锚框在回归过程中出现面积扩大的问题,使得回归效率降低、收敛速度变慢。同时,这些损失函数在反映锚框与目标框之间的差异、考虑目标框大小以及某些情况下的性能表现等方面存在局限性。在目标检测任务中,边界框回归的损失函数对检测性能至关重要。Powerful-IoU(PIoU)及其升级版PIoU v2正是为解决现有损失函数存在的问题而设计的。本文利用PIoU改进YOLOv8的损失函数,提高模型精度。

Limiiiing的博客 672

内存数据库FastDB和SQLite性能测评

一、引言在很多项目中,经常会碰到这样的需求,需要对大量数据进行快速存储、查询、删除等操作,特别是在一些针对诸如运营商、银行等大型企业的应用中,这些需求尤为常见。比如智能网中的大量在线并发用户的数据管理、软交换平台中的在线信息交互、宽带/3G等数据网中在线用户行为记录等等。针对这些

1600

大数据开发工程师必备面试题与解答

大数据开发岗位一直是互联网行业的热门方向,面试过程中既考察基础知识,也关注实际项目经验和问题解决能力。本文整理了等核心组件相关的高频面试题及参考解答,帮助大家高效准备面试。大数据面试不仅考察基础理论,更看重项目经验与问题解决能力。本文涵盖了等核心知识点及调优思路,希望能帮助你在面试中游刃有余。

X2829352498的博客 302

智能工厂评估模型研究

摘要:通过对国内外现有智能制造评估模型的研究,结合重庆制造业行业领跑者与落后者之间差距大的现状,以实现全要素全连接的数字化工厂为出发点,融合工业互联网标识,构建实践可行的智能工厂评估模型推动中小型企业参与智能制造转型,缓和两极分化问题。本评估模型包含工厂体系架构的3个层级,提供用于推动智能制造转型的参考,包括设计、生产、管理的全过程评估。关键词:智能制造评估模型;智能制造转型;全连接工厂;工业互联网标识0 引言受行业需求与技术创新的影响,全球制造业在历经了工业1.0机械化、工业2.0电气化和工业3.0自动

罗伯特技术屋 676

【亲测免费】 FastDFS-Client 1.27.2:高效、易用的分布式文件系统Java客户端

FastDFS-Client 1.27.2 是一个专为 [FastDFS](https://github.com/happyfish100/fastdfs) 设计的 Java 客户端库。该项目在原作者的基础上进行了大量重构,旨在提高代码的可读性和易用性,使得 Java 开发者能够更轻松地集成和使用 FastDFS。当前版本已通过所有单元测试,支持 FastDFS 服务端版本 FastDFS_V5....

gitblog_00719的博客 722

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FASTDB中文手册

fastdb 简介查询语言 一、介绍 FastDb 是高效的内存数据库系统,具备实时能力及便利的C++接口。FastDB 不支持 client-server 架构因而所有使用FastDB的应用程序必须运行在同一主机上。FastDB针对应 用程序通过控制读访问模式作了优化。通过降低数据传输的开销和非常有效的锁机制提供了 高速的查询。对每一个使用数据库的应用数据库文件被影射到虚拟内存空间中。

弧光的专栏 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

fastdb 简介 查询语言

一、介绍 FastDb是高效的内存数据库系统,具备实时能力及便利的C++接口。FastDB不支持client-server架构因而所有使用FastDB的应用程序必须运行在同一主机上。FastDB针对应用程序通过控制读访问模式作了优化。通过降低数据传输的开销和非常有效的锁机制提供

2245

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[转]FastDb介绍

第一章 介绍  FastDb是高效的内存数据库系统,具备实时能力及便利的C++接口。FastDB不支持client-server架构因而所有使用FastDB的应用程序必须运行在同一主机上。(现在已经有了cli接口,所以这句话已不适用)FastDB针对应用程序通过控制读访问模式作了优化。通过降低数据传输的开销和非常有效的锁机制提供了高速的查询。对每一个使用数据库的应用数据库文件被影射到虚拟内存空间

fuyun10036的专栏 1万+

FastDB 很难得的一篇分析

c++ 接口 fastdb主要的目标之一就是提供一个灵活并且方便的应用语言接口。任何使用过odbc或者类似的sql接口的人会明白我说的是什么。在fastdb中,一个查询可以用c++写成下面的样子:       dbQuery q;     dbCursor contra

1万+

fastDB学习笔记

FastDB基本情况: Fastdb内部采用C/C++实现,支持各种面向对象的特性:数据库定义时支持类的继承,属性可以是数组,对象引用(关联)。 不足: 1.   FastDB 不能单独取出特定记录的特定属性,只能取出完整的记录。 2. FastDB 在建表的时候支持继承

5158

fastdb c++接口

分类: fastDB翻译 c++ 接口 fastdb主要的目标之一就是提供一个灵活并且方便的应用语言接口。任何使用过odbc或者类似的sql接口的人会明白我说的是什么。在fastdb中,一个查询可以用c++写成下面的样子: dbQuery q;

3165
上一篇: Fastdb安装与使用
下一篇: FastDB 磁盘和无盘模式
土豆西瓜大芝麻
博客等级 码龄18年 1189粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值