• 嵌入式数据库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
     

  • 相关阅读:
    poj1811
    linux系统nginx如何部署vue项目(附详细步骤)
    vue中设置input输入框的值为正整数,不能为负数和小数
    nginx(windows)如何部署vue项目
    vue多个表单验证(Promise.all)
    vue 路由传递参数,刷新页面 数据变成 [Object object]
    vue中解决父组件给子组件传值,子组件拿不到值
    vue项目封装axios请求的get、post、put、delect请求
    vue代码格式化-eslint
    vue后台管理项目PC端页面自适应
  • 原文地址:https://www.cnblogs.com/pigdata/p/10305578.html
Copyright © 2020-2023  润新知