﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-选择C/C++-随笔分类-Berkeley DB</title><link>http://www.cppblog.com/walkspeed/category/4357.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 22:05:09 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 22:05:09 GMT</pubDate><ttl>60</ttl><item><title>Berkeley DB在Queue模式下的使用2</title><link>http://www.cppblog.com/walkspeed/archive/2007/05/30/25117.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Wed, 30 May 2007 05:58:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/05/30/25117.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/25117.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/05/30/25117.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/25117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/25117.html</trackback:ping><description><![CDATA[Berkeley DB在Queue模式下的使用<br><br>Queue模式读数据的一个简单的示例<br>在Queue模式下读数据，记录（Dbt）要调用set_ulen函数和set_flags函数<br><br>#include &lt; time.h &gt;<br>#include &lt; iostream &gt;<br>#include &lt; bdb/db_cxx.h &gt;<br><br>struct ValueType<br>{<br>&nbsp;&nbsp;&nbsp; int _int;<br>&nbsp;&nbsp;&nbsp; char _char;<br>&nbsp;&nbsp;&nbsp; char _array[256];<br>};<br><br>void readDB( void )<br>{<br>&nbsp;&nbsp; &nbsp;Db bdb( 0, 0 );<br><br>&nbsp;&nbsp; &nbsp;bdb.set_re_len( sizeof( ValueType ) ); //用Queue模式一定要调用，而且一定要在open前调用<br>&nbsp;&nbsp; &nbsp;bdb.set_re_pad( 0x00 ); //为了字符串的填充为0。<br><br>&nbsp;&nbsp; &nbsp;bdb.open( 0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0 );<br><br>&nbsp;&nbsp; &nbsp;size_t k;<br>&nbsp;&nbsp; &nbsp;ValueType v;<br>&nbsp;&nbsp; &nbsp;Dbt key( &amp;k, sizeof( size_t ) );<br>&nbsp;&nbsp; &nbsp;key.set_ulen( sizeof( size_t ) );<br><br>&nbsp;&nbsp; &nbsp;Dbt value( &amp;v, sizeof( ValueType ) );<br>&nbsp;&nbsp; &nbsp;value.set_ulen( sizeof( ValueType ) );<br>&nbsp;&nbsp; &nbsp;value.set_flags( DB_DBT_USERMEM );<br><br>&nbsp;&nbsp; &nbsp;//直接用数据库的读函数<br>&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;1000000; ++i )<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;bdb.get( 0, &amp;key, &amp;value, DB_CONSUME );<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;bdb.close( 0 );<br>}<br><br>int main( int argc, char* argv[] )<br>{<br>&nbsp;&nbsp;&nbsp; clock_t et1 = clock();<br>&nbsp;&nbsp;&nbsp; readDB();<br>&nbsp;&nbsp;&nbsp; clock_t et2 = clock();<br><br>&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "work is fine, " &lt;&lt; "have times : " &lt;&lt; et2 - et1 &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; return 0;<br>}&nbsp;
<br> <img src ="http://www.cppblog.com/walkspeed/aggbug/25117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-30 13:58 <a href="http://www.cppblog.com/walkspeed/archive/2007/05/30/25117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Berkeley DB在Queue模式下的使用 1</title><link>http://www.cppblog.com/walkspeed/archive/2007/05/29/25089.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Tue, 29 May 2007 10:03:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/05/29/25089.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/25089.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/05/29/25089.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/25089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/25089.html</trackback:ping><description><![CDATA[Berkeley DB在Queue模式下的使用<br><br>Queue模式下仅能存储定长的记录，既value的长度为定长。Queue的key是一个逻辑增长的数，一般就是int。<br>不需要开发者去改变这个类型。<br><br>Queue模式下只能存储定长的记录。所以一定要调用DB的set_re_length函数来设定数据库中记录的长度。<br>如果没有设定，默认的为0。这样当存储记录时一定会报异常。程序出错。<br>在读取记录时，当记录的长度小于设定的长度时，会填充字符达到设定长度。<br>默认的字符为0x02（ASCII中的）。可以设定自己的填充字符。调用DB的set_re_pad。<br><br>一个简单的示例<br><br>#include &lt; time.h &gt;<br>#include &lt; iostream &gt;<br>#include &lt; bdb/db_cxx.h &gt;<br><br>struct ValueType<br>{<br>&nbsp;&nbsp; &nbsp;int _int;<br>&nbsp;&nbsp; &nbsp;char _char;<br>&nbsp;&nbsp; &nbsp;char _array[256];<br>};<br><br>void writeDB( void )<br>{<br>&nbsp;&nbsp; &nbsp;Db bdb( 0, 0 );<br><br>&nbsp;&nbsp; &nbsp;bdb.set_re_len( sizeof( ValueType ) ); //用Queue模式一定要调用，而且一定要在open前调用<br>&nbsp;&nbsp; &nbsp;bdb.set_re_pad( 0x00 ); //为了字符串的填充为0。<br><br>&nbsp;&nbsp; &nbsp;bdb.open( 0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0 );<br><br>&nbsp;&nbsp; &nbsp;size_t k;<br>&nbsp;&nbsp; &nbsp;ValueType v;<br>&nbsp;&nbsp; &nbsp;Dbt key( &amp;k, sizeof( size_t ) );<br>&nbsp;&nbsp; &nbsp;Dbt value( &amp;v, sizeof( ValueType ) );<br><br>&nbsp;&nbsp; &nbsp;//直接用数据库的写函数<br>&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;1000000; ++i )<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;bdb.put( 0, &amp;key, &amp;value, DB_APPEND );<br>&nbsp;&nbsp; &nbsp;}<br><br>&nbsp;&nbsp; &nbsp;bdb.close( 0 );<br>}<br><br>int main( int argc, char* argv[] )<br>{<br>&nbsp;&nbsp; &nbsp;clock_t et1 = clock();<br>&nbsp;&nbsp; &nbsp;writeDB();<br>&nbsp;&nbsp; &nbsp;clock_t et2 = clock();<br><br>&nbsp;&nbsp; &nbsp;std::cout &lt;&lt; "work is fine, " &lt;&lt; "have times : " &lt;&lt; et2 - et1 &lt;&lt; std::endl;<br>&nbsp;&nbsp; &nbsp;return 0;<br>}
<br><br>在Queue模式下不能用游标进行数据的插入。只能进行数据的修改。<br>&nbsp;<br>&nbsp;<br>  <img src ="http://www.cppblog.com/walkspeed/aggbug/25089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-29 18:03 <a href="http://www.cppblog.com/walkspeed/archive/2007/05/29/25089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Berkeley DB对并发的支持</title><link>http://www.cppblog.com/walkspeed/archive/2007/05/26/24892.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 26 May 2007 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/05/26/24892.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/24892.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/05/26/24892.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/24892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/24892.html</trackback:ping><description><![CDATA[Berkeley DB对并发的支持<br><br>要让Berkeley DB数据支持并发，就要创建Berkeley DB的环境（environment）<br>环境类是 DbEnv。要支持并发，在初始化DbEnv时要用DB_INIT_CDB、DB_INIT_MPOOL<br>两个标致。<br><br>如下<br><br>DbEnv env；<br>env.open( "evn", DB_INIT_CDB|DB_INIT_MPOOL, 0 );<br><br>然后在创建数据库时，将环境传给数据库。如下<br><br>Db bdb( &amp;env, 0 );<br><br>这样就可以支持并发了。<br><br>Berkeley DB并发的简单原则<br>Berkeley DB的并发遵循的是允许同时多个读操作，当只有一个写操作。<br>1 每个游标有一锁，非游标的读写用一锁<br>2 写操作等待所有的读锁解锁。<br>3 读操作不需要等待写锁解锁。
<br>  <img src ="http://www.cppblog.com/walkspeed/aggbug/24892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-26 16:17 <a href="http://www.cppblog.com/walkspeed/archive/2007/05/26/24892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Berkeley DB的介绍</title><link>http://www.cppblog.com/walkspeed/archive/2007/05/26/24886.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Sat, 26 May 2007 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/archive/2007/05/26/24886.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/24886.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/archive/2007/05/26/24886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/24886.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/24886.html</trackback:ping><description><![CDATA[Berkeley DB的访问方法有四种BTree、Hash、Queue、Recno<br>他们在DB创建时选择，而且只能在创建时选择。一点选定某一个访问方法，<br>在使用中不能改变。<br><br>BTree 数据被存储在一个排序的平衡树结构中。key和value都可以是简单数<br>据（如整型，字符串），也可以是复杂数据（如结构）。当有多个数据的key<br>相同时，可以有复本。<br><br>Hash 数据存储在一个扩展的线性hash表中。其他的特性象BTree。<br><br>Queue 数据存储在一个队列中，记录是定长的。key为一个逻辑数，不由用户<br>选择类型。在尾部插入记录，在头部删除记录和取出记录非常的快。提供了<br>记录水平缩，提高在并发下的访问。<br><br>Recno 数据可以是定常或是变长的记录。其他特性象Queue。key也是一个逻辑数。<br><br>数据库访问方法的选择。<br>根据key可否用户定义分为BTree、Hash一组，Queue、Renco一组。<br><br>BTree与Hash之间的选择<br>如果数据量不，能被放到内存中。这种情况下选择BTree。即在小数据量的情况下<br>选用BTree，原因是在利用key来定为记录时，成功的几率大些。Hash有退步算法。<br><br>但是在大数据量的情况下，由于数据并不能都在数据库中，要访问磁盘，并且BTree<br>要维护的内部信息大于Hash，访问磁盘的几率大于Hash，会造成访问的瓶颈。所以<br>在大数据量下选择Hash。<br><br>Queue与Recno之间的选择<br>用在多并发下最好用Queue。但是如果记录是变长的，就只能选Recno了。在其它的情<br>况下，两者没有明显的差别。<br><br>Berkeley DB支持从非常小的数据库到256T的数据容量的数据库。单个key或recode<br>最大可以为4G的数据。<br><br>Berkeley DB的数据库被存储为二进制的格式，有利于平台的移植。<br><br>Berkeley DB支持并发的访问，但是不能用在NSF（网络文件系统）下。因为无法定位和<br>获得数据库的环境（在环境中设置对并发的控制）。<br><br>Berkeley DB的环境（Environments）提供了以下的功能<br>1 多数据库文件（Multi-database files）。将多个数据存储在一个物理文件中。<br>2 提供多线程或多进程的支持（Multi-thread and multi-process support）。<br>3 事务处理<br>4 高可用性（重复性）支持。即一个主数据库，和多个提供只读能力的复制数据库<br>5 日志子系统。
<br> <img src ="http://www.cppblog.com/walkspeed/aggbug/24886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-05-26 11:26 <a href="http://www.cppblog.com/walkspeed/archive/2007/05/26/24886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>