`
zqjshiyingxiong
  • 浏览: 439842 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

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

    博客分类:
  • JAVA
阅读更多
介绍和使用Berkeley DB Java Edition(嵌入式数据库)

一、 简介

       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

上面大概介绍一下,接下来是我在工作中写的一个例子(仅供参考):

package src.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 zhangqinjian
 *
 */
public class Jedtion extends TestCase {

	private static final String RESOURCE = ".//src//util//importData";
	private Environment env;

	private Database db, classDB;

	private StoredClassCatalog classCatalog;
	/**
	 * 初始化,设置数据库的环境和创建数据库
	 */
	public void setUp() throws Exception {

		env = new Environment(new File(".//src//util//importData"), 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);
	}
	// test: put key-value
	public void testPut(String key, Suppliers supp) throws Exception {
		EntryBinding dataBinding = new SerialBinding(classCatalog,
				Suppliers.class);
		DatabaseEntry keyEntry = new DatabaseEntry(key.getBytes("UTF-8"));
		DatabaseEntry dataEntry = new DatabaseEntry();
		dataBinding.objectToEntry(supp, dataEntry);
		db.put(null, keyEntry, dataEntry);
	}
	// test: get
	public void testGet() throws Exception {
		EnvironmentConfig envConfig = new EnvironmentConfig();
		envConfig.setAllowCreate(true);
		// envConfig.setReadOnly(true);
		env = new Environment(new File(".//src//util//importData"), envConfig);
		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);
		db = env.openDatabase(null, "myDB", dbConfig);
		classDB = env.openDatabase(null, "classDB", dbConfig);
		classCatalog = new StoredClassCatalog(classDB);

		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(p.getCategory());
	}

	/**
	 * test: read database
	 * @throws Exception
	 */
	public void testStore() throws Exception {

		EnvironmentConfig envConfig = new EnvironmentConfig();
		envConfig.setAllowCreate(true);
		env = new Environment(new File(".//src//util//importData"), envConfig);

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

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

		Cursor cursor = null;
		CursorConfig config = new CursorConfig();
	    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.getCompanyName() + "");
			}
		} 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();
		}

	}

	public void tearDown() throws Exception {
		db.close();
		classDB.close();
		env.cleanLog();
		env.close();
	}

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

	}
}



希望大家多提意见并修改!


分享到:
评论
5 楼 Programmer2.x 2009-04-24  
怎么设置成hash呢,谢谢。。。
4 楼 云中苍月 2009-03-16  
这个东西很好用,不过要提醒各位,Berkeley DB被Oracle收购了。使用这个软件开发商业软件的话存在版权问题。
3 楼 ispring 2009-03-16  
不错, Berkeley 的东西就是牛,Linux 里面的软件管理器好像就是基于这个的
2 楼 alanye 2009-03-16  
您好,请问DatabaseConfig原来有setType,可以选择BTree或者是Hash或者别的,新的je.DatabaseConfig里面没有了,是不是只能选择BTree呢? 谢谢
1 楼 andersonmao 2008-12-20  
有没有大虾用过BDB JE的DPL(直接数据存储)? 以前用ORM, 不知道中小型应用如何?

相关推荐

    Java嵌入式NoSQL数据库之Berkeley DB Java Edition

    Berkeley DB Java Edition(简称BDB JE)是一种高性能、轻量级的嵌入式数据库系统,由Oracle公司开发,广泛应用于需要快速数据存储和检索的应用场景。它并非传统的关系型数据库管理系统(RDBMS),而是一种键值对...

    Berkeley DB Java Edition

    总的来说,Berkeley DB Java Edition是一款强大的、基于文件的Java数据库,利用B+树数据结构实现高效的数据存储和检索。它的特点是轻量级、可移植和高性能,适用于各种需要本地持久化数据存储的Java应用。

    Berkeley DB Java Edition 5.0.73

    **Berkeley DB Java Edition 5.0.73** Berkeley DB Java Edition(简称BDB JE)是一款由Oracle公司开发的高性能、轻量级的NoSQL数据库系统。它以其高效能、可扩展性和可靠性在处理大规模数据存储时受到广泛欢迎,...

    Berkeley DB Java Edition学习报告

    Berkeley DB Java Edition (JE) 是一款开源的嵌入式数据库管理系统,由Sleepycat Software开发,现归Oracle公司所有。这款数据库系统以其键值(K/V)存储模型为特色,适用于需要高性能、可伸缩性及事务处理能力的应用...

    Berkeley DB Java Edition 4.0.92 开发包

    Berkeley DB Java Edition(简称BDB JE)是Oracle公司推出的一款强大的、高度可定制的嵌入式数据库系统,尤其适用于Java应用程序。这款数据库引擎以其轻量级、高性能和易用性在Java企业开发领域广受欢迎。本文将深入...

    嵌入式Berkeley DB Java版与Derby技术研究.pdf

    《嵌入式Berkeley DB Java版与Derby技术研究》一文主要探讨了两种典型的嵌入式数据库技术——Berkeley DB Java Edition和Apache Derby。嵌入式数据库在资源有限的环境中,如嵌入式系统,因其体积小、功能齐全、可...

    BerkeleyDB_java_jar包

    3. **示例和文档**:可能包含演示如何使用BerkeleyDB Java API的示例代码,以及详细说明如何配置、操作和管理数据库的文档。 4. **依赖库**:BerkeleyDB可能依赖于其他的Java库,这些库也可能包含在jar文件中或者...

    Berkeley DB的java版本

    **正文** Berkeley DB(简称BDB)是由Oracle公司开发...总之,Berkeley DB的Java版本为开发者提供了一个强大而灵活的嵌入式数据库解决方案,通过深入学习和实践,可以充分利用其特性来构建高效、可靠的数据存储系统。

    Java-Edition-BerkeleyDB-3.1.0.zip_BerkeleyDB

    总结来说,Java-Edition-BerkeleyDB-3.1.0是一个强大且灵活的数据库解决方案,特别适合对数据访问速度和并发性能有高要求的Java应用。其易用的API、丰富的功能集以及高度的可定制性使其成为许多开发者的首选。

    Berkeley DB 读取样例

    Berkeley DB 是一款高效、轻量级的嵌入式数据库系统,特别适合于需要本地存储且对性能有高要求的应用程序。它支持多种编程语言,包括Java,这使得开发人员能够在Java应用程序中直接使用Berkeley DB进行数据管理。在...

    Berkeley DB JE-7.0.6

    Berkeley DB JE(Java Edition)是Oracle公司提供的一款开源、嵌入式、基于Java的键值对数据库系统。它以其轻量级、高性能和高可用性而受到广泛的青睐,尤其适合于需要在内存中管理大量数据的应用场景。在版本7.0.6...

    Berkeley DB 教程.doc

    通过上述知识点的详细介绍,我们可以了解到 Berkeley DB Java Edition 的基本使用流程及其实现细节。Berkeley DB 作为一款强大的嵌入式数据库,其高效、灵活的特点使其成为许多应用领域的首选数据库解决方案之一。...

    berkeley db使用手册

    Berkeley DB Java Edition (JE) 是一款由Oracle公司开发的全Java实现的轻量级数据库管理系统,特别适用于处理大量简单数据。其主要特点包括: 1. **高效性能**:JE能有效处理从1到100万条记录,性能瓶颈通常在于...

    各种内存数据库的简单介绍

    - **BerkeleyDB Java Edition**:针对Java环境进行了优化,最新版本3.3已发布。 - **BerkeleyDB XML**:原生XML数据库,支持通过XQuery访问存储在容器中的文档,并根据内容进行索引。最新版本2.4已发布。 **1.3 ...

    DBD JAVA edition

    DBD (Berkeley DB) Java Edition,简称JE,是Oracle公司提供的一款开源、高性能、嵌入式、事务处理型数据库系统。它专为Java应用程序设计,提供了轻量级的数据存储和管理解决方案,尤其适合需要在内存中高效处理大量...

    Java嵌入式开发

    10. **嵌入式数据库**:SQLite和Berkeley DB等轻量级数据库常与Java嵌入式开发结合,用于存储和检索数据。 11. **硬件访问**:通过Java本地接口(JNI)或特定的硬件抽象层(HAL),开发者可以编写Java代码来控制...

    berkeley db je-6.4.9.gz

    在这个“berkeley db je-6.4.9.gz”压缩包中,包含了BDB Java Edition(JE)的6.4.9版本。这个版本的发布可能包含了性能优化、新功能、bug修复以及对先前版本的改进。下面将详细探讨BDB JE的相关知识点。 1. **键值...

    Oracle产品销售简明手册-2数据库类产品.doc

    Berkeley DB Java Edition 是 Oracle 公司的 Java 版嵌入式数据库管理解决方案,能够提供高性能和高可靠性的数据库管理解决方案。该产品提供了 Java 版嵌入式数据库管理功能,能够满足客户对高性能和高可靠性的需求...

Global site tag (gtag.js) - Google Analytics