日期:2014-05-16  浏览次数:20354 次

Berkely DB Java Edition学习笔记

Berkely DB对于高并发、要求速度快的应用来说是个不错的选择,mysql就是用BDB实现的(mysql的后台) ,mysql快,BDB比mysql还要快N倍。BDB是一种嵌入式的、非关系数据库,它与其他的关系数据库RMDBS不同,它没有提供SQL,而是提供了自己的访问接口。作为一种嵌入式的数据库,它是进程内模式的,也就是说它和应用程序在同一内存空间运行,所以速度要高很多,与嵌入式的数据库如Derby、HSQLDB(都是RMDBS的)相比,它效率更高,使用方法也有很大的不同。现在BDB以被Oracle收购。Berkely DB提供的文档Getting Started with Berkeley DB Java Edition可以说是短小精悍(113页),入门相当不错。下面Get Start吧:
Environment:
首先要接触的就是Environment了,使用它来open database以及做一管理方面的事情.
创建Environment,还需要Environment的一些配置信息EnvironmentConfig。
下面是创建的过程:

view plaincopy to clipboardprint?
EnvironmentConfig envConfig = new EnvironmentConfig();??
envConfig.setAllowCreate(true);??
myDbEnvironment = new Environment(new File("/export/dbEnv"),??
envConfig);?

EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
myDbEnvironment = new Environment(new File("/export/dbEnv"),
envConfig);

其中EnvironmentConfig提供了许多配置参数,常用的有:
envConfig.setAllowCreate()//如果不存在的env的话,是否要创建一个新的
envConfig.setReadOnly()//是否为只读的
envConfig.setTransactional()//是否使用事务
参数都是boolean类型的
除了EnvironmentConfig外,还有EnvironmentMutableConfig,他实际是EnvironmentConfig的父类,使用他来配置在创建完Environment之后可以改变
的属性:
setCachePercent()//设置cache的大小占JVM memory的百分比
setCacheSize()//设置cache的大小
setTxnNoSync()//事务提交是否将改变的记录写入磁盘
setTxnWriteNoSync()//事务提交是否将log写入磁盘
下面看一下使用EnvironmentMutableConfig的方法:

view plaincopy to clipboardprint?
Environment myEnv = new Environment(new File("/export/dbEnv"), null);??
EnvironmentMutableConfig envMutableConfig =??
new EnvironmentMutableConfig();??
envMutableConfig.setTxnNoSync(true);??
myEnv.setMutableConfig(envMutableConfig);?

Environment myEnv = new Environment(new File("/export/dbEnv"), null);
EnvironmentMutableConfig envMutableConfig =
new EnvironmentMutableConfig();
envMutableConfig.setTxnNoSync(true);
myEnv.setMutableConfig(envMutableConfig);

Environment通过close来关闭,释放资源
下面看看Environment在管理方面的一些方法:
可以通过Environment获得EnvironmentStats,他提供了Environment一些状态信息,
例如使用

view plaincopy to clipboardprint?
long cacheMisses = myEnv.getStats(null).getNCacheMiss();?

long cacheMisses = myEnv.getStats(null).getNCacheMiss();

我们可以获得cache未命中的次数,据此来调整cache的大小
可以同过Environment.getDatabaseNames()来获得Environment的数据库的名字:

view plaincopy to clipboardprint?
List myDbNames = myDbEnv.getDatabaseNames();??
for(int i=0; i < myDbNames.size(); i++) {??
System.out.println("Database Name: " + (String)myDbNames.get(i));??
}?

List myDbNames = myDbEnv.getDatabaseNames();
for(int i=0; i < myDbNames.size(); i++) {
System.out.println("Database Name: " + (String)myDbNames.get(i));
}

可以通过Environment.removeDatabase()来删除一个数据库:

view plaincopy to clipboardprint?
String dbName = myDB.getDatabaseName();??
myDB.close();??
myDBEnv.removeDatabase(null,dbName);?

String dbName = myDB.getDatabaseName();
myDB.close();
myDBEnv.removeDatabase(null,dbName);

可以使用Environment.renameDatabase()来重新命名一个数据库:

view plaincopy to clipboardprint?
String dbName = myDB.getDatabaseName();??
String dbNewName = new String(dbName + ".new", "UTF-8");??
myDB.close();??
myDBEnv.renameDatabase(null,dbName,dbNew