berkeley db(bdb)是一個高效的嵌入式資料庫程式設計庫,c語言、c++、java、perl、python、tcl以及其他很多語言都有其對應的api。berkeley db可以儲存任意類型的鍵/值對(key/value pair),而且可以為一個鍵儲存多個資料。berkeley db支援讓數千的并發線程同時操作資料庫,支援最大256tb的資料,廣泛用于各種作業系統,其中包括大多數類unix作業系統、windows作業系統以及實時作業系統。
berkeley db在06年被 oracle 收購了,現在我們在 oracle 網站上會看到: berkeleydb、berkeleydb xml 和 berkeleydb java edition 這個三個東東。簡單的說最開始 berkeleydb 是隻有 c 語言版本的,但是 java 也可以使用,隻不過需要通過 jni 調用,效率可能有點影響。後來出了 java edition ,用純 java 實作了一遍,也就是我們看到的 berkeleydb java edition (簡稱 je )。
je是一個通用的事務保護的,100%純java(je不作任何jni調用)編寫的嵌入式資料庫。是以,它為java開發人員提供了安全高效的對任意資料的存儲和管理。
je 适合于管理海量的,簡單的資料。其中的記錄都以簡單的鍵值對儲存,即key/value對。由于它操作簡單,效率較高,是以受到了廣泛的好評。
je官網:
1. 大型資料庫的支援:它支援從1到數百萬級的資料量,資料庫的大小限制基本上受限于你的硬體支援。
2. 多線程,多程序支援:je讀寫操作都可以是多線程,使用記錄級鎖定為線程應用程式提供高并發性。此外,je使用死鎖逾時檢測的機制來確定不會有兩個線程無限期的死鎖。je允許多個程序通路同一個db,但在這種情況下, berkeley 隻允許一個線程進行寫操作,讀操作随意。
3. 事務:原子性,可恢複,隔離性。
4. 記憶體cache:為了減少io操作提高性能,将資料暫存在記憶體裡面。
5. 索引。
database.put(): 向資料庫寫入資料,如果不支援重複記錄,則會覆寫更新key對應的已有記錄
database.putnooverwrite():向資料庫寫入資料,但是如果key已經存在,不會覆寫已有資料(即使資料庫支援重複key)
database.putnodupdata():向資料庫寫入資料(該方法僅用于支援重複key的資料庫),如果key和value對應的記錄已經存在,那麼操作結果是:operationstatus.keyexist
database.get() :檢索key對應的記錄,如果沒有找到,操作結果傳回:operationstatus.notfound
database.getsearchboth() :根據key和value 檢索資料庫記錄,如果沒有找到,操作結果傳回:operationstatus.notfound
跟environment一樣,database也可以通過databaseconfig進行配置。
databaseconfig.setallowcreate()
設定當不存在該資料庫的時候是否建立一個新的庫
databaseconfig.setbtreecomparator()
設定用來決定資料庫中記錄順序的排序器
databaseconfig.setduplicatecomparator()
設定用來比較重複資料的排序器
databaseconfig.setsortedduplicates()
設定該資料庫是否允許重複的資料
databaseconfig.setexclusivecreate()
設定當存在該資料庫的時候是否會打開資料庫失敗
databaseconfig.setreadonly()
設定資料庫是否隻讀
databaseconfig.settransactional()
設定事務屬性
databaseconfig.setdeferredwrite()
設定延遲寫屬性
databaseconfig.settemporary()
設定該資料庫是否為臨時資料庫(temporary databases)
延遲寫資料庫
預設情況下,資料庫會在操作的時候寫入變化到磁盤中,如果你使用了事務,那麼将會在事務送出的時候寫入變化。但是如果你啟用了延遲寫配置,資料庫不會把變化立即寫入,除非1.顯式的調用了database.sync()方法;2.緩存滿了;3.到達了檢查點(checkpoint)。
延遲寫可以帶來以下兩個好處:
1.在多線程情況下,可以減少寫操作的瓶頸。
2.可以減少寫操作資料庫,比如你一條記錄你多次修改了它,那隻會最後一次的改變會被寫入到資料庫中。
資料庫也可以在延遲寫和普通庫之間進行轉換,比如你要加載很大量的資料到資料庫中,明顯的延遲寫資料庫相較于普通資料庫有更好的性能,這時你可以在加載大資料的時候設定延遲寫,在加載完畢之後一次性的寫入到資料庫中。然後關閉資料庫,再使用普通資料庫配置屬性打開。
設定databaseconfig.setdeferredwrite(true),可以讓資料庫變成延遲寫資料庫。
臨時資料庫
這是一個很特殊的資料庫,打開臨時資料庫後,你可以像一般的資料庫一樣對它進行操作,但是在關閉這個資料庫後所有的資料将被清除。也就是說臨時資料庫中的資料不是持久性的。
并且臨時資料庫内部采用了延遲寫,但是這并不意味着臨時資料庫将不會發生i/o操作,當緩存滿的時候,資料庫仍然會把資料寫入到磁盤上。臨時資料庫擁有延遲寫資料庫的所有優點,但是有一點不同于延遲寫資料庫,它不會在到達檢查點的時候進行寫入。
設定databaseconfig.settemporary(true),可以讓資料庫變成延遲寫資料庫。