Berkeley DB实例

package test;

import com.sleepycat.je.*;

import com.sleepycat.bind.EntryBinding;

import com.sleepycat.bind.tuple.TupleBinding;

import com.sleepycat.bind.serial.StoredClassCatalog;

import com.sleepycat.bind.serial.SerialBinding;

import java.io.File;

public class test {

public static void main(String[] args) {



}



/**

* 打开和关闭环境,示例一

*

*/

public void eg1(){

//----打开环境,如果不存在,则创建一个------------

Environment myDbEnvironment=null;

try {

EnvironmentConfig envConfig = new EnvironmentConfig();

envConfig.setAllowCreate(true); //true不存在就创建,false如果不存在则打开环境失败

//envConfig.setReadOnly(true); //true 以只读方式打开,如果是多进程应用,每个进程都要设置为true

//envConfig.setTransactional(true);//true支持事务,false不支持,默认false。可以更改配置文件来设置此参数。

myDbEnvironment = new Environment(new File(".//"), envConfig);//环境所在路径

java.util.List myDbNames = myDbEnvironment.getDatabaseNames(); //得到所有的数据库的名字

for(int i=0; i < myDbNames.size(); i++) {

System.out.println("Database Name: " + (String)myDbNames.get(i));

}

} catch (DatabaseException dbe) {

// 错误处理

}

//----关闭环境----------------

try {

if (myDbEnvironment != null) {

myDbEnvironment.cleanLog(); //在关闭前也最好执行一下cleaner,清理一下日志文件,因为delete操作会浪费一些空间

myDbEnvironment.close();

}

} catch (DatabaseException dbe) {

// 错误处理

}

}

/**

* 打开环境示例二

*

*/

public void eg2()

{

Environment myEnv = null;

try{

myEnv=new Environment(new File("/export/dbEnv"), null);

EnvironmentMutableConfig envMutableConfig = new EnvironmentMutableConfig();

envMutableConfig.setCachePercent(50);//设置je的cache占用jvm 内存的百分比。

//envMutableConfig.setCacheSize(123456);//设定缓存的大小为123456Bytes

envMutableConfig.setTxnNoSync(true);//设定事务提交时是否写更改的数据到磁盘,true不写磁盘。

//envMutableConfig.setTxnWriteNoSync(false);//设定事务在提交时,是否写缓冲的log到磁盘。如果写磁盘会影响性能,不写会影响事务的安全。随机应变。

myEnv.setMutableConfig(envMutableConfig);





EnvironmentStats envStats=myEnv.getStats(null);//调用 Environment.getStats() 返回一个EnvironmentStas对象。调用EnvironmentStats.getNCacheMiss()看命不中数。

long cacheMisses = envStats.getNCacheMiss(); //这个统计非常重要,尤其针对于长时间运行的应用。 它返回不能够在内存中命中的请求总数,这可以用来参考指定cache的大小。



//myEnv.getMutableConfig();//得到当前的环境配置信息

}catch(DatabaseException dbe){}

}



/**

* 打开database,以及相关操作

*

*/

public void eg3(){

Environment myDbEnvironment = null;

Database myDatabase = null;

try {

// Open the environment. Create it if it does not already exist.

EnvironmentConfig envConfig = new EnvironmentConfig();

envConfig.setAllowCreate(true);

myDbEnvironment = new Environment(new File("/export/dbEnv"), envConfig); //也可能用DatabaseConfig参数来打开,这样就可以设置数据库的属性,比如是否允许在库不存在时创建它,是否只读打开,是否支持事务等。



// Open the database. Create it if it does not already exist.

DatabaseConfig dbConfig = new DatabaseConfig();

dbConfig.setAllowCreate(true);

//transaction为null,不支持事务

myDatabase = myDbEnvironment.openDatabase(null,"sampleDatabase",dbConfig); //打开库,要提供一个数据库名字作为参数

} catch (DatabaseException dbe) {

// Exception handling goes here

}



//记录

String aKey = "key";

String aData = "data";



try {

DatabaseEntry theKey = new DatabaseEntry(aKey.getBytes("UTF-8"));//最好指定编码方式,因为不指定编码会用系统的默认编码来转换,因为系统的默认编码可能会被人更改。

DatabaseEntry theData = new DatabaseEntry(aData.getBytes("UTF-8"));

byte[] myKey = theKey.getData();

byte[] myData = theData.getData();



//从byte数组转换为string的方法

String key = new String(myKey, "UTF-8");

String data = new String(myData, "UTF-8");



//get和put用在非重复的数据存储,读写库时,注意一个小区别,就是数据库,是否允许重复的记录存在,两个记录公用一个key,这就是重复的记录,我们把重复的记录成为重复集合。或者叫多重。

//游标用于重复数据存储put和get。

//数据记录在内部是用Btree按照特定排序来存储的。一般是用key来排序的,key相同的多重数据是按照data来排序。



//记录Using Database Records

//记录是由key和data组成,即所熟悉的key->value,二者都被是有DatabaseEntry封装的。

//这个之前也提过很多次了,DatabaseEntry可以封装原始类型和复杂的对象类型,二者都要被转换为byte array存储,转换可以使用Bind API来完成



//写数据

myDatabase.put(null, theKey, theData);//如果不是可重复数据库,put将会覆盖原有的记录。

//myDatabase.putNoOverwrite(null, theKey, theData);//不允许覆盖,不管是否允许数据重复。



//读数据

//--myDatabase.getSearchBoth(null, theKey, theData, LockMode.DEFAULT);//查找key和data都匹配的记录

//--查询出来的key和data都是byte数组形式。

if (myDatabase.get(null, theKey, theData, LockMode.DEFAULT) ==OperationStatus.SUCCESS)

{

byte[] retData = theData.getData();

String foundData = new String(retData, "UTF-8");

System.out.println("For key: '" + aKey + "' found data: '" +foundData + "'.");

}



//删除数据

myDatabase.delete(null, theKey); //删除数据



} catch (Exception e) {}



//关闭数据库

//如果打开了游标,关闭时JE会发出警告,让你关闭他们先。活动状态的游标在关闭库的过程中会产生意想不到的结果,尤其是其他线程在写库的过程中。确定所有的访问都结束后再关闭库

try {

if (myDatabase != null) {

myDatabase.close();

myDbEnvironment.renameDatabase(null, "sampleDatabase", "test");//重命名,必须先关闭数据库

myDbEnvironment.removeDatabase(null, "sampleDatabase");//删除数据库,必须先关闭数据库

//myDbEnvironment.truncateDatabase(null, myDatabase.getDatabaseName(),true);//删除并回收数据库空间 ,true返回删除的记录的数量,false不返回删除的记录数量值

}



if (myDbEnvironment != null) {

myDbEnvironment.close();

}

} catch (DatabaseException dbe) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值