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

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論