FastDb client-server模式
来源:互联网 发布:c语言随机函数rand 编辑:程序博客网 时间:2024/06/05 05:01
就个人理解而言,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;int4ProcessNo;int4level;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;int4ProcessNo;int4level;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 SUCCESS1#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;}
- FastDb client-server模式
- FastDb client-server模式
- FastDb client-server模式
- log4cplus server client模式
- log4cplus server client模式
- 短信平台client-server模式
- JVM -server和-client模式
- JVM的Server/Client模式
- JVM的Client模式与Server模式
- JVM的server模式和client模式
- JVM的Server模式和Client模式
- 迎接Client/Server模式的回归
- jvm server和client模式切换
- JVM -client和-server模式性能比较
- JVM Server与Client运行模式
- hotspot 虚拟机的server和client模式
- JVM Client 和Server运行模式
- C/S模式也就是client/server
- Linux内核驱动之GPIO子系统-GPIO的使用
- POCO C++库学习和分析 -- 任务
- SharedPreferences
- Weblogic远程调试
- 2013,要阅读的书籍
- FastDb client-server模式
- 安装GCC
- JSTL标签
- 返回json格式数据的api提供网站
- 预编译与条件编译
- zoj1090
- SQL中 EXISTS 的用法简介
- 对AndroidRuntime的一点理解
- C语言32大关键字