Berkeley DB 之 CRUD
来源:互联网 发布:小早川秀秋 知乎 编辑:程序博客网 时间:2024/06/04 20:53
当时设计mq(消息服务中间件)时,我们要确保每条消息能够可靠的发送到消费端,不管是网络掉线,还是mq服务器挂了。如果出现这些情况,我们会把未发出去的消息存放到数据库中,当网络通的时候,在把为发送的消息通过线程发送出去,确保每条消息能可靠的发送出去。特别针对走秀的促销系统,这个是非常重要,所以我们当时选择了je。
一、 简介
Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据。
它是是一个高性能的,嵌入数据库编程库,和C语言,C++,Java,Perl,Python,PHP,Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据,广泛
用于各种操作系统包括大多数Unix类操作系统和Windows操作系统以及实时操作系统
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/*.*
增加对象到数据库中,代码如下
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();
}
}
- Berkeley DB 之 CRUD
- Berkeley DB之JE入门
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB
- Berkeley DB (DB)介绍
- Berkeley DB -- DB Environment
- Berkeley DB -- DB Environment
- berkeley db DB->close()
- Berkeley DB DB数据库
- Berkeley DB Xml 入门系列之二: 在Linux下编译和使用Berkeley DB Xml
- Berkeley DB 概述
- ORACLE XE版本的限制
- sersync同步镜像网站
- scp、sftp、ftp命令及区别
- DTS将以现金及股票交易收购SRS
- flex不能进行debug
- Berkeley DB 之 CRUD
- Multithreading For Performance
- Redhat 5 下 Oracle10g 安装
- java指纹识别的精确算法—SIFT算法
- Android应用开发——Property Animation
- Sersync服务器同步程序 项目简介与设计框架
- Display sub-category products in root category in Magento
- 基于对象与面向对象【转】
- 常用js 总结2 prototype