- 浏览: 433019 次
- 性别:
- 来自: 无锡
文章分类
最新评论
-
belonghu:
这还和字段是否主键,加索引,有很大关系,我对一个索引的字段查询 ...
MYSQL每日一用:SELECT 语句中比对(between and \ like \ left) -
lqingqingzijin:
好,就是想知道怎样将默认bash修改成nologin
我怎么创建和修改用户帐号,让它有一个nologin shell? -
yangxiutian:
“在jar中添加了字体”是什么意思?
java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:299) -
ljhard_1030:
楼主学习了,以后继续发表这类的文章,会继续光临的。。
刨根问底(Proxool连接池设置) -
RobustTm:
Selenium中使用的貌似是Junit 3.x,上面的例子也 ...
使用Selenium 和Junit 进行WEB功能测试
介绍和使用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
上面大概介绍一下,接下来是我在工作中写的一个例子(仅供参考):
希望大家多提意见并修改!
一、 简介
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, 不知道中小型应用如何?
发表评论
-
activemq 使用经验
2011-07-19 00:14 6986ActiveMQ 是apache的一个开源JMS服务器, ... -
quartz无法启动的原因
2011-04-21 21:06 3433quartz无法启动的原因 场景:spring集 ... -
使用Selenium 和Junit 进行WEB功能测试
2010-10-12 16:54 17635下载 用firefox 到http://seleni ... -
java反编译工具
2010-07-21 10:56 1129这款反编译器叫 "Java Decompiler ... -
运行一个可执行的Jar时,Classpath的设置无效问题,java的-cp和-jar参数不能
2010-07-12 14:26 3736情况为:在cmd中,运行java -jar *.jar,出现c ... -
实践中整理出tomcat集群和负载均衡
2010-07-09 18:18 956实践中整理出tomcat集群和负载均衡 ... -
linux JAVA环境安装和配置
2010-07-06 11:19 0服务器安装配置: linux创建ftp用户 ... -
tomcat 日志文件catalina按日划分
2010-06-13 13:54 1612#!/bin/bash cd `dirname $0` ... -
java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:299)
2010-05-26 22:11 4849在做项目时,老是第一次报一下错误: java.u ... -
URL中中文乱码
2010-05-10 13:28 1122乱码有时候是让我们最头疼,但是根据多年的经验: ... -
解决Linux下Java中文乱码问题
2010-04-13 12:45 21534情况说明: 本地测试数据正常,发布到服务器(centos)后 ... -
正则表达式匹配中文字符,Ctrl+F的福音!
2010-03-23 00:06 1805匹配中文字符的正则表达式: [\u4e00-\u9fa5] ... -
代码严谨度的重要性和耦合的重要性
2010-03-08 17:03 1275情况是:星期六,同时打我电话,说平台动不了,让我解决一下 ... -
测试:strust1.0+jsp做出的系统中出现的串号问题
2010-02-03 10:52 0测试:strust1.0+jsp做出的系统中出现的串号问题 ... -
java 中 List<String> 拆分成 带标记的 List<String>
2009-12-23 15:38 2942public class TransList { ... -
error:SQLServer 2000 Driver for JDBC]Broken pipe
2009-12-21 11:39 2085环境是:linux(red hat) tomcat5.0 j ... -
java或web中解决所有路径问题(最全分析绝对有你要的)
2009-08-25 14:01 1989java或web中解决所有路径 ... -
ibatis 保存修改时都是乱码
2009-07-22 13:21 1884ibatis 保存修改时都是乱码? 这个问题困恼了我好 ... -
AXIS2 学习心得
2009-07-03 17:47 1725首先,想大家介绍一个非常不错的学习axis2的教学网址: ... -
乱码问题——常量提示录——提示Java的编译常量的一个问题
2009-06-04 14:22 1491问题是:有两个JAVA文件,第一个里面放的是常量,第二个 ...
相关推荐
NULL 博文链接:https://rensanning.iteye.com/blog/1872481
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。 多线程支持,JE使用超时的方式来处理...
Berkeley DB Java Edition(以下简称JE)是由美国Sleepycat Software公司(后被Oracle公司收购)开发的一套开放源码的嵌入式数据库,它采用K/V存储,能为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务
嵌入式数据库系统Berkeley DB嵌入式数据库系统Berkeley DB
Berkeley DB Java Edition (JE) 官方7.5.11下载版本。 相关介绍 https://blog.csdn.net/hadues/article/details/80854288
用berkeleydb设计的嵌入式数据库,可进行查询,修改,删除,插入基本功能
oracle 官方实现的 基于B+树 文件磁盘 数据存储 的文件数据库。
很好用的NoSQL 数据库, google 使用此数据库存储自己的用户信息, 它能够处理海量数据,效率高
#资源达人分享计划#
Java版本的Berkeley DB用户手册,找了好久
嵌入式数据Berkeley DB 4.5.20的应用例程.该例是在at91rm9200下运行,实现对数据库表的创建,数据的存取
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。
Berkeley DB Java Edition JE 是一个完全用JAVA写的 它适合于管理海量的 简单的数据 能够高效率的处理1到1百万条记录 制约JE数据库的往往是硬件系统 而不是JE本身 多线程支持 JE使用超时的方式来处理线程间的死琐...
与 Oracle Berkeley DB 类似,Oracle Berkeley DB Java 版在应用程序的地址空间中执行,没有客户端/服务器通信的开销,从而使开发人员能够快速、方便、可靠地存储和检索信息。Oracle Berkeley DB Java 版是完全用 ...
Berkeley DB6.0.20 Berkeley DB BDB Berkeley DB数据库
嵌入式数据库Berkeley DB Java Edition Berkeley DB的使用 使用Berkeley DB的一般步骤 创建、打开、操作、关闭数据库环境Environment
SOLite 和Berkeley DB 是目前应用较广泛、技术较稳定的两种嵌入式数据库。 然而,国内对嵌入式数据库的研究起步较晚,还没能引起更多人的关注。更多人熟悉那些基 于C/S 或B/S 结构的关系型数据库来实现数据的存储、...
NULL 博文链接:https://xpenxpen.iteye.com/blog/2124921