BerkeleyDB
是一种
KEY-VALUE
的存储容器,跟
memcached
有些类似。但是
BerkeleyDB
相对于
memcached
的不同在于:(
1
)
BerkeleyDB
不是分布式的,你可以简单的把
BerkeleyDB
理解为本地的一个磁盘文件,只不过
BerkeleyDB
会负责组织这个文件,并从这个文件中快速检索出数据;而
memcached
是可以通过简单的文本协议网络访问的,因此
memcached
数据是存放在
memcached
服务器上的,其他应用程序无论
C,PHP,JAVA
还是
Ruby
都只要通过网络协议就可以访问。(
2
)
BerkeleyDB
的定位是数据库,数据库最重要的是持久化,而
memcached
的定位是
Cache
,因此
memcached
的数据都是存放在内存里面的,
memcached
宕机或重启缓存数据丢失是没有关系的,然而
BerkeleyDB
应用场景往往要求数据是持久化的,只不过
BerkeleyDB
的
Hash
索引的效率要比
Mysql
等关系数据库的
B-Tree
索引效率高。
BerkeleyDB
被
Oracle
收购了,我们在
Oracle
站点上会看到:
BerkeleyDB
;
BerkeleyDB
XML
和
BerkeleyDB JAVA Edition
三个东西。简单的说最开始
BerkeleyDB
是只有
C
语言版本的,但是
JAVA
也可以使用,只不过需要通过
JNI
调用,效率可能有点影响。但是
Oracle
不会放弃
JAVA
领域,因此很快就出了
JAVA Edition
,专门用
JAVA
实现了一遍,也就是我们看到的
BerkeleyDB JAVA Edition
(简称
JE
)。至于
BerkeleyDB
XML
可能是专门对
XML
数据的处理方面的,笔者也没看过相关文档。三个东西的下载地址:
http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html
下面笔者以
BerkeleyDB JAVA Edition
来写一个
HelloWorld
程序,下载
JE
:
berkeleydb java edition:
http://download.oracle.com/otn/berkeley-db/je-4.1.10.tar.gz
(你可能需要先在
oracle
站点注册一个账号,并登陆,才能下载)
笔者还是引用别人写的
HelloWorld
,写得很好:
http://blog.csdn.net/tiandiqing/article/details/4337636
或
http://hi.baidu.com/shirdrn/blog/item/28e1573948cffdf43b87ce6e.html
简单来说,BerkeleyDB和Mysql概念上的类比:Mysql的一个server上可以有多个数据库,数据库中有多个表和记录;BerkeleyDB首先指定文件目录,用于存储,这个叫Enviroment,然后在一个Environment中可以定义多个数据库,以名称来区分,这个叫Database,最后就是在Database中存放KEY-VALUE。
package com.eyesmore.bdb.je;
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() {
}
/** 构建Environment: 指定存储的文件(一个Environment可以有多个数据库) */
public void setUp(String path, long cacheSize) {
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
envConfig.setCacheSize(cacheSize);//The memory available to the database system, in bytes.
File dir = new File(path);
if(!dir.exists()) {//如果指定的目录不存在,则自动创建
dir.mkdir();
System.out.println("创建目录:"+path);
}
try {
env = new Environment(dir, envConfig);
} catch (DatabaseException e) {
e.printStackTrace();
}
}
/** 构建Database: 指定数据库名字,如果指定名字的数据库不存在,则自动创建。*/
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();
}
}
/**数据操作:写
* BDB存储的数据是无格式的,都是二进制的数据,无论是KEY,还是VALUE。
* 如果我们要存取JAVA对象,需要程序员先序列化成二进制的。
* */
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 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 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 == OperationStatus.SUCCESS) {
return true;
}
return false;
}
/**数据操作:删除 */
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;
}
public static void main(String[] args) throws Exception {
MyBerkeleyDB mbdb = new MyBerkeleyDB();
mbdb.setUp("D:\\bdb", 1000000);
mbdb.open("myDB");
// System.out.println("开始向Berkeley DB中存入数据...");
// for (int i = 0; i < 20; i++) {
// try {
// String key = "myKey" + i;
// String value = "myValue" + i;
// System.out.println("[" + key + ":" + value + "]");
// mbdb.put(key, value);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
mbdb.put("liwei", "20");
String value = mbdb.get("liwei");
System.out.println(value);
mbdb.close();
}
}
分享到:
相关推荐
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。 能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身。 多线程支持,JE使用超时的方式来处理...
Berkeley DB Java Edition(以下简称JE)是由美国Sleepycat Software公司(后被Oracle公司收购)开发的一套开放源码的嵌入式数据库,它采用K/V存储,能为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务
Berkeley DB Java Edition (JE) 官方7.5.11下载版本。 相关介绍 https://blog.csdn.net/hadues/article/details/80854288
oracle 官方实现的 基于B+树 文件磁盘 数据存储 的文件数据库。
很好用的NoSQL 数据库, google 使用此数据库存储自己的用户信息, 它能够处理海量数据,效率高
#资源达人分享计划#
Java版本的Berkeley DB用户手册,找了好久
Oracle Berkeley DB Java 版是一个开源的、可嵌入的事务存储引擎,是完全用 Java 编写的。与 Oracle Berkeley DB 类似,Oracle Berkeley DB Java 版在应用程序的地址空间中执行,没有客户端/服务器通信的开销,从而...
NULL 博文链接:https://xpenxpen.iteye.com/blog/2124921
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。
Berkeley DB Java Edition JE 是一个完全用JAVA写的 它适合于管理海量的 简单的数据 能够高效率的处理1到1百万条记录 制约JE数据库的往往是硬件系统 而不是JE本身 多线程支持 JE使用超时的方式来处理线程间的死琐...
自己稍微封装了一下,可以当成简单的map来使用。
这个是最流行的嵌入式高性能开源数据库内核开发包,java企业开发必备。
NULL 博文链接:https://rensanning.iteye.com/blog/1872481
介绍DB API的设置与使用的快速入门手册,目标是提供一个快速有效地机制,能让你进入Berkeley DB研发的世界。在本文中侧重于C++语言的研发人员,以及研究进城内数据管理解决方案的资深架构师。
嵌入式数据库Berkeley DB Java Edition Berkeley DB的使用 使用Berkeley DB的一般步骤 创建、打开、操作、关闭数据库环境Environment
Berkeley DB数据库C语言入门教程.doc
使用BerkeleyDB数据库,java语言开发需要的jar包资源,7.5.11版本