畅想数据库管理系统(CXDB)介绍_第1页
畅想数据库管理系统(CXDB)介绍_第2页
畅想数据库管理系统(CXDB)介绍_第3页
畅想数据库管理系统(CXDB)介绍_第4页
畅想数据库管理系统(CXDB)介绍_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CXDB介绍高屹2011-08-13畅想数据库管理系统(以下简称“系统”或“CXDB”)是一个小型内嵌式数据库管理系统。本文档的目的:让您能够用5分钟的时间对系统有一个概要的了解,再用15分钟时间简单体验系统功能。CXDB的特性内嵌式的数据库CXDB的整个系统实现在一个DLL文件中,以API函数的形式提供编程接口。开发者在程序中调用这些接口函数,就可以完成全部的数据库操作,数据库操作就在您的程序中,是您程序不可分割的一部分。这个DLL文件很小,只有几百K。加密的数据库十多年前开发MIS系统时,用户经常要求数据在数据库内部是加密存储的,都被我严词拒绝,做不到。后来倒是再没人提这种要求,一方面是人家也知道做不到,另一方面人家对系统安全性也有了综合的认识,不再一味强调加密。但那时的印象挺深刻,所以当真的要实现自己的数据库时,第一个想法就是:数据在数据库内部要加密存储。这不一定是好事,因为加密造成性能的下降很明显,参《CXDB编程参考》中“性能测试”一章。开发者的数据库作为一种后台支持,任何数据库都是“开发者”的。最终用户一般不直接接触数据库,所以我一直不太明白哪儿来那么多数据库方面的专家。但一般的数据库都需要比较复杂的管理工作,比如我经常会帮别人重装数据库或恢复数据,所以,一般的数据库还是“管理者”的。使用CXDB没有管理工作,不需要安装,CXDB的所有数据被保存在一个操作系统文件中,开发者指定文件路径就行了。另外,会随CXDB附赠一个用户界面非常友好的图形化管理工具——CXDBManager。该工具朴实而细腻,完全可以作为“开发期工具”使用。学习型数据库系统的作者长期从事数据库和数据结构教学,非常希望CXDB能够用于数据库学习。CXDB的SQL命令语法完全模仿Oracle(做了一定的简化),执行效果也与Oracle几乎完全相同。因此,在学习数据库的初始阶段使用本系统进行实践未尝不是一个好的选择。CXDBManager是绿色软件,免安装,用它来做演示和实验都很方便。中小型的数据库对于数据库来说,“大型”和“小型”不是一个严格的概念。虽然经常有人这么说,但没有人来做准确定义。但是,“大型”和“小型”又不仅仅是一个相对的概念,其差别不在于它们各自能存储多少T的数据,“大型”需要复杂的体系结构支撑。设计特性决定了CXDB不会成为一个大型的数据库。尽管CXDB在外部特性上模仿Oracle,但内部机制差别巨大。将CXDB设计为一个小型数据库,是我略有自知之明的表现。但在CXDB的设计之中加入了很多高级特性,且为将来的扩充预留了空间,因此,如果正常发展下去,CXDB会成为一个“中型”数据库。CXDB的未来现在的系统远不是CXDB的最终目标。其实CXDB没有最终目标。虽然隐约地想过一些事,想想而已,没太想明白,更不想说出来变成对自己的约束。但有些事是清楚的,是我最初设计时的打算,一定要做到。为了节省时间,您可以跳过本章,先看后面的内容,反正还没实现呢。实用的数据库我从来都是做实用的系统,有没有人用另说,至少得让人家能用。不能把CXDB做成一个演示系统,不能让选择CXDB的人后悔。系统目前已经做了初步的性能测试,特别是针对大数据量和多线程进行了测试,可以说目前已初步可用。事实上,系统已经在几个实际项目中得到了应用。提供十进制的精度有些小型数据库对数值数据仅提供整数、实数等类型支持。CXDB既然模仿了Oracle的Number类型,就得提供十进制的数据精度,保证能够存储商业数据。自主的内存管理现在CXDB仍然调用malloc来进行内存分配。由于数据库处理的数据类型与一般编程语言(如C语言)所能表达的数据类型差距甚大,所以CXDB在运行的过程中经常需要动态地申请内存。malloc既不安全又费时,这一直是我的心病。将来CXDB一定要自主地管理内存,关键是我“想”实现这一部分功能。数据库服务器CXDB在设计上仅支持线程间的共享,不允许多个进程同时打开相同的数据库文件。这看似限制,其实是为将来实现为一个数据库服务器做准备。ODBC接口实现实用的ODBC接口,可对本地或远程的CXDB进行访问。既能提高编程的方便性,又能扩大CXDB的适用范围,还省得为各类编程工具设计控件。跨平台系统用C语言实现,具备了跨平台的可能性。目前在Windows上实现,将来至少要移植到Linux上。其它的增强LOB字段的处理能力,触发器,PL/SQL等。数据库的开发是如此好玩儿,能想到的我都想做,但上述内容是必做的。系统初体验现在就可以使用CXDBManager来体验CXDB了。CXDBManager的可执行文件在Bin子目录下。一般操作CXDBManager的主界面如图:使用它可以对多个数据库(文件)进行管理。界面左侧的树型视图(TreeView)中列出了当前管理的所有数据库(一级结点)。每个数据库,又可对其中的表、视图、索引和序列等对象进行管理。注:“数据库”是一个含义相当宽范的概念。CXDB将一个数据库中所有的对象都存储在一个操作系统文件中,因此,下文在不会混淆的情况下,“数据库”也可能代表一个数据库文件,也可能代表一个数据库连接。单击工具栏中的按钮,可以创建一个新的“数据库连接”,如下图。CXDB通过数据库连接对特定的数据库文件进行操作:“数据库别名”用于在界面左侧的树型视图中显示。“数据文件名”由用户指定,文件可以存在也可以不存在。如果已经存在,就是打开;如果不存在,就是创建。工具栏中的等三个按钮用于打开、关闭和删除当前的数据库连接。双击某个数据库结点也可以打开该数据库连接。系统主界面的左侧是一个树型视图控件,一级结点为当前管理的所有数据库。每个数据库,又可对其中的表、视图、索引和序列等对象进行管理。在代表不同对象的结点上单击鼠标右键,可弹出不同的功能菜单,如下图。单击左侧树型视图上不同结点时,界面右侧会列表该结点对应类型的所有数据库对象。在不同类型的对象上单击鼠标右键,可弹出不同的功能菜单。如果在表对象上单击右键,所弹出的菜单如下图。如果分别在视图、索引和序列对象上单击右键,所弹出的菜单如下面各图。如果双击列表中的某个对象,将执行该类对象的“设计”操作。执行SQL语句单击工具栏中的按钮,打开“执行SQL语句”窗口,可直接输入SQL语句对当前数据库进行操作,如图:界面上部显示当前操作的数据库。用户可在窗口上部的文本框中输入SQL语句,并按“执行”按钮执行该语句。执行结果显示在下部“消息输出”页上的文本框中,包括语句执行成功或失败的提示信息等。如果执行的是查询语句,查询的结果集还会显示在“列表输出”页的列表中。系统会保存刚刚执行过的数条SQL语句,按“↑前一条命令”按钮回到上一条命令,按“↓后一条命令”按钮到下一条。在所有SQL语句中,语法最复杂但又最常用的是Select语句。如果您对Select语句的语法还不够熟悉,可按“生成Select语句”按钮,用系统提供的图形化工具来生成Select语句;即使您对Select语句的语法很熟悉,也可使用该功能减少输入工作量。生成Select语句的界面如下图所示。示例SQL语句示例数据库dept.db中已经有两个表,DEPT和EMP。用过Oracle的人可能都知道这两个表吧,您可以在这两个表上测试您当初用过的相关SQL语句。下面提供另外一些示例SQL语句,放在此文档中是为了方便您复制执行,使您能用较短的时间对CXDB多一些了解。以下语句的执行结果在示例数据库dd1.db中。关于CXDB支持的SQL命令,请参考《CXDB语言参考》。--创建一个新表CREATETABLEaaa(bbbVARCHAR(20)PRIMARYKEY,cccNUMBER(10),dddDATEDEFAULTSYSDATE);--插入几条记录INSERTINTOaaaVALUES('aa1',111,'2001-01-01');INSERTINTOaaaVALUES('aa2',222,'2001-01-02');INSERTINTOaaaVALUES('aa3',333,'2001-01-03');INSERTINTOaaaVALUES('aa4',444,'2001-01-04');INSERTINTOaaaVALUES('aa5',555,'2001-01-05');INSERTINTOaaaVALUES('aa6',666,'2001-01-06');INSERTINTOaaa(bbb,ccc)VALUES('aa7',777);--提交COMMIT;--查询SELECT*FROMaaa;SELECTbbb,cccFROMaaa;SELECT*FROMaaaWHEREccc>300;SELECT*FROMaaaWHEREbbb>'aa3';SELECT*FROMaaaWHEREbbb>='aa3';SELECT*FROMaaaWHEREbbb<'aa3';SELECT*FROMaaaWHEREbbb<='aa3';SELECT*FROMaaaORDERBYbbbDESC;SELECT*FROMaaaWHEREbbb>'aa3'ANDccc<700;SELECT*FROMaaaWHEREccc<700ANDbbb>'aa3';SELECT*FROMaaaWHEREbbb>'aa3'ANDbbb>'aa5';SELECT*FROMaaaORDERBYccc;SELECT*FROMaaaWHEREccc>300ORDERBYccc;--修改数据UPDATEaaaSETbbb='aa1aaa'WHEREccc=111;UPDATEaaaSETbbb='aa1'WHEREccc=111;--删除部分数据DELETEFROMaaaWHEREccc>=444ANDccc<=555;--创建一个新的索引CREATEINDEXaaa_idxONaaa(ccc);关于并发与共享CXDB支持线程间的并发与共享,在CXDB内部称为连接间或事务间的并发与共享。CXDBManager的“执行SQL语句”窗口被设计为非模式窗口,执行SQL命令时都是另外启动线程执行,可对这部分功能进行测试。示例一:互斥本示例演示线程间的互斥。打开两个“执行SQL语句”窗口,分别为T1和T2。T1:createtablet(f1varchar(10)primarykey,f2number(5));insertintotvalues('a',1);insertintotvalues('b',2);insertintotvalues('c',3);commit;T1:updatetsetf2=4wheref2<=2;已更新2行。T2:updatetsetf2=5wheref2>=2;阻塞。T1:commit;事务1提交。此时如果查询,结果为:select*fromt;F1F2a4b4c3T2:(此时事务2有反应了)已更新3行。此时如果查询,结果为:select*fromt;F1F2a5b5c5commit;事务2提交。此时在两个窗口中分别查询,结果都为:select*fromt;F1F2a5b5c5示例二:死锁CXDB能够检测到死锁的发生,并对引发死锁的事务的当前命令报错。createtablea(avarchar(10)primarykey,bnumber(5));T2:updateaseta='a'wherea='e';在试图对表进行修改时,已经对表a自动加M锁。T1:updatetsetf2=5wheref1='e';在试图对表进行修改时,已经对表t自动加M锁。T2:locktabletinsharemode;显式地请求对表t加共享锁,阻塞。T1:locktableainsharemode;命令执行报错。错误代码:42。错误信息:对表A加锁时死锁。rollback;回卷过程中会对本事务加锁的表解锁。T2:有反应了,加锁成功。编程基于CXDB的编程这里不详述,仅给出一个C程序示例。通过这个示例,您会对CXDB的编程有一个概要的了解。该程序的功能是:创建(或打开)一个数据库,创建一个表,向表中插入几条记录,查询并显示该表的数据,最后将表删除。#include<stdio.h>#include"CXDBInterface.h"staticConn*conn=NULL;staticRecordset*rs=NULL;voidmain(){ intrt=RT_OK; inti,nCol; /*打开数据库*/ rt=CXDB_open("test1.db",&conn,1); if(rt==RT_OK) printf("打开数据库文件成功。\n"); else { printf("打开数据库文件失败,返回码:%d。\n",rt); return; } /*创建一个表*/ rt=CXDB_exec(conn,"createtablet(f1varchar(10)primarykey,f2number(5))",NULL); if(rt!=RT_OK) gotoexecExit; else printf("创建表成功。\n"); /*插入几条记录*/ rt=CXDB_exec(conn,"insertintotvalues('a',1)",NULL); if(rt!=RT_OK)gotoexecExit; rt=CXDB_exec(conn,"insertintotvalues('b',2)",NULL); if(rt!=RT_OK)gotoexecExit; rt=CXDB_exec(conn,"insertintotvalues('c',3)",NULL); if(rt!=RT_OK)gotoexecExit; /*提交*/ rt=CXDB_exec(conn,"commit",NULL); if(rt!=RT_OK) gotoexecExit; else printf("向表插入3条记录成功。\n"); /*查询表中数据*/ printf("查询数据...\n"); rt=CXDB_exec(conn,"select*fromt",&rs); /*执行SQL命令*/ if(rt==RT_OK) { if(rs) { rt=CXDB_rs_first(rs); if(rt==RT_OK) { nCol=CXDB_rs_column_count(rs); for(i=0;i<nCol;i++) { printf("%s",CXDB_rs_column_name(rs,i)); if(i<nCol-1)printf("|");elseprintf("\n"); } while(rt==RT_OK) { for(i=0;i<nCol;i++) { printf("%s",CXDB_rs_column_text(rs,i)); if(i<nCol-1)printf("|");elseprintf("\n"); } rt=CXDB_rs_next(rs); } } CXDB_rs_release(rs); } printf("查询数据成功,共查到%d条记录。\n",CXDB_affectedrows(conn)); } /*删除表*/ r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论