数据库内存扩展
C 应用程序可以通过调用 mco_db_extend_dev()
来添加新的内存设备,从而扩展数据库可用的内存量。
以下代码片段展示了 C 应用程序扩展数据库的推荐方式:
int extend_db_memory(const char * dbname)
{
MCO_RET rc;
int size = 1*1024*1024;
mco_device_t extdev;
/* 设置扩展内存区域参数 */
extdev.type = MCO_MEMORY_CONV;
extdev.assignment = MCO_MEMORY_ASSIGN_DATABASE;
extdev.size = size;
extdev.dev.conv.ptr = (void*)malloc( extdev.size );
if ( mco_db_extend_dev( dbname, &extdev ) == MCO_OK )
{
/* 数据库的随机存取存储器(RAM)池已成功扩大。 */
...
}
return rc;
}
结构体 mco_runtime_info_t 中,max_extends
保存了允许的最大数据库扩展数量(通常仅适用于共享内存中的数据库)。对于常规内存中的数据库和持久数据库,其值为 -1
(表示“无限制”)。
向后兼容
为了向后兼容,还提供了在以前版本(4.0之前)的SmartEDB中使用的旧式mco_db_extend()
API来扩展全内存数据库(但不是共享内存数据库),如下代码片段所示:
int extend_db_memory(const char * dbname)
{
MCO_RET rc;
int size = 1*1024*1024;
void * memory = malloc( size );
if ( mco_db_extend( dbname, memory, size ) == MCO_OK )
{
/* 数据库内存大小已增加。 */
...
}
return rc;
}
从事务内部扩展内存
如果需要从事务内部扩展数据库内存,例如,当写操作由于内存不足而失败时,请使用以下替代版本传递当前活动事务句柄。
MCO_RET mco_db_extend_dev_t(
/*IN*/ mco_trans_h t,
/*IN*/ mco_device_t * dev
);
//或者
MCO_RET mco_db_extend_t(
/*IN*/ mco_trans_h t,
/*IN*/ void *start_ptr,
/*IN*/ uint4 size
);