概览
Berkeley DB Java 版是一套纯Java 语言实现的嵌入式数据库(区分关系型数据库)。
关系数据库是开发人员可用来进行数据存储和分析的最复杂的工具之一。应用程序大多将持久化的数据还原成Java 对象使用,并不需要SQL 来做分析(BDB4支持SQL查询,但这并不影响BDB的高性能!)
PrimaryIndex<PK,E>
public class PrimaryIndex<PK,E> extends Object
这是一个实体类的主键标识。The primary index for an entity class and its primary key.
主键标识是线程安全的,多线程能安全的共享同一个主键标识。PrimaryIndex objects are thread-safe. Multiple threads may safely call the methods of a shared PrimaryIndex object.
该主键标识,PK为真实的主键类型,E为对应的数据库存储对象。
如:PrimaryIndex<String,User> 通过String类型的key值,便能查询到对应的User类型对象。
实体注释可以用于定义一个实体类和的PrimaryKey注释可以用来定义一个主键,如以下示例所示。
要获得一个给定的实体类的PrimaryIndex,调用EntityStore.getPrimaryIndex,通过主键类和实体类。例如:
PrimaryIndex<Long,Employer> employerById = ...;
long employerId = ...;
Employer employer = employerById.get(employerId);
所有Java类型都是可持久化的,且不需要实现特别的接口。持久化字段的访问类型可以是private,package-private(缺省访问类型),protected,或public。您不需要手工编码将实例字段和持久化数据进行绑定,只需在每个持久化类中提供一个缺省的构造函数。例如:
@Persistent
class Address {
String street;
String city;
String state;
int zipCode;
private Address() {}
}
容易定义主键和次键。不需要使用外部模式而用Java的注释(annotation)即可定义所有的元数据。继承从其他来源获的元数据可用来作元数据扩展。例如,下面的Employer类定义了一个持久化实体,一个主键字段id和一个次键字段name:
@Entity
class Employer {
@PrimaryKey(sequence="ID")
long id;
@SecondaryKey(relate=ONE_TO_ONE)
String name;
Address address;
private Employer() {}
}
通过Java 集合框架与外部组件互操作。任何主键或次键索引可以使用标准java.util集合来访问。例如:
java.util.SortedMap<String,Employer> map = employerByName.sortedMap();
明确支持类的演变。兼容的变化(加入字段和类型扩大)会自动执行且是透明的。举例来说,向Address类中添加street2字段、zipCode从int改为long等操作均不需要作任何特殊的配置:
@Persistent
class Address {
String street;
String street2;
String city;
String state;
long zipCode;
private Address() {}
}
许多不兼容的改变,如重命名字段或优化单个的类(如:使用通用类型,模块复用等改变),可以用Mutations。Mutations 操作是延迟的:只在存取数据时自动改变,故避免了软件升级时大型数据库转换导致的长时间停机。复杂的类优化可能涉及到多个类,使用ConversionStore 进行。因而,无论持久化类作出何种改变,直接持久层都始终提供可靠数据存取。
Berkeley DB事务引擎提供了性能调优选项:操作直接映射到了引擎内部的API,轻量的对象绑定,而且所有的调整参数均可用。例如, “脏读”可通过LockMode参数实现:
Employer employer = employerByName.get(null, "Gizmo Inc",LockMode.READ_UNCOMMITTED);
对于高性能应用,DatabaseConfig参数可以用来调整Berkeley DB引擎的性能。举例来说,可指定内部B树节点的大小来调整性能,通过如下方式来指定:
DatabaseConfig config = store.getPrimaryConfig(Employer.class);
config.setNodeMaxEntries(64);
store.setPrimaryConfig(config);