1. 程式人生 > >嵌入式資料庫BDB的介紹與使用案例

嵌入式資料庫BDB的介紹與使用案例

一、Berkeley DB簡介       

 Berkeley DB是一個開放原始碼的內嵌式資料庫管理系統,能夠為應用程式提供高效能的資料管理服務。應用它程式設計師只需要呼叫一些簡單的API就可以完成對資料的訪問和管理。與常用的資料庫管理系統(如MySQL和Oracle等)有所不同,在Berkeley DB中並沒有資料庫伺服器的概念。應用程式不需要事先同資料庫服務建立起網路連線,而是通過內嵌在程式中的Berkeley DB函式庫來完成對資料的儲存、查詢、修改和刪除等操作。

二、Berkeley DB的使用步驟

1>建立資料庫環境類---BdbEnvironment

BDB資料庫環境,可以快取StoredClassCatalog並共享。

建立一個Environment環境,首先需要建立一個DatabaseConfig配置物件,用來配置一個數據庫的基本資訊,然後通過這個配置項就可以建立Environment環境。

EnvironmentConfig envConfig = new EnvironmentConfig(); // 建立一個EnvironmentConfig配置物件  
envConfig.setAllowCreate(true); // 允許建立一個數據庫環境  
envConfig.setCacheSize(1000000); // 設定資料庫快取大小
envConfig.setTransactional(false);////設定是否支援事務----不支援事務

try {
     Environment env = new Environment(new File("D://"),envConfig); // 使用一個指定路徑和一個EnvironmentConfig配置物件建立Environment環境  
 } catch (DatabaseException e) {
     e.printStackTrace();
 }

 

2>開啟資料庫DataBase

首先需要在一個已經存在的Environment環境下考慮開啟一個數據庫;

開啟資料庫之前,也要建立一個DatabaseConfig配置物件,用來配置一個Database;

使用Environment環境來開啟資料庫Database。

在上面步驟中建立了env的基礎上,開啟資料庫具體實現如下:

DatabaseConfig dbConfig = new DatabaseConfig(); //建立一個dbConfig配置物件
dbConfig.setAllowCreate(true); //允許建立資料庫 
try {
    //事務、資料庫名、配置項
    Database classCatalogDB = openDatabase(null, "classCatalog", dbConfig); //開啟資料庫classCatalog
} catch (DatabaseException e) {
    // TODO Auto-generated catch block
    throw new RuntimeException(e);
}

 

3>操作資料庫

Berkeley DB儲存的是鍵值對形式的資料,其實類似於一個Map,無非是向資料庫中新增key/value對,或者根據指定的key取出對應的value,這是最基礎的。

還可以使用遊標來遍歷資料庫中的記錄。

Berkeley DB儲存的資料形式是以KeyValue鍵值對,其實就是類似於一個map集合,就是儲存的容器是一個數據庫,其實實質操作跟操作map沒有區別,無非就是根據key取出value值。對資料庫的資訊進行CURD。

主要的方法:offer,peek,poll,remove,addAll,AbstractQueue

 

4>關閉資料庫以及環境

關閉的順序:先關閉資料庫,再關閉配置環境。防止資料丟失。

try {
    if(queueDb!=null){
        queueDb.sync();//將資料持久化到資料庫
        queueDb.close();//關閉資料庫
    }
    if(env != null) {  
     env.close();  //關閉配置環境
    } 
} catch (DatabaseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (UnsupportedOperationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

三、Berkeley DB 案例

下面建立一個MyBerkeleyDB,用來測試資料庫的使用。

/**
 * @author Mr.lu
 * @Title: MyBerkeleryDB
 * @ProjectName DocCloud
 * @Description: TODO
 * @date 2018/11/6:21:18
 */
import java.io.File;

import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;

public class MyBerkeleyDB {

    private Environment env;
    private Database db;

    public MyBerkeleyDB() {

    }

    public void setUp(String path, long cacheSize) {
        EnvironmentConfig envConfig = new EnvironmentConfig();
        envConfig.setAllowCreate(true);
        envConfig.setCacheSize(cacheSize);
        try {
            env = new Environment(new File(path),envConfig);
        } catch (DatabaseException e) {
            e.printStackTrace();
        }
    }

    public void open(String dbName) {
        DatabaseConfig dbConfig = new DatabaseConfig();
        dbConfig.setAllowCreate(true);
        try {
            db = env.openDatabase(null, dbName, dbConfig);
        } catch (DatabaseException e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            if(db != null) {
                db.close();
            }
            if(env != null) {
                env.close();
            }
        } catch (DatabaseException e) {
            e.printStackTrace();
        }
    }

    public String get(String key) throws Exception {
        DatabaseEntry queryKey = new DatabaseEntry();
        DatabaseEntry value = new DatabaseEntry();
        queryKey.setData(key.getBytes("UTF-8"));

        OperationStatus status = db.get(null, queryKey, value,
                LockMode.DEFAULT);
        if (status == OperationStatus.SUCCESS) {
            return new String(value.getData());
        }
        return null;
    }

    public boolean put(String key, String value) throws Exception {
        byte[] theKey = key.getBytes("UTF-8");
        byte[] theValue = value.getBytes("UTF-8");
        OperationStatus status = db.put(null, new DatabaseEntry(theKey),
                new DatabaseEntry(theValue));
        if(status == OperationStatus.SUCCESS) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        MyBerkeleyDB mybdb = new MyBerkeleyDB();
        mybdb.setUp("D://mbdb", 1000000);
        mybdb.open("mbdb");
        System.out.println("開始向Berkeley DB中存入資料...");
        for(int i=0; i<20; i++) {
            try {
                String key = "Key-"+i;
                String value = "Value-"+i;
                System.out.println("[" + key + ":" + value + "]");
                mybdb.put(key , value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        mybdb.close();

    }
}

在控制檯中的資訊-向資料庫中儲存了20個key-value鍵值對

開始向Berkeley DB中存入資料...
[Key-0:Value-0]
[Key-1:Value-1]
[Key-2:Value-2]
[Key-3:Value-3]
[Key-4:Value-4]
[Key-5:Value-5]
[Key-6:Value-6]
[Key-7:Value-7]
[Key-8:Value-8]
[Key-9:Value-9]
[Key-10:Value-10]
[Key-11:Value-11]
[Key-12:Value-12]
[Key-13:Value-13]
[Key-14:Value-14]
[Key-15:Value-15]
[Key-16:Value-16]
[Key-17:Value-17]
[Key-18:Value-18]
[Key-19:Value-19]

Process finished with exit code 0

在資料夾中的情況

在上面的基礎上,將資料庫中的資料讀取出來。

public static void main(String[] args) throws Exception {
    MyBerkeleyDB mbdb = new MyBerkeleyDB();
    mbdb.setUp("D://mbdb", 1000000);
    mbdb.open("mbdb");
    System.out.println("從Berkeley DB中取出資料...");
    for (int i = 0; i <= 20; i++) {
        String k = "myKey" + i;
        String v = mbdb.get(k);
        System.out.println("[" + k + ":" + v +"]");
    }
    mbdb.close(); 
    }

可以看到控制檯列印的資訊中--只有key-value:0~19個鍵值對資料不為空。表示上面寫入正確

從Berkeley DB中取出資料...
[myKey0:myValue0]
[myKey1:myValue1]
[myKey2:myValue2]
[myKey3:myValue3]
[myKey4:myValue4]
[myKey5:myValue5]
[myKey6:myValue6]
[myKey7:myValue7]
[myKey8:myValue8]
[myKey9:myValue9]
[myKey10:myValue10]
[myKey11:myValue11]
[myKey12:myValue12]
[myKey13:myValue13]
[myKey14:myValue14]
[myKey15:myValue15]
[myKey16:myValue16]
[myKey17:myValue17]
[myKey18:myValue18]
[myKey19:myValue19]
[myKey20:null]

Process finished with exit code 0