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