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