Posted on 2012-09-06 15:13
卡洛shll 阅读(871)
评论(0) 编辑 收藏 引用 所属分类:
数据库
Berkeley DB在Queue模式下的使用
Queue模式下仅能存储定长的记录,即value的长度为定长。Queue的key是一个逻辑增长的数,一般就是int。
不需要开发者去改变这个类型。
Queue模式下只能存储定长的记录。所以一定要调用Db的set_re_len函数来设定数据库中记录的长度。
如果没有设定,默认的为0。这样当存储记录时一定会报异常。程序出错。
在读取记录时,当记录的长度小于设定的长度时,会填充字符达到设定长度。
默认的字符为0x02(ASCII中的)。可以设定自己的填充字符。调用DB的set_re_pad。
一个简单的示例
#include <time.h>
#include <iostream>
#include <db_cxx.h>
struct ValueType
{
int _int;
char _char;
char _array[256];
};
void writeDB( void )
{
Db bdb(0, 0);
bdb.set_re_len(sizeof(ValueType)); //用Queue模式一定要调用,而且一定要在open前调用
bdb.set_re_pad(0x00); //填充字符串为0。
bdb.open(0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0);
size_t k;
ValueType v;
Dbt key&k, sizeof(size_t));
Dbt value(&v, sizeof(ValueType));
//直接用数据库的写函数
for (int i=0; i<1000000; ++i) {
bdb.put(0, &key, &value, DB_APPEND);
}
bdb.close(0);
}
int main( int argc, char* argv[] )
{
clock_t et1 = clock();
writeDB();
clock_t et2 = clock();
std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
return 0;
}
在Queue模式下不能用游标进行数据的插入。只能进行数据的修改。
Queue模式读数据的一个简单的示例
在Queue模式下读数据,记录(Dbt)要调用set_ulen函数和set_flags函数
#include <time.h>
#include <iostream>
#include <bdb/db_cxx.h>
struct ValueType
{
int _int;
char _char;
char _array[256];
};
void readDB( void )
{
Db bdb(0, 0);
bdb.set_re_len(sizeof(ValueType)); //用Queue模式一定要调用,而且一定要在open前调用
bdb.set_re_pad(0x00); //字符串的填充为0。
bdb.open(0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0);
size_t k;
ValueType v;
Dbt key( &k, sizeof( size_t ) );
key.set_ulen( sizeof( size_t ) );
Dbt value( &v, sizeof( ValueType ) );
value.set_ulen( sizeof( ValueType ) );
value.set_flags( DB_DBT_USERMEM );
//直接用数据库的读函数
for( int i=0; i<1000000; ++i )
{
bdb.get( 0, &key, &value, DB_CONSUME );
}
bdb.close( 0 );
}
int main( int argc, char* argv[] )
{
clock_t et1 = clock();
readDB();
clock_t et2 = clock();
std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
return 0;
}