日期:2014-05-16 浏览次数:20444 次
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