登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

介绍和使用Berkeley DB Java Edition(嵌入式数据库)  

2010-07-15 14:37:48|  分类: java技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、 简介
       Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。
        能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。
        多线程支持,JE使用超时的方式来处理线程间的死琐问题。
        Database都采用简单的key/value对应的形式。
        事务支持。
        允许创建二级库。这样我们就可以方便的使用一级key,二级key来访问我们的数据。
        支持RAM缓冲,这样就能减少频繁的IO操作。
        支持日志。
        数据备份和恢复。
        游标支持。
二、   获取JE
JE下载地址:
http://www.oracle.com/technology/software/products/berkeley-db/je/index.html
解开包后 把JE_HOME/lib/je-<version>.jar 中的jar文件添加到你的环境变量中就可以使用je了。
相关帮助文档可以参考 JE_HOME/docs/index.html
源代码见JE_HOME/src/*.*
三、     JE常见的异常
DatabaseNotFoundException 当没有找到指定的数据库的时候会返回这个异常
DeadlockException 线程间死锁异常
RunRecoveryException 回收异常,当发生此异常的时候,你必须得重新打开环境变量。
四、     关于日志文件必须了解的六项
JE的日志文件跟其他的数据库的日志文件不太一样,跟C版的DBD也是有区别的
        JE的日志文件只能APPEND,第一个日志文件名是 00000000.jdb,当他增长到一定大小的时候(默认是10M),开始写第二个日志文件00000001.jdb,已此类推。
        跟C版本有所不同,JE的数据日志和事务日志是放在一起的,而不是分开放的。
        JE cleaner负责清扫没用到的磁盘空间,删除后,或者更新后新的记录会追加进来,而原有的记录空间就不在使用了,cleaner负责清理不用的空间。
        清理并不是立即进行的,当你关闭你的数据库环境后,通过调用一个cleaner方法来清理。
       清理也不是只动执行的,需要你自己手动调用cleaner 方法来定时清理的。
        日志文件的删除仅发生在检查点之后。cleaner准备出哪些log 文件需要被删除,当检查点过后,删掉一些不在被使用的文件。每写20M的日志文件就执行一次检查点,默认下。
JE的英文文档:http://www.oracle.com/technology/documentation/berkeley-db/je/GettingStartedGuide/index.html
JE的中文文档(不全):http://fesir.itpub.net/post/4728/253789
http://fesir.itpub.net/post/4728/253789
上面大概介绍一下,接下来是我在工作中写的一个例子(仅供参考):
Java 代码
package util;  
  
import java.io.File;  
import java.util.List;  
  
import junit.framework.TestCase;  
import src.com.bizjato.b2b.entity.Suppliers;  
  
import com.sleepycat.bind.EntryBinding;  
import com.sleepycat.bind.serial.SerialBinding;  
import com.sleepycat.bind.serial.StoredClassCatalog;  
import com.sleepycat.je.Cursor;  
import com.sleepycat.je.CursorConfig;  
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.EnvironmentMutableConfig;  
import com.sleepycat.je.LockMode;  
import com.sleepycat.je.OperationStatus;  
  
/** 
 * 嵌入式数据库 
 *  
 * @author dszhang
 * 
 */
package util;

import java.util.Date;

public class Suppliers implements java.io.Serializable{
    private String category ;

    public String getCategory() {
        return category;
    }
   
    public Date dt ;
   
    public Date getDt() {
        return dt;
    }

    public void setDt(Date dt) {
        this.dt = dt;
    }

    private String companyName ;
   
    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public void setCategory(String category) {
        this.category = category;
    }
}

 package util;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.serial.SerialBinding;
import com.sleepycat.bind.serial.StoredClassCatalog;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
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.EnvironmentMutableConfig;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;

public class Test {

    public void testStore() throws Exception {
     
        EntryBinding dataBinding = new SerialBinding(classCatalog,Suppliers.class);

        Cursor cursor = null;
        CursorConfig config = new CursorConfig();
        config.setReadCommitted(true);
        //config.setDirtyRead(true);
        cursor = db.openCursor(null, config);        // open cursor

        try {
            // Database and environment open omitted for brevity
            // Open the cursor. cursor = myDatabase.openCursor(null, null);
            // Cursors need a pair of DatabaseEntry objects to operate. These hold
            // the key and data found at any given position in the database.
            DatabaseEntry foundKey = new DatabaseEntry();
            DatabaseEntry foundData = new DatabaseEntry();
            // To iterate, just call getNext() until the last database record has been
            // read. All cursor operations return an OperationStatus, so just read
            // until we no longer see OperationStatus.SUCCESS
            while (cursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
                // getData() on the DatabaseEntry objects returns the byte array
                // held by that object. We use this to get a String value. If the
                // DatabaseEntry held a byte array representation of some other data
                // type (such as a complex object) then this operation would look
                // considerably different.
                String keyString = new String(foundKey.getData());
               
                Suppliers supp = (Suppliers)dataBinding.entryToObject(foundData);
                System.out.println("Key - Data : " + keyString + " - "
                        + supp.getCategory() + "");
            }
        } catch (DatabaseException de) {
            System.err.println("Error accessing database." + de);
        } finally {
            // Cursors must be closed.
            cursor.close();
            db.close();
            classDB.close();
            env.cleanLog();
            env.close();
        }

    }
   
     
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test t = new Test();
        try {
              t.setUp();
              Suppliers supp = new Suppliers();
              supp.setCategory("fivefive");
              supp.setDt(new Date());
              t.testPut("5",supp);
              t.testGet("5");
              t.testStore();
             
                        // t.tearDown();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static final String RESOURCE = "/tmp/JEDB";
    private Environment env;

    private Database db, classDB;

    private StoredClassCatalog classCatalog;
   
    private void testGet(String key ) throws UnsupportedEncodingException {
        // TODO Auto-generated method stub
        List myDbNames = env.getDatabaseNames();
        System.out.println("Database size: " + myDbNames.size());
        for (int i = 0; i < myDbNames.size(); i++) {
            System.out.println("Database Name: " + (String) myDbNames.get(i));
        }

        DatabaseConfig dbConfig = new DatabaseConfig();
        dbConfig.setAllowCreate(true);
        // dbConfig.setReadOnly(true);
         
        System.out.println("Db: " + db.count());

        EntryBinding dataBinding = new SerialBinding(classCatalog,
                Suppliers.class);

        DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("UTF-8"));
        DatabaseEntry dataEntry = new DatabaseEntry();
        db.get(null, keyEntry, dataEntry, LockMode.DEFAULT);
        Suppliers p = (Suppliers) dataBinding.entryToObject(dataEntry);
        System.out.println("category:"+p.getCategory());
        System.out.println("dt:"+p.getDt());

    }

    private void testPut(String s, Suppliers supp) {
        // TODO Auto-generated method stub
        //supp.getClass()
        EntryBinding dataBinding = new SerialBinding(classCatalog,
                Suppliers.class);
        DatabaseEntry keyEntry ;
        try {
            keyEntry = new DatabaseEntry(s.getBytes("UTF-8"));
            DatabaseEntry dataEntry = new DatabaseEntry();
            dataBinding.objectToEntry(supp, dataEntry);
            db.put(null, keyEntry, dataEntry);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }

    private void setUp() {
        // TODO Auto-generated method stub
        env = new Environment(new File("/tmp/JEDB"), null);
        EnvironmentMutableConfig envMutableConfig = new EnvironmentMutableConfig();
        envMutableConfig.setTxnNoSync(true);
        env.setMutableConfig(envMutableConfig);

        DatabaseConfig dbConfig = new DatabaseConfig();
        dbConfig.setAllowCreate(true);
        db = env.openDatabase(null, "myDB", dbConfig);
        classDB = env.openDatabase(null, "classDB", dbConfig);
        classCatalog = new StoredClassCatalog(classDB);
    }

}
 

希望大家多提意见并修改!
  评论这张
 
阅读(1065)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018