Berkeley DB 之 CRUD

来源:互联网 发布:小早川秀秋 知乎 编辑:程序博客网 时间:2024/06/04 20:53


        一、             简介
       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下载地址:
选择java版的,http://download.oracle.com/otn/berkeley-db/je-5.0.34.zip 
相关帮助文档可以参考 JE_HOME/docs/index.html
源代码见JE_HOME/src/*.*

当时设计mq(消息服务中间件)时,我们要确保每条消息能够可靠的发送到消费端,不管是网络掉线,还是mq服务器挂了。如果出现这些情况,我们会把未发出去的消息存放到数据库中,当网络通的时候,在把为发送的消息通过线程发送出去,确保每条消息能可靠的发送出去。特别针对走秀的促销系统,这个是非常重要,所以我们当时选择了je。

        一、             简介

        Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。

    它是是一个高性能的,嵌入数据库编程库,和C语言,C++JavaPerlPythonPHPTcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据,广泛

  

  用于各种操作系统包括大多数Unix类操作系统和Windows操作系统以及实时操作系统

l         能够高效率的处理11百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。

l         多线程支持,JE使用超时的方式来处理线程间的死琐问题。

l         Database都采用简单的key/value对应的形式。

l         事务支持。

l         允许创建二级库。这样我们就可以方便的使用一级key,二级key来访问我们的数据。

l         支持RAM缓冲,这样就能减少频繁的IO操作。

l         支持日志。

l         数据备份和恢复。

l         游标支持

 

 

二、         获取JE

JE下载地址:

选择java版的,http://download.oracle.com/otn/berkeley-db/je-5.0.34.zip 

相关帮助文档可以参考 JE_HOME/docs/index.html

源代码见JE_HOME/src/*.*

 

 

增加对象到数据库中,代码如下

package com.xiu.je;
import java.io.File;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.ClassCatalog;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.OperationStatus;
import com.xiu.je.bean.User;

/**
 * 
 * JE
数据库的一般步骤 1.创建数据库环境environment 2.打开数据库 3.操作数据库 4.关闭数据库及环境。
 * JE
数据库的crud
 * @author user
 * 
 */
public class JEaddObject {
   // Environment
对象,由EnvironmentConfig对象创建
   private Environment env;
   //
打开数据库,由env打开
   private Database db,classDB;
   private ClassCatalog classCatalog;
   public JEaddObject() {
   }

   /**
    *
创建环境对象
    * 
    * @param path
    * @param cacheSize
    */
   public void setUp(String path, longcacheSize) {
      //
创建一个EnvironmentConfig配置对象
      EnvironmentConfig envConfig = newEnvironmentConfig();
      envConfig.setAllowCreate(true); //
允许创建一个数据库环境
      envConfig.setCacheSize(cacheSize);//
设置数据库缓存大小
      //
使用一个指定路径和一个EnvironmentConfig配置对象创建Environment环境
      env = new Environment(newFile(path), envConfig);
   }

   /**
    *
打开数据库
    * 
    * @param dbName
    */
   public void open(String dbName) {
      //
创建数据库配置
      DatabaseConfig dbConfig = newDatabaseConfig();
      dbConfig.setAllowCreate(true);//
允许创建数据库
      db = env.openDatabase(null, dbName,dbConfig); //
打开数据库dbName
      classCatalog = newStoredClassCatalog(env.openDatabase(null, "classDB",
           dbConfig));
   }


   /**
    *
关闭链接
    */
   public void close() {
      if (db != null) {
        db.close();
      }
      if (env != null) {
        env.close();
      }
   }

   /**
    *
存数据(参数为object类型)
    * 
    * @param key
    * @param value
    * @return
    * @throws Exception
    */
   public boolean put(String key, Objectvalue) throws Exception {

      DatabaseEntry theKey = newDatabaseEntry(key.getBytes("utf-8"));
      User user = newUser("je...");
      EntryBinding dataBinding = newSerialBinding(classCatalog, User.class);
      DatabaseEntry dataEntry = newDatabaseEntry();
      dataBinding.objectToEntry(user,dataEntry);
      OperationStatus status =db.put(null, theKey, dataEntry);
      if (status ==OperationStatus.SUCCESS) {
        return true;
      }


      return false;
   }

   public static void main(String[] args)throws Exception {
      JEaddObject je = new JEaddObject();
      je.setUp("c://je",1000000);
      je.open("myDB");
      System.out.println("
开始向Berkeley DB中读取数据.....");
     
   }
}

 

 

简单类型的CRUD

package com.xiu.je;
import java.io.File;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;


/**
 * 
 * JE
数据库的一般步骤 
 * 1.
创建数据库环境environment 
 * 2.
打开数据库 
 * 3.
操作数据库 
 * 4.
关闭数据库及环境。
 * 
 * JE
数据库的crud
 * 
 * @author user
 * 
 */
public class TestJECRUD {
   // Environment
对象,由EnvironmentConfig对象创建
   private Environment env;
   //
打开数据库,由env打开
   private Database db;


   public TestJECRUD() {


   }

   /**
    *
创建环境对象
    * 
    * @param path
    * @param cacheSize
    */
   public void setUp(String path, longcacheSize) {
      //
创建一个EnvironmentConfig配置对象
      EnvironmentConfig envConfig = newEnvironmentConfig();
      envConfig.setAllowCreate(true); //
允许创建一个数据库环境
      envConfig.setCacheSize(cacheSize);//
设置数据库缓存大小
      //
使用一个指定路径和一个EnvironmentConfig配置对象创建Environment环境
      env = new Environment(newFile(path), envConfig);


   }

   /**
    *
打开数据库
    * 
    * @param dbName
    */
   public void open(String dbName) {
      //
创建数据库配置
      DatabaseConfig dbConfig = new DatabaseConfig();
      dbConfig.setAllowCreate(true);//
允许创建数据库
      db = env.openDatabase(null, dbName,dbConfig); //
打开数据库dbName


   }

   /**
    *
关闭链接
    */
   public void close() {
      if (db != null) {
        db.close();
      }
      if (env != null) {
        env.close();
      }
   }


   /**
    *
根据key取数据
    * 
    * @param key
    * @return
    * @throws Exception
    */
   public String get(String key) throwsException {
      DatabaseEntry queryKey = newDatabaseEntry(); //
查询的key
      DatabaseEntry value = newDatabaseEntry(); // value
      queryKey.setData(key.getBytes("utf-8"));
      OperationStatus status = db
           .get(null, queryKey, value,LockMode.DEFAULT);
      if (status ==OperationStatus.SUCCESS) {
        return newString(value.getData());
      }
      return null;
   }

   /**
    *
存数据
    * 
    * @param key
    * @param value
    * @return
    * @throws Exception
    */
   public boolean put(String key, Stringvalue) 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 == status.SUCCESS) {

        return true;
      }

      return false;
   }
  
   /**
    *
删除数据
    * @param key
    * @return
    * @throws Exception
    */
   public boolean delete(String key)throws Exception{
      byte[] theKey = key.getBytes("utf-8");
      OperationStatus status =db.delete(null, new DatabaseEntry(theKey));
      if(status==OperationStatus.SUCCESS){
        return true;
      }
      return false;
   }


   /**
    *
修改数据
    * @param key
    * @param value
    * @return
    * @throws Exception
    */
   public boolean update(String key,String value) throws Exception {
      byte[] updateKey =key.getBytes("utf-8");
      byte[] updateValue =value.getBytes("utf-8");
      OperationStatus status =db.put(null, new DatabaseEntry(updateKey),
           new DatabaseEntry(updateValue));
      if (status == status.SUCCESS) {

        return true;
      }

      return false;
   }
  
}

 

测试类:

package com.xiu.je;
import junit.framework.TestCase;
public class TestJECRUDTest extends TestCase {
   TestJECRUD je = null;
   //
实例化对象
   @Override
   protected void setUp() throws Exception{
      je = new TestJECRUD();
      je.setUp("c://je",1000000);
      je.open("myDB");
   }

   //
打开链接
   public void testOpen() {
      je.setUp("c://je",1000000);
      je.open("myDB");
   }

   //
关闭链接
   public void testClose() {
      je.close();
   }
   //
取得数据
   public void testGet() {
      for (int i = 0; i < 30; i++) {
        String key = "myKey" + 2* i;
        String value = "myValue"+ 2 * i;
        try {
           String v = je.get(key);
           System.out.println("["+ key + ":" + v + "]");
        } catch (Exception e) {
           e.printStackTrace();
        }


      }
   }

   //
插入
   public void testPut() {
      for (int i = 0; i < 30; i++) {
        String key = "myKey" +i;
        String value = "myValue"+ i;
        System.out.println("[" +key + ":" + value + "]");
        try {
           je.put(key, value);
        } catch (Exception e) {
           e.printStackTrace();
        }
      }
   }

   //
删除
   public void testDelete() {
      for (int i = 0; i < 30; i++) {
        String key = "myKey" + 2* i;
        String value = "myValue"+ 2 * i;
        try {
           je.delete(key);
        } catch (Exception e) {
           e.printStackTrace();
        }

      }
   }

   //
更新
   public void testUpdate() {
      for (int i = 0; i < 30; i++) {
        String key = "myKey" + 2* i;
        String value ="myValue"+2*i;
        try {
           je.update(key, value);
        } catch (Exception e) {
           e.printStackTrace();
        }
       
      }
   }

   @Override
   protected void tearDown() throwsException {
      je.close();
   }
}

 

 

 

 






原创粉丝点击