内存设备规范
结构定义
应用程序通过定义 mco_device_t 结构来指定内存设备的大小、位置、内存类型以及 SmartEDB 运行时如何使用该设备。为了适应不同存储设备的特性,此结构设计得较为复杂。然而,对于使用常规内存的内存数据库,该定义非常简单:只需指定单个设备的类型、分配方式、大小,并在分配堆内存后提供其地址。
例如:
int main(int argc, char* argv[])
{
...
mco_device_t dev;
...
dev.type = MCO_MEMORY_CONV; /* 将设备设置为常规内存设备 */
dev.assignment = MCO_MEMORY_ASSIGN_DATABASE; /* 将该设备指定为主数据库内存 */
dev.size = DATABASE_SEGMENT_SIZE; /* 设置设备大小 */
dev.dev.conv.ptr = (void*)malloc( DATABASE_SEGMENT_SIZE ); /* 分配内存并设置设备指针 */
...
}
对于共享内存设备,定义需要指定操作系统将用于共享该内存段的名称、可能的共享内存标志和可能的“提示”地址。
例如,下面的代码片段为一个典型的Windows应用程序定义了一个共享内存设备:
int main(int argc, char* argv[])
{
...
mco_device_t dev;
...
dev.assignment = MCO_MEMORY_ASSIGN_DATABASE; /* 将该设备指定为主数据库内存 */
dev.size = DATABASE_SEGMENT_SIZE; /* 设置设备大小 */
dev.type = MCO_MEMORY_NAMED; /* 将设备设置为共享命名内存设备 */
sprintf( dev.dev.named.name, "%s-db", db_name ); /* 设置内存名称 */
dev.dev.named.flags = 0; /* 0选项 */
dev.dev.named.hint = 0; /* 设置映射地址或将其置空 */
...
}
持久数据库
通常,持久数据库应用程序将定义一个至少包含四个内存设备的数组来管理以下不同的内存区域:
MCO_MEMORY_ASSIGN_DATABASE:用于元数据和数据库对象、索引和其他数据库结构。
MCO_MEMORY_ASSIGN_CACHE:对于磁盘管理器缓存(页池)。
MCO_MEMORY_ASSIGN_PERSISTENT:持久化存储设备(可以是文件、多文件或RAID)。
请注意,如果定义了持久设备,并且应用程序没有显式地分配
disk_page_size
,则运行时将为其分配4096字节的默认值。如果多个应用程序或任务试图为同一个数据库分配不同的磁盘页大小,则运行时将返回一个错误代码。MCO_MEMORY_ASSIGN_LOG:包含数据库日志文件的持久存储设备。
对于一个典型的持久化数据库应用程序,内存设备可以定义如下:
#define N_DEVICES 4
#define DATABASE_SIZE 600 * 1024
#define CACHE_SIZE 300 * 1024
const char * db_name = "disk_db";
int main(int argc, char* argv[])
{
...
mco_device_t dev[N_DEVICES];
...
/* 将第一个内存设备配置为普通常规内存区域 */
dev[0].type = MCO_MEMORY_CONV;
dev[0].assignment = MCO_MEMORY_ASSIGN_DATABASE;
dev[0].size = DATABASE_SIZE;
dev[0].dev.conv.ptr = (void*)malloc( DATABASE_SIZE );
/* 配置用于缓存的常规内存区域 */
dev[1].type = MCO_MEMORY_CONV;
dev[1].assignment = MCO_MEMORY_ASSIGN_CACHE;
dev[1].size = CACHE_SIZE;
dev[1].dev.conv.ptr = (void*)malloc( CACHE_SIZE );
/* 为主数据库存储配置文件内存设备 */
dev[2].type = MCO_MEMORY_FILE;
dev[2].assignment = MCO_MEMORY_ASSIGN_PERSISTENT;
sprintf(dev[2].dev.file.name, FILE_PREFIX "%s.dbs", db_name);
dev[2].dev.file.flags = MCO_FILE_OPEN_DEFAULT;
/* 配置用于事务日志的文件内存设备 */
dev[3].type = MCO_MEMORY_FILE;
dev[3].assignment = MCO_MEMORY_ASSIGN_LOG;
sprintf(dev[3].dev.file.name, FILE_PREFIX "%s.log", db_name);
dev[3].dev.file.flags = MCO_FILE_OPEN_DEFAULT;
...
}
了解有关为持久存储设备设置的运行时选项,请参阅设备参数页面。