暢想數(shù)據(jù)庫管理系統(tǒng)(CXDB)介紹_第1頁
暢想數(shù)據(jù)庫管理系統(tǒng)(CXDB)介紹_第2頁
暢想數(shù)據(jù)庫管理系統(tǒng)(CXDB)介紹_第3頁
暢想數(shù)據(jù)庫管理系統(tǒng)(CXDB)介紹_第4頁
暢想數(shù)據(jù)庫管理系統(tǒng)(CXDB)介紹_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

CXDB介紹高屹2011-08-13暢想數(shù)據(jù)庫管理系統(tǒng)(以下簡稱“系統(tǒng)”或“CXDB”)是一個小型內(nèi)嵌式數(shù)據(jù)庫管理系統(tǒng)。本文檔的目的:讓您能夠用5分鐘的時間對系統(tǒng)有一個概要的了解,再用15分鐘時間簡單體驗系統(tǒng)功能。CXDB的特性內(nèi)嵌式的數(shù)據(jù)庫CXDB的整個系統(tǒng)實現(xiàn)在一個DLL文件中,以API函數(shù)的形式提供編程接口。開發(fā)者在程序中調(diào)用這些接口函數(shù),就可以完成全部的數(shù)據(jù)庫操作,數(shù)據(jù)庫操作就在您的程序中,是您程序不可分割的一部分。這個DLL文件很小,只有幾百K。加密的數(shù)據(jù)庫十多年前開發(fā)MIS系統(tǒng)時,用戶經(jīng)常要求數(shù)據(jù)在數(shù)據(jù)庫內(nèi)部是加密存儲的,都被我嚴(yán)詞拒絕,做不到。后來倒是再沒人提這種要求,一方面是人家也知道做不到,另一方面人家對系統(tǒng)安全性也有了綜合的認(rèn)識,不再一味強(qiáng)調(diào)加密。但那時的印象挺深刻,所以當(dāng)真的要實現(xiàn)自己的數(shù)據(jù)庫時,第一個想法就是:數(shù)據(jù)在數(shù)據(jù)庫內(nèi)部要加密存儲。這不一定是好事,因為加密造成性能的下降很明顯,參《CXDB編程參考》中“性能測試”一章。開發(fā)者的數(shù)據(jù)庫作為一種后臺支持,任何數(shù)據(jù)庫都是“開發(fā)者”的。最終用戶一般不直接接觸數(shù)據(jù)庫,所以我一直不太明白哪兒來那么多數(shù)據(jù)庫方面的專家。但一般的數(shù)據(jù)庫都需要比較復(fù)雜的管理工作,比如我經(jīng)常會幫別人重裝數(shù)據(jù)庫或恢復(fù)數(shù)據(jù),所以,一般的數(shù)據(jù)庫還是“管理者”的。使用CXDB沒有管理工作,不需要安裝,CXDB的所有數(shù)據(jù)被保存在一個操作系統(tǒng)文件中,開發(fā)者指定文件路徑就行了。另外,會隨CXDB附贈一個用戶界面非常友好的圖形化管理工具——CXDBManager。該工具樸實而細(xì)膩,完全可以作為“開發(fā)期工具”使用。學(xué)習(xí)型數(shù)據(jù)庫系統(tǒng)的作者長期從事數(shù)據(jù)庫和數(shù)據(jù)結(jié)構(gòu)教學(xué),非常希望CXDB能夠用于數(shù)據(jù)庫學(xué)習(xí)。CXDB的SQL命令語法完全模仿Oracle(做了一定的簡化),執(zhí)行效果也與Oracle幾乎完全相同。因此,在學(xué)習(xí)數(shù)據(jù)庫的初始階段使用本系統(tǒng)進(jìn)行實踐未嘗不是一個好的選擇。CXDBManager是綠色軟件,免安裝,用它來做演示和實驗都很方便。中小型的數(shù)據(jù)庫對于數(shù)據(jù)庫來說,“大型”和“小型”不是一個嚴(yán)格的概念。雖然經(jīng)常有人這么說,但沒有人來做準(zhǔn)確定義。但是,“大型”和“小型”又不僅僅是一個相對的概念,其差別不在于它們各自能存儲多少T的數(shù)據(jù),“大型”需要復(fù)雜的體系結(jié)構(gòu)支撐。設(shè)計特性決定了CXDB不會成為一個大型的數(shù)據(jù)庫。盡管CXDB在外部特性上模仿Oracle,但內(nèi)部機(jī)制差別巨大。將CXDB設(shè)計為一個小型數(shù)據(jù)庫,是我略有自知之明的表現(xiàn)。但在CXDB的設(shè)計之中加入了很多高級特性,且為將來的擴(kuò)充預(yù)留了空間,因此,如果正常發(fā)展下去,CXDB會成為一個“中型”數(shù)據(jù)庫。CXDB的未來現(xiàn)在的系統(tǒng)遠(yuǎn)不是CXDB的最終目標(biāo)。其實CXDB沒有最終目標(biāo)。雖然隱約地想過一些事,想想而已,沒太想明白,更不想說出來變成對自己的約束。但有些事是清楚的,是我最初設(shè)計時的打算,一定要做到。為了節(jié)省時間,您可以跳過本章,先看后面的內(nèi)容,反正還沒實現(xiàn)呢。實用的數(shù)據(jù)庫我從來都是做實用的系統(tǒng),有沒有人用另說,至少得讓人家能用。不能把CXDB做成一個演示系統(tǒng),不能讓選擇CXDB的人后悔。系統(tǒng)目前已經(jīng)做了初步的性能測試,特別是針對大數(shù)據(jù)量和多線程進(jìn)行了測試,可以說目前已初步可用。事實上,系統(tǒng)已經(jīng)在幾個實際項目中得到了應(yīng)用。提供十進(jìn)制的精度有些小型數(shù)據(jù)庫對數(shù)值數(shù)據(jù)僅提供整數(shù)、實數(shù)等類型支持。CXDB既然模仿了Oracle的Number類型,就得提供十進(jìn)制的數(shù)據(jù)精度,保證能夠存儲商業(yè)數(shù)據(jù)。自主的內(nèi)存管理現(xiàn)在CXDB仍然調(diào)用malloc來進(jìn)行內(nèi)存分配。由于數(shù)據(jù)庫處理的數(shù)據(jù)類型與一般編程語言(如C語言)所能表達(dá)的數(shù)據(jù)類型差距甚大,所以CXDB在運行的過程中經(jīng)常需要動態(tài)地申請內(nèi)存。malloc既不安全又費時,這一直是我的心病。將來CXDB一定要自主地管理內(nèi)存,關(guān)鍵是我“想”實現(xiàn)這一部分功能。數(shù)據(jù)庫服務(wù)器CXDB在設(shè)計上僅支持線程間的共享,不允許多個進(jìn)程同時打開相同的數(shù)據(jù)庫文件。這看似限制,其實是為將來實現(xiàn)為一個數(shù)據(jù)庫服務(wù)器做準(zhǔn)備。ODBC接口實現(xiàn)實用的ODBC接口,可對本地或遠(yuǎn)程的CXDB進(jìn)行訪問。既能提高編程的方便性,又能擴(kuò)大CXDB的適用范圍,還省得為各類編程工具設(shè)計控件??缙脚_系統(tǒng)用C語言實現(xiàn),具備了跨平臺的可能性。目前在Windows上實現(xiàn),將來至少要移植到Linux上。其它的增強(qiáng)LOB字段的處理能力,觸發(fā)器,PL/SQL等。數(shù)據(jù)庫的開發(fā)是如此好玩兒,能想到的我都想做,但上述內(nèi)容是必做的。系統(tǒng)初體驗現(xiàn)在就可以使用CXDBManager來體驗CXDB了。CXDBManager的可執(zhí)行文件在Bin子目錄下。一般操作CXDBManager的主界面如圖:使用它可以對多個數(shù)據(jù)庫(文件)進(jìn)行管理。界面左側(cè)的樹型視圖(TreeView)中列出了當(dāng)前管理的所有數(shù)據(jù)庫(一級結(jié)點)。每個數(shù)據(jù)庫,又可對其中的表、視圖、索引和序列等對象進(jìn)行管理。注:“數(shù)據(jù)庫”是一個含義相當(dāng)寬范的概念。CXDB將一個數(shù)據(jù)庫中所有的對象都存儲在一個操作系統(tǒng)文件中,因此,下文在不會混淆的情況下,“數(shù)據(jù)庫”也可能代表一個數(shù)據(jù)庫文件,也可能代表一個數(shù)據(jù)庫連接。單擊工具欄中的按鈕,可以創(chuàng)建一個新的“數(shù)據(jù)庫連接”,如下圖。CXDB通過數(shù)據(jù)庫連接對特定的數(shù)據(jù)庫文件進(jìn)行操作:“數(shù)據(jù)庫別名”用于在界面左側(cè)的樹型視圖中顯示?!皵?shù)據(jù)文件名”由用戶指定,文件可以存在也可以不存在。如果已經(jīng)存在,就是打開;如果不存在,就是創(chuàng)建。工具欄中的等三個按鈕用于打開、關(guān)閉和刪除當(dāng)前的數(shù)據(jù)庫連接。雙擊某個數(shù)據(jù)庫結(jié)點也可以打開該數(shù)據(jù)庫連接。系統(tǒng)主界面的左側(cè)是一個樹型視圖控件,一級結(jié)點為當(dāng)前管理的所有數(shù)據(jù)庫。每個數(shù)據(jù)庫,又可對其中的表、視圖、索引和序列等對象進(jìn)行管理。在代表不同對象的結(jié)點上單擊鼠標(biāo)右鍵,可彈出不同的功能菜單,如下圖。單擊左側(cè)樹型視圖上不同結(jié)點時,界面右側(cè)會列表該結(jié)點對應(yīng)類型的所有數(shù)據(jù)庫對象。在不同類型的對象上單擊鼠標(biāo)右鍵,可彈出不同的功能菜單。如果在表對象上單擊右鍵,所彈出的菜單如下圖。如果分別在視圖、索引和序列對象上單擊右鍵,所彈出的菜單如下面各圖。如果雙擊列表中的某個對象,將執(zhí)行該類對象的“設(shè)計”操作。執(zhí)行SQL語句單擊工具欄中的按鈕,打開“執(zhí)行SQL語句”窗口,可直接輸入SQL語句對當(dāng)前數(shù)據(jù)庫進(jìn)行操作,如圖:界面上部顯示當(dāng)前操作的數(shù)據(jù)庫。用戶可在窗口上部的文本框中輸入SQL語句,并按“執(zhí)行”按鈕執(zhí)行該語句。執(zhí)行結(jié)果顯示在下部“消息輸出”頁上的文本框中,包括語句執(zhí)行成功或失敗的提示信息等。如果執(zhí)行的是查詢語句,查詢的結(jié)果集還會顯示在“列表輸出”頁的列表中。系統(tǒng)會保存剛剛執(zhí)行過的數(shù)條SQL語句,按“↑前一條命令”按鈕回到上一條命令,按“↓后一條命令”按鈕到下一條。在所有SQL語句中,語法最復(fù)雜但又最常用的是Select語句。如果您對Select語句的語法還不夠熟悉,可按“生成Select語句”按鈕,用系統(tǒng)提供的圖形化工具來生成Select語句;即使您對Select語句的語法很熟悉,也可使用該功能減少輸入工作量。生成Select語句的界面如下圖所示。示例SQL語句示例數(shù)據(jù)庫dept.db中已經(jīng)有兩個表,DEPT和EMP。用過Oracle的人可能都知道這兩個表吧,您可以在這兩個表上測試您當(dāng)初用過的相關(guān)SQL語句。下面提供另外一些示例SQL語句,放在此文檔中是為了方便您復(fù)制執(zhí)行,使您能用較短的時間對CXDB多一些了解。以下語句的執(zhí)行結(jié)果在示例數(shù)據(jù)庫dd1.db中。關(guān)于CXDB支持的SQL命令,請參考《CXDB語言參考》。--創(chuàng)建一個新表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;--修改數(shù)據(jù)UPDATEaaaSETbbb='aa1aaa'WHEREccc=111;UPDATEaaaSETbbb='aa1'WHEREccc=111;--刪除部分?jǐn)?shù)據(jù)DELETEFROMaaaWHEREccc>=444ANDccc<=555;--創(chuàng)建一個新的索引CREATEINDEXaaa_idxONaaa(ccc);關(guān)于并發(fā)與共享CXDB支持線程間的并發(fā)與共享,在CXDB內(nèi)部稱為連接間或事務(wù)間的并發(fā)與共享。CXDBManager的“執(zhí)行SQL語句”窗口被設(shè)計為非模式窗口,執(zhí)行SQL命令時都是另外啟動線程執(zhí)行,可對這部分功能進(jìn)行測試。示例一:互斥本示例演示線程間的互斥。打開兩個“執(zhí)行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;事務(wù)1提交。此時如果查詢,結(jié)果為:select*fromt;F1F2a4b4c3T2:(此時事務(wù)2有反應(yīng)了)已更新3行。此時如果查詢,結(jié)果為:select*fromt;F1F2a5b5c5commit;事務(wù)2提交。此時在兩個窗口中分別查詢,結(jié)果都為:select*fromt;F1F2a5b5c5示例二:死鎖CXDB能夠檢測到死鎖的發(fā)生,并對引發(fā)死鎖的事務(wù)的當(dāng)前命令報錯。createtablea(avarchar(10)primarykey,bnumber(5));T2:updateaseta='a'wherea='e';在試圖對表進(jìn)行修改時,已經(jīng)對表a自動加M鎖。T1:updatetsetf2=5wheref1='e';在試圖對表進(jìn)行修改時,已經(jīng)對表t自動加M鎖。T2:locktabletinsharemode;顯式地請求對表t加共享鎖,阻塞。T1:locktableainsharemode;命令執(zhí)行報錯。錯誤代碼:42。錯誤信息:對表A加鎖時死鎖。rollback;回卷過程中會對本事務(wù)加鎖的表解鎖。T2:有反應(yīng)了,加鎖成功。編程基于CXDB的編程這里不詳述,僅給出一個C程序示例。通過這個示例,您會對CXDB的編程有一個概要的了解。該程序的功能是:創(chuàng)建(或打開)一個數(shù)據(jù)庫,創(chuàng)建一個表,向表中插入幾條記錄,查詢并顯示該表的數(shù)據(jù),最后將表刪除。#include<stdio.h>#include"CXDBInterface.h"staticConn*conn=NULL;staticRecordset*rs=NULL;voidmain(){ intrt=RT_OK; inti,nCol; /*打開數(shù)據(jù)庫*/ rt=CXDB_open("test1.db",&conn,1); if(rt==RT_OK) printf("打開數(shù)據(jù)庫文件成功。\n"); else { printf("打開數(shù)據(jù)庫文件失敗,返回碼:%d。\n",rt); return; } /*創(chuàng)建一個表*/ rt=CXDB_exec(conn,"createtablet(f1varchar(10)primarykey,f2number(5))",NULL); if(rt!=RT_OK) gotoexecExit; else printf("創(chuàng)建表成功。\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"); /*查詢表中數(shù)據(jù)*/ printf("查詢數(shù)據(jù)...\n"); rt=CXDB_exec(conn,"select*fromt",&rs); /*執(zhí)行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("查詢數(shù)據(jù)成功,共查到%d條記錄。\n",CXDB_affectedrows(conn)); } /*刪除表*/ r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論