内存设备规范
对于使用内存数据库的 Java 应用程序,如果未指定设备数组,则在 Database.open() 方法中会自动定义并初始化一个用于所有数据库数据、索引和元数据的单个常规内存设备。例如,使用默认设备初始化的典型 API 调用序列可能如下所示:
class Obj
{
@Indexable(Type=Database.IndexType.BTree, Unique=false) // Declare non-unique tree index by "value" field
int value;
}
public static void main(String[] args)
{
static final int PAGE_SIZE = 128;
static final int DATABASE_SIZE = 16*1024*1024;
...
Database db = new Database();
Database.Parameters params = new Database.Parameters();
...
params.memPageSize = PAGE_SIZE;
params.classes = new Class[]{Obj.class};
...
db.open("tree-db", params, DATABASE_SIZE);
...
}
然而,Java 应用程序可以通过指定要传递给 Database.open() 方法的内存设备数组来覆盖默认的设备初始化。例如,要定义一个共享内存设备,应用程序代码可能如下所示:
class Obj
{
@Indexable(Type=Database.IndexType.BTree, Unique=false) // Declare non-unique tree index by "value" field
public int value;
}
public static void main(String[] args)
{
const int PAGE_SIZE = 128;
const int DATABASE_SIZE = 16*1024*1024;
...
Database db = new Database();
Database.Device[] devs;
char * dbName = "openDb";
char * shareName = "openDb-db";
long hint = 0;
Database.Parameters params = new Database.Parameters();
...
parames.memPageSize = PAGE_SIZE;
parames.classes = new Class[]{Obj.class};
...
devs = new Database.Device[1];
devs[0] = new Database.SharedMemoryDevice(Database.Device.Kind.Data, shareName, hint, DATABASE_SIZE);
...
db.open(dbName, params, devs);
...
}
请注意,共享内存设备必须指定共享内存名称、共享内存段的“提示”地址以及数据库的总大小。
持久数据库
使用持久数据库的应用程序必须定义至少包含四个内存设备的数组,以管理以下不同的内存区域:
- Database.Device.Kind.Data:对于元数据和数据库对象、索引以及其他数据库结构。
- Database.Device.Kind.DiskCache:对于磁盘管理器缓存(页面池)。
- Database.Device.Kind.Data:持久存储设备(可以是文件、多文件或 RAID)。请注意,如果定义了持久设备且应用程序未显式分配 DiskPageSize,运行时将为其分配默认值 4096 字节。(如果多个应用程序或任务尝试为同一数据库分配不同的磁盘页面大小,运行时将返回错误代码。)
- Database.Device.Kind.TransactionLog:包含数据库日志文件的持久性存储设备。
对于一个典型的持久性数据库应用程序,内存设备可以定义如下:
static final int N_DEVICES 4;
static final int PAGE_SIZE = 128;
static final int DISK_PAGE_SIZE = 4096;
static final int DISK_CACHE_SIZE = 8*1024*1024;
static final int DATABASE_SIZE = 16*1024*1024;
Database.Device[] devs = new Database.Device[N_DEVICES];
devs[0] = new Database.PrivateMemoryDevice(Database.Device.Kind.Data, DATABASE_SIZE);
devs[1] = new Database.PrivateMemoryDevice(Database.Device.Kind.DiskCache, DISK_CACHE_SIZE);
devs[2] = new Database.FileDevice(Database.Device.Kind.Data, "opendb.dbs");
devs[3] = new Database.FileDevice(Database.Device.Kind.TransactionLog, "opendb.log");