這兩天項(xiàng)目中用到了BerkeleyDB,我們使用的是JAVA版,這是一個(gè)純JAVA寫的嵌入式數(shù)據(jù)庫,提供了很高的數(shù)據(jù)訪問和查詢速度,在并發(fā)的情況下表現(xiàn)也非常好,測試中在數(shù)據(jù)量比較小的時(shí)候每插一萬條數(shù)據(jù)只需要2秒,隨著數(shù)據(jù)量增大到百萬級(jí)以后這個(gè)數(shù)字逐漸穩(wěn)定在5-10秒左右,這個(gè)速度甚至超過了MYSQL內(nèi)存表的速度,用JAVA能寫出這么高性能的數(shù)據(jù)庫確實(shí)很讓人震撼,但是稍微考慮一下之所以可以這么快應(yīng)該有以下原因:
1:使用JDBC連接MYSQL有TCP傳輸?shù)拈_銷,而BerkeleyDB因?yàn)槭乔度胧綌?shù)據(jù)庫,所以沒有這層開銷。
2:在MYSQL中插入數(shù)據(jù)是通過SQL語句,BerkeleyDB為直接api調(diào)用,少了一層SQL解析的開銷。
3:MYSQL是一個(gè)可靠的數(shù)據(jù)庫,每一條數(shù)據(jù)都要求準(zhǔn)確的寫入表中,每一次查詢都需要查出準(zhǔn)確的結(jié)果,而BerkeleyDB是一個(gè)不可靠的數(shù)據(jù)庫,對(duì)響應(yīng)速度和執(zhí)行速度要求更高,對(duì)數(shù)據(jù)的準(zhǔn)確性要求不是那么高,這樣就可以為了速度犧牲準(zhǔn)確性,提以供更高的性能。(BerkeleyDB也可以設(shè)置一些參數(shù)達(dá)到準(zhǔn)確性,這樣性能肯定不會(huì)這么高了)
在實(shí)際項(xiàng)目的使用中,用起來還是比較簡單,BerkeleyDB的設(shè)計(jì)是基于鍵值對(duì)的模式,用起來不用寫SQL語句,剛開始可能會(huì)不太習(xí)慣。每個(gè)實(shí)體里面可以設(shè)置一個(gè)主鍵和多個(gè)次鍵,看著文檔基本上用是沒什么問題的,注意幾點(diǎn)就可以了。
1.
讀數(shù)據(jù)的時(shí)候,用完cursor一定要關(guān)掉,不然下次插入會(huì)報(bào)死鎖的錯(cuò)誤。
2.程序退出時(shí),如果不想數(shù)據(jù)庫里數(shù)據(jù)丟失的話,一定要調(diào)用close方法,這時(shí)它才會(huì)自動(dòng)把數(shù)據(jù)寫到硬盤里,如果你直接kill的話是肯定會(huì)丟數(shù)據(jù)的。
3.
想查數(shù)據(jù)庫里面有那些數(shù)據(jù),因?yàn)闆]有mysql那樣的客戶端,是比較麻煩的,只有通過應(yīng)用自己才會(huì)知道,如果需要在外部查的話,建議自己在應(yīng)用進(jìn)程中實(shí)現(xiàn)一個(gè)whois接口。
4.絕對(duì)不能用在對(duì)數(shù)據(jù)準(zhǔn)確性要求高的地方,出了問題哭都沒地方哭去,最好就是用來做緩存,對(duì)插入和更新性能要求很高,數(shù)據(jù)丟了也無所謂的場合。