Berkeley DB實例

package test;

import com.sleepycat.je.*;

import com.sleepycat.bind.EntryBinding;

import com.sleepycat.bind.tuple.TupleBinding;

import com.sleepycat.bind.serial.StoredClassCatalog;

import com.sleepycat.bind.serial.SerialBinding;

import java.io.File;

public class test {

public static void main(String[] args) {



}



/**

* 打開和關閉環境,示例一

*

*/

public void eg1(){

//----打開環境,如果不存在,則創建一個------------

Environment myDbEnvironment=null;

try {

EnvironmentConfig envConfig = new EnvironmentConfig();

envConfig.setAllowCreate(true); //true不存在就創建,false如果不存在則打開環境失敗

//envConfig.setReadOnly(true); //true 以只讀方式打開,如果是多進程應用,每個進程都要設置爲true

//envConfig.setTransactional(true);//true支持事務,false不支持,默認false。可以更改配置文件來設置此參數。

myDbEnvironment = new Environment(new File(".//"), envConfig);//環境所在路徑

java.util.List myDbNames = myDbEnvironment.getDatabaseNames(); //得到所有的數據庫的名字

for(int i=0; i < myDbNames.size(); i++) {

System.out.println("Database Name: " + (String)myDbNames.get(i));

}

} catch (DatabaseException dbe) {

// 錯誤處理

}

//----關閉環境----------------

try {

if (myDbEnvironment != null) {

myDbEnvironment.cleanLog(); //在關閉前也最好執行一下cleaner,清理一下日誌文件,因爲delete操作會浪費一些空間

myDbEnvironment.close();

}

} catch (DatabaseException dbe) {

// 錯誤處理

}

}

/**

* 打開環境示例二

*

*/

public void eg2()

{

Environment myEnv = null;

try{

myEnv=new Environment(new File("/export/dbEnv"), null);

EnvironmentMutableConfig envMutableConfig = new EnvironmentMutableConfig();

envMutableConfig.setCachePercent(50);//設置je的cache佔用jvm 內存的百分比。

//envMutableConfig.setCacheSize(123456);//設定緩存的大小爲123456Bytes

envMutableConfig.setTxnNoSync(true);//設定事務提交時是否寫更改的數據到磁盤,true不寫磁盤。

//envMutableConfig.setTxnWriteNoSync(false);//設定事務在提交時,是否寫緩衝的log到磁盤。如果寫磁盤會影響性能,不寫會影響事務的安全。隨機應變。

myEnv.setMutableConfig(envMutableConfig);





EnvironmentStats envStats=myEnv.getStats(null);//調用 Environment.getStats() 返回一個EnvironmentStas對象。調用EnvironmentStats.getNCacheMiss()看命不中數。

long cacheMisses = envStats.getNCacheMiss(); //這個統計非常重要,尤其針對於長時間運行的應用。 它返回不能夠在內存中命中的請求總數,這可以用來參考指定cache的大小。



//myEnv.getMutableConfig();//得到當前的環境配置信息

}catch(DatabaseException dbe){}

}



/**

* 打開database,以及相關操作

*

*/

public void eg3(){

Environment myDbEnvironment = null;

Database myDatabase = null;

try {

// Open the environment. Create it if it does not already exist.

EnvironmentConfig envConfig = new EnvironmentConfig();

envConfig.setAllowCreate(true);

myDbEnvironment = new Environment(new File("/export/dbEnv"), envConfig); //也可能用DatabaseConfig參數來打開,這樣就可以設置數據庫的屬性,比如是否允許在庫不存在時創建它,是否只讀打開,是否支持事務等。



// Open the database. Create it if it does not already exist.

DatabaseConfig dbConfig = new DatabaseConfig();

dbConfig.setAllowCreate(true);

//transaction爲null,不支持事務

myDatabase = myDbEnvironment.openDatabase(null,"sampleDatabase",dbConfig); //打開庫,要提供一個數據庫名字作爲參數

} catch (DatabaseException dbe) {

// Exception handling goes here

}



//記錄

String aKey = "key";

String aData = "data";



try {

DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));//最好指定編碼方式,因爲不指定編碼會用系統的默認編碼來轉換,因爲系統的默認編碼可能會被人更改。

DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));

byte[] myKey = theKey.getData();

byte[] myData = theData.getData();



//從byte數組轉換爲string的方法

String key = new String(myKey, "UTF-8");

String data = new String(myData, "UTF-8");



//get和put用在非重複的數據存儲,讀寫庫時,注意一個小區別,就是數據庫,是否允許重複的記錄存在,兩個記錄公用一個key,這就是重複的記錄,我們把重複的記錄成爲重複集合。或者叫多重。

//遊標用於重複數據存儲put和get。

//數據記錄在內部是用Btree按照特定排序來存儲的。一般是用key來排序的,key相同的多重數據是按照data來排序。



//記錄Using Database Records

//記錄是由key和data組成,即所熟悉的key->value,二者都被是有DatabaseEntry封裝的。

//這個之前也提過很多次了,DatabaseEntry可以封裝原始類型和複雜的對象類型,二者都要被轉換爲byte array存儲,轉換可以使用Bind API來完成



//寫數據

myDatabase.put(null, theKey, theData);//如果不是可重複數據庫,put將會覆蓋原有的記錄。

//myDatabase.putNoOverwrite(null, theKey, theData);//不允許覆蓋,不管是否允許數據重複。



//讀數據

//--myDatabase.getSearchBoth(null, theKey, theData, LockMode.DEFAULT);//查找key和data都匹配的記錄

//--查詢出來的key和data都是byte數組形式。

if (myDatabase.get(null, theKey, theData, LockMode.DEFAULT) ==OperationStatus.SUCCESS)

{

byte[] retData = theData.getData();

String foundData = new String(retData, "UTF-8");

System.out.println("For key: '" + aKey + "' found data: '" +foundData + "'.");

}



//刪除數據

myDatabase.delete(null, theKey); //刪除數據



} catch (Exception e) {}



//關閉數據庫

//如果打開了遊標,關閉時JE會發出警告,讓你關閉他們先。活動狀態的遊標在關閉庫的過程中會產生意想不到的結果,尤其是其他線程在寫庫的過程中。確定所有的訪問都結束後再關閉庫

try {

if (myDatabase != null) {

myDatabase.close();

myDbEnvironment.renameDatabase(null, "sampleDatabase", "test");//重命名,必須先關閉數據庫

myDbEnvironment.removeDatabase(null, "sampleDatabase");//刪除數據庫,必須先關閉數據庫

//myDbEnvironment.truncateDatabase(null, myDatabase.getDatabaseName(),true);//刪除並回收數據庫空間 ,true返回刪除的記錄的數量,false不返回刪除的記錄數量值

}



if (myDbEnvironment != null) {

myDbEnvironment.close();

}

} catch (DatabaseException dbe) {
發佈了36 篇原創文章 · 獲贊 0 · 訪問量 1336
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章