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