[轉]Berkeley DB Java Edition基本示例

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);//設置jecache佔用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);

            //transactionnull,不支持事務

            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");

           

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

            //遊標用於重複數據存儲putget

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

           

            //記錄Using Database Records

            //記錄是由keydata組成,即所熟悉的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);//查找keydata都匹配的記錄

            //--查詢出來的keydata都是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) {

           

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