Berkeley DB使用說明

關鍵字: berkeley db java edition 使用說明 嵌入式 數據庫
一、 簡介
Berkeley DB Java Edition (JE)是一個完全用JAVA寫的,它適合於管理海量的,簡單的數據。
l 能夠高效率的處理1到1百萬條記錄,制約JE數據庫的往往是硬件系統,而不是JE本身。
l 多線程支持,JE使用超時的方式來處理線程間的死瑣問題。
l Database都採用簡單的key/value對應的形式。
l 事務支持。
l 允許創建二級庫。這樣我們就可以方便的使用一級key,二級key來訪問我們的數據。
l 支持RAM緩衝,這樣就能減少頻繁的IO操作。
l 支持日誌。
l 數據備份和恢復。
l 遊標支持。
二、 獲取JE
JE下載地址:
http://www.oracle.com/technology/software/products/berkeley-db/je/index.html
解開包後 把JE_HOME/lib/je-<version>.jar 中的jar文件添加到你的環境變量中就可以使用je了。
相關幫助文檔可以參考 JE_HOME/docs/index.html
源代碼見JE_HOME/src/*.*
三、 JE常見的異常
DatabaseNotFoundException 當沒有找到指定的數據庫的時候會返回這個異常
DeadlockException 線程間死鎖異常
RunRecoveryException 回收異常,當發生此異常的時候,你必須得重新打開環境變量。
四、 關於日誌文件必須瞭解的六項
JE的日誌文件跟其他的數據庫的日誌文件不太一樣,跟C版的DBD也是有區別的
l JE的日誌文件只能APPEND,第一個日誌文件名是 00000000.jdb,當他增長到一定大小的時候(默認是10M),開始寫第二個日誌文件00000001.jdb,已此類推。
l 跟C版本有所不同,JE的數據日誌和事務日誌是放在一起的,而不是分開放的。
l JE cleaner負責清掃沒用到的磁盤空間,刪除後,或者更新後新的記錄會追加進來,而原有的記錄空間就不在使用了,cleaner負責清理不用的空間。
l 清理並不是立即進行的,當你關閉你的數據庫環境後,通過調用一個cleaner方法來清理。
l 清理也不是隻動執行的,需要你自己手動調用cleaner 方法來定時清理的。
l 日誌文件的刪除僅發生在檢查點之後。cleaner準備出哪些log 文件需要被刪除,當檢查點過後,刪掉一些不在被使用的文件。每寫20M的日誌文件就執行一次檢查點,默認下。
五、 創建數據庫環境
JE要求在任何DATABASE操作前,要先打開數據庫環境,就像我們要使用數據庫的話必須得先建立連接一樣。你可以通過數據庫環境來創建和打開database,或者更改database名稱和刪除database.
可以通過Environments對象來打開環境,打開環境的時候設置的目錄必須是已經存在的目錄,否則會出錯誤。默認情況下,如果指定的database不存在則不會自動創建一個新的detabase,但可以通過設置setAllowCreate來改變這一情況。
1. 打開database環境
示例:
package je.gettingStarted;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import java.io.File;

...

Environment myDbEnvironment = null;

try {
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);//如果不存在則創建一個
myDbEnvironment = new Environment(new File("/export/dbEnv"), envConfig);
} catch (DatabaseException dbe) {
// 錯誤處理
}
2. 關閉database環境
可以通過Environment.close()這個方法來關閉database環境,當你完成數據庫操作後一定要關閉數據庫環境。
示例:
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;

...

try {
if (myDbEnvironment != null) {
myDbEnvironment.close();
}
} catch (DatabaseException dbe) {
// Exception handling goes here
}
3. 清理日誌
通常在關閉數據庫連接的時候,有必要清理下日誌,用以釋放更多的磁盤空間。我們可以在Environment.close前執行下Environment.cleanLog()來達到此目的。
示例:
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;

...

try {
if (myDbEnvironment != null) {
myDbEnvironment.cleanLog(); // 在關閉環境前清理下日誌
myDbEnvironment.close();
}
} catch (DatabaseException dbe) {
// Exception handling goes here
}
4. Database環境的配置
可以通過EnvironmentConfig這個對象來配置database環境。如果想得到當前環境的配置信息則可以通過Environment.getConfig()方法得到當前環境的配置信息。
也可以使用 EnvironmentMutableConfig來配置環境,其實 EnvironmentConfig是EnvironmentMutableConfig的子類,所以EnvironmentMutableConfig 能夠使用的設置,EnvironmentConfig也同樣能夠使用。
如果你要獲取當前環境的使用情況,那麼你可以通過使用EnvironmentStats.getNCacheMiss().來監視RAM cache命中率。EnvironmentStats可以由Environment.getStats()方法獲取。
EnvironmentConfig常見方法介紹
l EnvironmentConfig.setAllowCreate() ;
如果設置了true則表示當數據庫環境不存在時候重新創建一個數據庫環境,默認爲false.
l EnvironmentConfig.setReadOnly()
以只讀方式打開,默認爲false.
l EnvironmentConfig.setTransactional()
事務支持,如果爲true,則表示當前環境支持事務處理,默認爲false,不支持事務處理。
EnvironmentMutableConfig的介紹
l setCachePercent()
設置當前環境能夠使用的RAM佔整個JVM內存的百分比。
l setCacheSize()
設置當前環境能夠使用的最大RAM。單位BYTE
l setTxnNoSync()
當提交事務的時候是否把緩存中的內容同步到磁盤中去。
true 表示不同步,也就是說不寫磁盤
l setTxnWriteNoSync()
當提交事務的時候,是否把緩衝的log寫到磁盤上
true 表示不同步,也就是說不寫磁盤
示例一:
package je.gettingStarted;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import java.io.File;

...

Environment myDatabaseEnvironment = null;
try {
EnvironmentConfig envConfig = new EnvironmentConfig();
//當環境不存在的時候自動創建環境
envConfig.setAllowCreate(true);
//設置支持事務
envConfig.setTransactional(true);
myDatabaseEnvironment =
new Environment(new File("/export/dbEnv"), envConfig);
} catch (DatabaseException dbe) {
System.err.println(dbe.toString());
System.exit(1);
}
示例二:
package je.gettingStarted;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentMutableConfig;
import java.io.File;
...
try {
Environment myEnv = new Environment(new File("/export/dbEnv"), null);
EnvironmentMutableConfig envMutableConfig =
new EnvironmentMutableConfig();
envMutableConfig.setTxnNoSync(true);
myEnv.setMutableConfig(envMutableConfig);
} catch (DatabaseException dbe) {
// Exception handling goes here
}
示例三:
import com.sleepycat.je.Environment;
...
//沒有命中的CACHE
long cacheMisses = myEnv.getStats(null).getNCacheMiss();
...
5. Database操作
在BDB中,數據是以key/value方式成隊出現的。
打開database
可以通過environment.openDatabase()方法打開一個database,在調用這個方法的時候必須指定database的名稱。和databaseConfig() (注:數據庫設置)
示例:
package je.gettingStarted;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import java.io.File;
...
Environment myDbEnvironment = null;
Database myDatabase = null;
...
try {
// 打開一個環境,如果不存在則創建一個
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
myDbEnvironment = new Environment(new File("/export/dbEnv"), envConfig);

// 打開一個數據庫,如果數據庫不存在則創建一個
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
myDatabase = myDbEnvironment.openDatabase(null,
"sampleDatabase", dbConfig); //打開一個數據庫,數據庫名爲
//sampleDatabase,數據庫的配置爲dbConfig
} catch (DatabaseException dbe) {
// 錯誤處理
}
關閉database
通過調用Database.close()方法來關閉數據庫,但要注意,在關閉數據庫前必須得先把遊標先關閉。
使用示例:
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Database;
import com.sleepycat.je.Environment;
...
try {
if (myDatabase != null) {
myDatabase.close();
}
if (myDbEnvironment != null) {
myDbEnvironment.close();
}
} catch (DatabaseException dbe) {
// 錯誤處理
}
設置數據庫屬性
其實設置數據庫屬性跟設置環境屬性差不多,JE中通過DatabaseConfig對象來設置數據庫屬性。你能夠設置的數據庫屬性如下。
l DatabaseConfig.setAllowCreate()
如果是true的話,則當不存在此數據庫的時候創建一個。
l DatabaseConfig.setBtreeComparator()
設置用於Btree比較的比較器,通常是用來排序
l DatabaseConfig.setDuplicateComparator()
設置用來比較一個key有兩個不同值的時候的大小比較器。
l DatabaseConfig.setSortedDuplicates()
設置一個key是否允許存儲多個值,true代表允許,默認false.
l DatabaseConfig.setExclusiveCreate()
以獨佔的方式打開,也就是說同一個時間只能有一實例打開這個database。
l DatabaseConfig.setReadOnly()
以只讀方式打開database,默認是false.
l DatabaseConfig.setTransactional()
如果設置爲true,則支持事務處理,默認是false,不支持事務。
使用示例:
package je.gettingStarted;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
...
// Environment open omitted for brevity
...
Database myDatabase = null;
try {
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setSortedDuplicates(true);
myDatabase =
myDbEnv.openDatabase(null,
"sampleDatabase",
dbConfig);
} catch (DatabaseException dbe) {
// Exception handling goes here.
}
一些用來管理的方法
l Database.getDatabaseName()
取得數據庫的名稱
如:String dbName = myDatabase.getDatabaseName();
l Database.getEnvironment()
取得包含這個database的環境信息
如:Environment theEnv = myDatabase.getEnvironment();
l Database.preload()
預先加載指定bytes的數據到RAM中。
如:myDatabase.preload(1048576l); // 1024*1024
l Environment.getDatabaseNames()
返回當前環境下的數據庫列表
如:
import java.util.List;
List myDbNames = myDbEnv.getDatabaseNames();
for(int i=0; i < myDbNames.size(); i++) {
System.out.println("Database Name: " + (String)myDbNames.get(i));
}
l Environment.removeDatabase()
刪除當前環境中指定的數據庫。
如:
發佈了36 篇原創文章 · 獲贊 0 · 訪問量 1338
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章