woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

Berkeley DB在Queue模式下的使用

Berkeley DBQueue模式下的使用

Queue
模式下仅能存储定长的记录,既value的长度为定长。Queuekey是一个逻辑增长的数,一般就是int
不需要开发者去改变这个类型。

Queue
模式下只能存储定长的记录。所以一定要调用DBset_re_length函数来设定数据库中记录的长度。
如果没有设定,默认的为0。这样当存储记录时一定会报异常。程序出错。
在读取记录时,当记录的长度小于设定的长度时,会填充字符达到设定长度。
默认的字符为0x02ASCII中的)。可以设定自己的填充字符。调用DBset_re_pad

一个简单的示例

#include < time.h >
#include < iostream >
#include < bdb/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模式下不能用游标进行数据的插入。只能进行数据的修改。

 

 

 

Berkeley DBQueue模式下的使用

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;
}

posted on 2011-08-28 21:24 肥仔 阅读(562) 评论(0)  编辑 收藏 引用 所属分类: 数据库


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理