BerkeleyDB-JE 使用BaseAPI(一)

本篇開始介紹JE的具體使用。
在JE中,一個數據庫(database)就是一系列鍵值對的集合。你可以把JE中的數據庫理解爲只有兩個列的表,一個列是鍵,一個列是值。同時要注意的是,鍵和值可以是簡單的數據類型,比如數字型或字符串型,也可能是複雜的對象類型。我們可以使用database來管理鍵和值,比如對它們的增刪改操作。
下面演示打開和關閉database。

Environment myDbEnvironment = null;
Database database = null;
try {
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
myDbEnvironment = new Environment(new File("/export/dbEnv"),
envConfig);
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
database = env.openDatabase(null, "baseAPIDemo", dbConfig);

...
// do work
...
} catch (DatabaseException dbe) {
// Exception handling goes here
} finally{
database.close();
myDbEnvironment.close();
}

通常我們使用Environment來打開一個database,在打開的時候要指定這個database的名字。先打開Environment,再用這個Environment打開一個database,然後在所有事情做完後,要記得關閉database和Environment,先關閉database,再關閉Environment。

接着我們討論下database的屬性配置
跟Environment一樣,database也可以通過DatabaseConfig進行配置。
[list]
[*]DatabaseConfig.setAllowCreate()
設置當不存在該數據庫的時候是否創建一個新的庫
[*]DatabaseConfig.setBtreeComparator()
設置用來決定數據庫中記錄順序的排序器
[*]DatabaseConfig.setDuplicateComparator()
設置用來比較重複數據的排序器
[*]DatabaseConfig.setSortedDuplicates()
設置該數據庫是否允許重複的數據
[*]DatabaseConfig.setExclusiveCreate()
設置當存在該數據庫的時候是否會打開數據庫失敗
[*]DatabaseConfig.setReadOnly()
設置數據庫是否只讀
[*]DatabaseConfig.setTransactional()
設置事務屬性
[*]DatabaseConfig.setDeferredWrite()
設置延遲寫屬性
[*]DatabaseConfig.setTemporary()
設置該數據庫是否爲臨時數據庫(Temporary Databases)
[/list]
設置這些數據庫的屬性非常簡單,只要實例化一個DatabaseConfig對象,然後設置它,並在打開數據庫的時候傳入就可以了。以下演示下database屬性設置

DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setReadOnly(false);
dbConfig.setTransactional(false);
database = env.openDatabase(null, "baseAPIDemo", dbConfig);

以上關於排序器和重複數據的討論我們將放到後續章節中進行。我們現在重點討論兩個屬性:
[list]
[*]延遲寫數據庫(Deferred Write Databases)
默認情況下,數據庫會在操作的時候寫入變化到磁盤中,如果你使用了事務,那麼將會在事務提交的時候寫入變化。但是如果你啓用了延遲寫配置,數據庫不會把變化立即寫入,除非1.顯式的調用了Database.sync()方法;2.緩存滿了;3.到達了檢查點(checkpoint)。
延遲寫可以帶來以下兩個好處:
1.在多線程情況下,可以減少寫操作的瓶頸。
2.可以減少寫操作數據庫,比如你一條記錄你多次修改了它,那隻會最後一次的改變會被寫入到數據庫中。
數據庫也可以在延遲寫和普通庫之間進行轉換,比如你要加載很大量的數據到數據庫中,明顯的延遲寫數據庫相較於普通數據庫有更好的性能,這時你可以在加載大數據的時候設置延遲寫,在加載完畢之後一次性的寫入到數據庫中。然後關閉數據庫,再使用普通數據庫配置屬性打開。
設置DatabaseConfig.setDeferredWrite(true),可以讓數據庫變成延遲寫數據庫。

DatabaseConfig dbConfig = new DatabaseConfig();
// Make it deferred write
dbConfig.setDeferredWrite(true);
myDatabase = myDbEnvironment.openDatabase(null,
"sampleDatabase",
dbConfig);
...
// do work
...

myDatabase.sync();

[*]臨時數據庫(Temporary Databases)
這是一個很特殊的數據庫,打開臨時數據庫後,你可以像一般的數據庫一樣對它進行操作,但是在關閉這個數據庫後所有的數據將被清除。也就是說臨時數據庫中的數據不是持久性的。
並且臨時數據庫內部採用了延遲寫,但是這並不意味着臨時數據庫將不會發生I/O操作,當緩存滿的時候,數據庫仍然會把數據寫入到磁盤上。臨時數據庫擁有延遲寫數據庫的所有優點,但是有一點不同於延遲寫數據庫,它不會在到達檢查點的時候進行寫入。
設置DatabaseConfig.setTemporary(true),可以讓數據庫變成延遲寫數據庫。

DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setTemporary(true);
myDatabase = myDbEnvironment.openDatabase(null,
"sampleDatabase",
dbConfig);

[/list]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章