JE要求在任何DATABASE操作前,要先打开数据库环境,就像我们要使用数据库的话必须得先建立连接一样。你可以通过数据库环境来创建和打开database,或者更改database名称和删除database.
可以通过Environments对象来打开环境,打开环境的时候设置的目录必须是已经存在的目录,否则会出错误。默认情况下,如果指定的database不存在则不会自动创建一个新的detabase,但可以通过设置setAllowCreate来改变这一情况。
1. 打开database环境
示例:
Environment env = null;
EnvironmentConfig envconfig = new EnvironmentConfig();
envconfig.setAllowCreate(true);
env = new Environment(new File("D://bdb"), envconfig);
2. 关闭database环境
可以通过Environment.close()这个方法来关闭database环境,当你完成数据库操作后一定要关闭数据库环境。
示例:
if(env!=null){
try {
env.cleanLog();
env.close();
} catch (DatabaseException e) {
e.printStackTrace();
}
}
3. 清理日志
通常在关闭数据库连接的时候,有必要清理下日志,用以释放更多的磁盘空间。我们可以在Environment.close前执行下Environment.cleanLog()来达到此目的。
示例:
try {
if (myDbEnvironment != null) {
myDbEnvironment.cleanLog(); // 在关闭环境前清理下日志
myDbEnvironment.close();
}
} catch (DatabaseException dbe) {
// Exception handling goes here
}
4. Database环境配置
可以通过EnvironmentConfig这个对象来配置database环境。如果想得到当前环境的配置信息则可以通过Environment.getConfig()方法得到当前环境的配置信息。
也可以使用 EnvironmentMutableConfig来配置环境,其实EnvironmentConfig是EnvironmentMutableConfig的子类,所以EnvironmentMutableConfig 能够使用的设置,EnvironmentConfig也同样能够使用。
如果你要获取当前环境的使用情况,那么你可以通过使用EnvironmentStats.getNCacheMiss().来监视RAM cache命中率。EnvironmentStats可以由Environment.getStats()方法获取。
EnvironmentConfig常见方法介绍:
EnvironmentConfig.setAllowCreate() ; 如果设置了true则表示当数据库环境不存在时候重新创建一个数据库环境,默认为false.
EnvironmentConfig.setReadOnly(); 只读方式打开,默认为false.
EnvironmentConfig.setTransactional();事务支持,如果为true,则表示当前环境支持事务处理,默认为false,不支持事务处理。
EnvironmentMutableConfig常用方法介绍:
setCachePercent();设置当前环境能够使用的RAM占整个JVM内存的百分比.
setCacheSize();设置当前环境能够使用的最大RAM。单位BYTE.
setTxnNoSync();当提交事务的时候是否把缓存中的内容同步到磁盘中去。true 表示不同步,也就是说不写磁盘.
setTxnWriteNoSync();当提交事务的时候,是否把缓冲的log写到磁盘上。true 表示不同步,也就是说不写磁盘
Database操作
在BDB中,数据是以key/value方式成队出现的。
打开database
可以通过environment.openDatabase()方法打开一个database,在调用这个方法的时候必须指定database的名称。和databaseConfig() (注:数据库设置)
示例:
DatabaseConfig dbconfig=new DatabaseConfig();
dbconfig.setAllowCreate(true);
db=env.openDatabase(null, "dbac.db", dbconfig);
关闭database
通过调用Database.close()方法来关闭数据库,但要注意,在关闭数据库前必须得先
把游标先关闭。
示例:
if(db!=null){
try {
db.close();
} catch (DatabaseException e) {
e.printStackTrace();
}
}
设置数据库属性
其实设置数据库属性跟设置环境属性差不多,JE中通过DatabaseConfig对象来设置数据库属性。你能够设置的数据库属性如下:
DatabaseConfig.setAllowCreate(),如果是true的话,则当不存在此数据库的时候创建一个。DatabaseConfig.setBtreeComparator(),设置用于Btree比较的比较器,通常是用来排序。
DatabaseConfig.setDuplicateComparator(),设置用来比较一个key有两个不同值的时候的大小比较器。
DatabaseConfig.setSortedDuplicates(),设置一个key是否允许存储多个值,true代表允许,默认false。
DatabaseConfig.setExclusiveCreate(),以独占的方式打开,也就是说同一个时间只能有一实例打开这个database。
DatabaseConfig.setReadOnly(),以只读方式打开database,默认是false。
DatabaseConfig.setTransactional(),如果设置为true,则支持事务处理,默认是false,不支持事务。
一些用来管理的方法
Database.getDatabaseName(),取得数据库的名称,
如:String dbName = myDatabase.getDatabaseName();
Database.getEnvironment(),取得包含这个database的环境信息
如:Environment theEnv = myDatabase.getEnvironment();
Database.preload(),预先加载指定bytes的数据到RAM中
如: myDatabase.preload(1048576l); // 1024*1024
Environment.getDatabaseNames(),返回当前环境下的数据库列表
如: import java.util.List;
List myDbNames = myDbEnv.getDatabaseNames();
for(int i=0; i < myDbNames.size(); i++) {
System.out.println("Database Name: " + (String)myDbNames.get(i));
}
Environment.removeDatabase(),删除当前环境中指定的数据库
如: String dbName = myDatabase.getDatabaseName();
myDatabase.close();
myDbEnv.removeDatabase(null, dbName);
Environment.renameDatabase(),给当前环境下的数据库改名
如:String oldName = myDatabase.getDatabaseName();
String newName = new String(oldName + ".new", "UTF-8");
myDatabase.close();
myDbEnv.renameDatabase(null, oldName, newName);
Environment.truncateDatabase(),清空database内的所有数据,返回清空了多少条记录
如: Int numDiscarded= myEnv.truncate(null,myDatabase.getDatabaseName(),true);
System.out.println("一共删除了 " + numDiscarded +" 条记录 从数据库 " + myDatabase.getDatabaseName());
Environment.sync(),方法来把数据同步到磁盘中去。
向database中添加、读取、删除数据的方法:
Database.put(),向database中添加一条记录。如果你的database不支持一个key对应多个data或当前database中已经存在该key了,则使用此方法将使用新的值覆盖旧的值。
Database.putNoOverwrite(),向database中添加新值但如果原先已经有了该key,则不覆盖。不管database是否允许支持多重记录(一个key对应多个value),只要存在该key就不允许添加,并且返回perationStatus.KEYEXIST信息。
Database.putNoDupData(),向database中添加一条记录,如果database中已经存在了相同的 key和value则返回 OperationStatus.KEYEXIST。
Database.get(),基本的读记录的方法,通过key的方式来匹配,如果没有改记录则返回OperationStatus.NOTFOUND。
Database.getSearchBoth(),通过key和value来同时匹配,同样如果没有记录匹配key和value则会返回OperationStatus.NOTFOUND。
Database.delete(),这个方法来删除记录。如果你的database支持多重记录,则当前key下的所有记录都会被删除,如果只想删除多重记录中的一条则可以使用游标来删除。当然你也可以使用Environment.truncateDatabase()这个方法来清空database 中的所有记录