就个人理解而言,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
#endifUSE_FASTDB_NAMESPACEREGISTER(CLog);int _tmain(int argc, _TCHAR* argv[])
{   //由于不关闭数据库的话,内存占用会越来越大,所以定时重启数据库while(1){dbDatabase* m_pdb;m_pdb = NULL;size_t dbInitSize = 16 * 1024 * 1024;           // 16M  指定了数据库文件的初始大小   缺省值为4MBsize_t dbExtensionQuantum = 1 * 1024 * 1024;        //  1M  内存分配位图的扩展量子     缺省值为4MBsize_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   -5int 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,重连间隔1sif (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.csdn.net/fuyun10036/article/details/8620816

FastDb client-server模式相关推荐

  1. JVM Server与Client运行模式

    为什么80%的码农都做不了架构师?>>>    JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很 ...

  2. java server模式 设置_JVM client模式和Server模式的区别

    这里向大家描述一下JVM client模式和Server模式两者的区别和联系,JVM如果不显式指定是-Server模式还是-client模式,JVM能够根据下列原则进行自动判断(适用于Java5版本或 ...

  3. java内存泄漏跟栈溢出,8.《深入理解Java虚拟机》内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别...

    内存溢出和内存泄露的区别 内存溢出:指的是程序在申请内存的时候,没有足够大的空间可以分配了. 内存泄露:指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可达但无 ...

  4. linux虚拟机cpu高耗gc,Tomcat服务器-并发压力测试下调优注意点小结 JVM client模式和Server模式的区别 jvm 参数优化---笔记 tomcat查看GC信息...

    1.Tomcat conf中server.xml有个重要的性能配置,根据机器的硬件性能合理的配置常驻线程数以及最大线程数,还有等待队列线程数: connectionTimeout="1200 ...

  5. Client/Server 和 Browser/Server 模式的区别

    客户端/服务器模式:设备(客户端)的软件和服务器上的软件进行通信,设备上的软件和服务器上的软件必须匹配,而且只有某些设备和操作系统才支持. 浏览器/服务器模式:在任何含有Internet浏览器的设备( ...

  6. 深入浅出 Redis client/server交互流程

    2019独角兽企业重金招聘Python工程师标准>>> 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文 ...

  7. Hello Blazor:(7)WebAssembly、Server模式你选哪种?小孩子才做选择!我用混合模式...

    在上次的文章中,我们介绍了"Blazor WebAssembly和Blazor Server的区别".它们各有优缺点. Blazor WebAssembly的优势在于运行期间可以和 ...

  8. BS(Brower/Server)浏览器/服务器 和 C/S (Client/Server)客户端/服务器 的区别

    1,B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Internet Explorer或Netscape Navigator,服务器安装Oracle.Syba ...

  9. 基础:BS(Browser/Server)、CS(Client/Server)架构

    一.BS(Browser/Server) 所有浏览器应用都是BS架构. BS(Browser/Server):浏览器 / 服务器结构.BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区 ...

  10. 用户自定义协议client/server代码示例

    用户自定义协议client/server代码示例 代码参考链接:https://github.com/sogou/workflow message.h message.cc server.cc cli ...

最新文章

  1. 029 浏览器不能访问虚拟机的问题解决
  2. R假设检验之Jarque-Bera检验(Jarque-Bera Test)
  3. C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
  4. LeetCode 668. 乘法表中第k小的数(二分查找)
  5. php关键技术,基于Apache+MySQL+PHP的关键技术分析
  6. Qt部件学习之-烧鹅
  7. 电脑太慢了最简单的办法怎么弄_最简单快速的方法恢复电脑误删文件-数据恢复常见问题...
  8. 重新认识Java包的命名规则
  9. 电影推荐之《白鹿原》 隐私策略(Privacy policy)
  10. 超能竞速大开眼界,iQOO 5系列正式发布
  11. 免费自制app软件:在线生成APP只需一个URL
  12. uncheck关键字
  13. git如何查看缓存区文件内容_[暂存盘已满怎么解决]git暂存区的理解
  14. 网页地址栏?和的意义
  15. Mysql - 带条件求和(sum)
  16. eNSP不同网段主机互联-DHCP
  17. tcpdump 侦测网络端口数据
  18. 网络对抗 Exp9 Web安全基础 20154311 王卓然
  19. html+js在前端实现条码枪功能Demo
  20. 队列和堆栈 --- 先进先出和先进后出

热门文章

  1. Java 解析pdf文档内容实战案例
  2. 电子邮箱地址怎么写?
  3. Excel - SUM和ABS函数联合使用
  4. 图相似度模型(论文篇)
  5. SharePoint Online 触发的Automate工作流的调试
  6. IT男的魔都10年及N次面试 - 如何在500强升职顺便搞定漂亮MM
  7. 无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系查明你是否有访问权限。
  8. 37个自学网站,一年让你省下十几万
  9. 树莓派获取root权限
  10. 解决:本地计算机无法复制文件到远程计算机