﻿<?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>BlogJava-Chan Chen Coding...-文章分类-DB</title><link>http://www.blogjava.net/czihong/category/50883.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 02 May 2013 18:01:53 GMT</lastBuildDate><pubDate>Thu, 02 May 2013 18:01:53 GMT</pubDate><ttl>60</ttl><item><title>数据库事务与隔离等级详解</title><link>http://www.blogjava.net/czihong/articles/393295.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 21 Dec 2012 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/393295.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/393295.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/393295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/393295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/393295.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">事务（</span><em>transaction</em><span style="font-family: 宋体;">）是数据库管理系统的执行单位，可以是一个数据库操作（如</span>Select<span style="font-family: 宋体;">操作）或者是一组操作序列。事务</span>ACID<span style="font-family: 宋体;">属性，即原子性（</span><em>Atomicity</em><span style="font-family: 宋体;">）、一致性</span>(<em>Consistency</em>)<span style="font-family: 宋体;">、隔离性（</span><em>Isolation</em><span style="font-family: 宋体;">）、持久性（</span><em>Durability</em><span style="font-family: 宋体;">）。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">原子性：保证事务中的所有操作全部执行或全部不执行。例如执行转账事务，要么转账成功，要么失败。成功，则金额从转出帐户转入到目的帐户，并且两个帐户金额将发生相应的变化；失败，则两个账户的金额都不变。不会出现转出帐户扣了钱，而目的帐户没有收到钱的情况。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">一致性：保证数据库始终保持数据的一致性&#8212;&#8212;事务操作之前是一致的，事务操作之后也是一致的，不管事务成功与否。如上面的例子，转账之前和之后数据库都保持数据上的一致性。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">隔离性：多个事务并发执行的话，结果应该与多个事务串行执行效果是一样的。显然最简单的隔离就是将所有事务都串行执行：先来先执行，一个事务执行完了才允许执行下一个。但这样数据库的效率低下，如：两个不同的事务只是读取同一批数据，这样完全可以并发进行。为了控制并发执行的效果就有了不同的隔离级别。下面将详细介绍。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">持久性：持久性表示事物操作完成之后，对数据库的影响是持久的，即使数据库因故障而受到破坏，数据库也应该能够恢复。通常的实现方式是采用日志。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">事务隔离级别（</span><em>transaction isolation levels</em><span style="font-family: 宋体;">）：隔离级别就是对对事务并发控制的等级。</span><a title="American National Standards Institute" href="http://en.wikipedia.org/wiki/American_National_Standards_Institute" style="color: #336699; text-decoration: initial;">ANSI</a>/&nbsp;<a title="International Organization for Standardization" href="http://en.wikipedia.org/wiki/International_Organization_for_Standardization" style="color: #336699; text-decoration: initial;">ISO</a><a title="SQL" href="http://en.wikipedia.org/wiki/SQL" style="color: #336699; text-decoration: initial;">SQL</a><span style="font-family: 宋体;">将其分为串行化（</span>SERIALIZABLE<span style="font-family: 宋体;">）、可重复读（</span>REPEATABLE READ<span style="font-family: 宋体;">）、读已提交（</span>READ COMMITED<span style="font-family: 宋体;">）、读未提交（</span>READ UNCOMMITED<span style="font-family: 宋体;">）四个等级。为了实现隔离级别通常数据库采用锁（</span>Lock<span style="font-family: 宋体;">）。一般在编程的时候只需要设置隔离等级，至于具体采用什么锁则由数据库来设置。首先介绍四种等级，然后举例解释后面三个等级（可重复读、读已提交、读未提交）中会出现的并发问题。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">串行化（</span>SERIALIZABLE<span style="font-family: 宋体;">）：所有事务都一个接一个地串行执行，这样可以避免幻读（</span>phantom reads<span style="font-family: 宋体;">）。对于基于锁来实现并发控制的数据库来说，串行化要求在执行范围查询（如选取年龄在</span>10<span style="font-family: 宋体;">到</span>30<span style="font-family: 宋体;">之间的用户）的时候，需要获取范围锁（</span>range lock<span style="font-family: 宋体;">）。如果不是基于锁实现并发控制的数据库，则检查到有违反串行操作的事务时，需要滚回该事务。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">可重复读（</span>REPEATABLE READ<span style="font-family: 宋体;">）：所有被</span>Select<span style="font-family: 宋体;">获取的数据都不能被修改，这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读，因为这个时候其他事务不能更改所选的数据，但是可以增加数据，因为前一个事务没有范围锁。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">读已提交（</span>READ COMMITED<span style="font-family: 宋体;">）：被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说，事务的读取数据的时候获取读锁，但是读完之后立即释放（不需要等到事务结束），而写锁则是事务提交之后才释放。释放读锁之后，就可能被其他事物修改数据。该等级也是</span>SQL Server<span style="font-family: 宋体;">默认的隔离等级。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">读未提交（</span>READ UNCOMMITED<span style="font-family: 宋体;">）：这是最低的隔离等级，允许其他事务看到没有提交的数据。这种等级会导致脏读（</span>Dirty Read<span style="font-family: 宋体;">）。</span></p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;"><a name="SERIALIZABLE" style="color: rgb(51, 102, 153);"></a><a name="READ_COMMITTED" style="color: rgb(51, 102, 153);"></a>&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体;">例子：下面考察后面三种隔离等级对应的并发问题。假设有两个事务。事务</span>1<span style="font-family: 宋体;">执行查询</span>1<span style="font-family: 宋体;">，然后事务</span>2<span style="font-family: 宋体;">执行查询</span>2<span style="font-family: 宋体;">，然后提交，接下来事务</span>1<span style="font-family: 宋体;">中的查询</span>1<span style="font-family: 宋体;">再执行一次。查询基于以下表进行：</span></p><div align="center" style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;"><table cellpadding="0" border="0"><tbody><tr><td colspan="3" style="padding: 0.75pt;"><p align="center"><a name="Example_queries" style="color: rgb(51, 102, 153);"></a>users</p></td></tr><tr><td style="padding: 0.75pt;"><p align="center"><strong>id</strong><strong></strong></p></td><td style="padding: 0.75pt;"><p align="center"><strong>name</strong><strong></strong></p></td><td style="padding: 0.75pt;"><p align="center"><strong>age</strong><strong></strong></p></td></tr><tr><td style="padding: 0.75pt;"><p>1</p></td><td style="padding: 0.75pt;"><p>Joe</p></td><td style="padding: 0.75pt;"><p>20</p></td></tr><tr><td style="padding: 0.75pt;"><p>2</p></td><td style="padding: 0.75pt;"><p>Jill</p></td><td style="padding: 0.75pt;"><p>25</p></td></tr></tbody></table></div><h3><a name="t0" style="color: rgb(51, 102, 153);"></a><a name="Repeatable_reads_.28phantom_reads.29" style="color: rgb(51, 102, 153);"></a>可重复读(幻读，phantom reads)</h3><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">一个事务中先后各执行一次同一个查询，但是返回的结果集却不一样。发生这种情况是因为在执行Select操作的时候没有获取范围锁（Range Lock），导致其他事务仍然可以插入新的数据。</p><table cellpadding="0" border="0" style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; text-align: left; background-color: #ffffff;"><tbody><tr><td style="padding: 0.75pt;"><p align="center"><strong><span style="font-size: 11.5pt;">Transaction 1</span></strong><strong></strong></p></td><td style="padding: 0.75pt;"><p align="center"><strong><span style="font-size: 11.5pt;">Transaction 2</span></strong><strong></strong></p></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 1 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">SELECT * FROM users</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">WHERE age BETWEEN 10 AND 30;</pre></td><td style="padding: 0.75pt;"><p>&nbsp;</p></td></tr><tr><td style="padding: 0.75pt;"><p>&nbsp;</p></td><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 2 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">INSERT INTO users VALUES ( 3, 'Bob', 27 );</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">COMMIT;</pre></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 1 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">SELECT * FROM users</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">WHERE age BETWEEN 10 AND 30;</pre></td><td style="padding: 0.75pt;"><p>&nbsp;</p></td></tr></tbody></table><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">注意transaction 1对同一个查询语句（Query 1）执行了两次。 如果采用更高级别的隔离等级（即串行化）的话，那么前后两次查询应该返回同样的结果集。但是在可重复读隔离等级中却前后两次结果集不一样。但是为什么叫做可重复读等级呢？那是因为该等级解决了下面的不可重复读问题。</p><h3><a name="t1" style="color: rgb(51, 102, 153);"></a><a name="Non-repeatable_reads" style="color: rgb(51, 102, 153);"></a>读已提交（不可重复读，Non-repeatable reads）</h3><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">在采用锁来实现并发控制的数据库系统中，不可重复读是因为在执行Select操作的时候没有加读锁（read lock）。</p><table cellpadding="0" border="0" style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; text-align: left; background-color: #ffffff; width: 736px; height: 260px;"><tbody><tr><td style="padding: 0.75pt;"><p align="center"><strong><span style="font-size: 11.5pt;">Transaction 1</span></strong><strong></strong></p></td><td style="padding: 0.75pt;"><p align="center"><strong><span style="font-size: 11.5pt;">Transaction 2</span></strong><strong></strong></p></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 1 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">SELECT * FROM users WHERE id = 1;</pre></td><td style="padding: 0.75pt;"><p>&nbsp;</p></td></tr><tr><td style="padding: 0.75pt;"><p>&nbsp;</p></td><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 2 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">UPDATE users SET age = 21 WHERE id = 1;</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">COMMIT; </pre></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 1 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">SELECT * FROM users WHERE id = 1;</pre></td><td style="padding: 0.75pt;"><p>&nbsp;</p></td></tr></tbody></table><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">在这个例子当中，Transaction 2提交成功,所以Transaction 1第二次将获取一个不同的<em>age</em>值.在SERIALIZABLE和REPEATABLE READ隔离级别中,数据库应该返回同一个值。而在READ COMMITTED和READ UNCOMMITTED级别中数据库返回更新的值。这样就出现了不可重复读。</p><h3><a name="t2" style="color: rgb(51, 102, 153);"></a><a name="READ_UNCOMMITTED_.28dirty_reads.29" style="color: rgb(51, 102, 153);"></a>读未提交&nbsp;(脏读，dirty reads)</h3><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">如果一个事务2读取了另一个事务1修改的值，但是最后事务1滚回了，那么事务2就读取了一个脏数据，这也就是所谓的脏读。发生这种情况就是允许事务读取未提交的更新。</p><table cellpadding="0" border="0" style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; text-align: left; background-color: #ffffff;"><tbody><tr><td style="padding: 0.75pt;"><p align="center"><strong><span style="font-size: 11.5pt;">Transaction 1</span></strong><strong></strong></p></td><td style="padding: 0.75pt;"><p align="center"><strong><span style="font-size: 11.5pt;">Transaction 2</span></strong><strong></strong></p></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 1 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">SELECT * FROM users WHERE id = 1;</pre></td><td style="padding: 0.75pt;"><p>&nbsp;</p></td></tr><tr><td style="padding: 0.75pt;"><p>&nbsp;</p></td><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 2 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">UPDATE users SET age = 21 WHERE id = 1;</pre></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">/* Query 1 */</pre><pre style="white-space: pre-wrap; word-wrap: break-word;">SELECT * FROM users WHERE id = 1;</pre></td><td style="padding: 0.75pt;"><p>&nbsp;</p></td></tr><tr><td style="padding: 0.75pt;"><pre style="white-space: pre-wrap; word-wrap: break-word;">&nbsp;</pre></td><td style="padding: 0.75pt;"><p><span style="font-size: 11.5pt; font-family: 宋体;">RollBack</span></p></td></tr></tbody></table><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;"><span style="font-size: 12pt; font-family: 宋体;">综上述，可以等到下面的表格：</span></p><table cellspacing="0" cellpadding="0" border="1" style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; text-align: left; background-color: #ffffff; border: medium none; border-collapse: collapse;"><tbody><tr><td width="142" valign="top" style="border: 1pt solid windowtext; padding: 0cm 5.4pt; background-image: none; background-attachment: scroll; background-color: #cccccc; width: 106.5pt; background-position: 0% 50%; background-repeat: repeat repeat;"><p><span style="font-family: 宋体;">隔离等级</span></p></td><td width="142" valign="top" style="border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; background-image: none; background-attachment: scroll; background-color: #cccccc; width: 106.5pt; background-position: 0% 50%; background-repeat: repeat repeat;"><p><span style="font-family: 宋体;">脏读</span></p></td><td width="142" valign="top" style="border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; background-image: none; background-attachment: scroll; background-color: #cccccc; width: 106.55pt; background-position: 0% 50%; background-repeat: repeat repeat;"><p><span style="font-family: 宋体;">不可重复读</span></p></td><td width="142" valign="top" style="border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; background-image: none; background-attachment: scroll; background-color: #cccccc; width: 106.55pt; background-position: 0% 50%; background-repeat: repeat repeat;"><p><span style="font-family: 宋体;">幻读</span></p></td></tr><tr><td width="142" valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 106.5pt;"><p><span style="font-family: 宋体;">读未提交</span></p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.5pt;"><p>YES</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>YES</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>YES</p></td></tr><tr><td width="142" valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 106.5pt;"><p><span style="font-family: 宋体;">读已提交</span></p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.5pt;"><p>NO</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>YES</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>YES</p></td></tr><tr><td width="142" valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 106.5pt;"><p><span style="font-family: 宋体;">可重复读</span></p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.5pt;"><p>NO</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>NO</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>YES</p></td></tr><tr><td width="142" valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 106.5pt;"><p><span style="font-family: 宋体;">串行化</span></p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.5pt;"><p>NO</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>NO</p></td><td width="142" valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 106.55pt;"><p>NO</p></td></tr></tbody></table><p style="color: #333333; font-family: Arial; font-size: 14.399999618530273px; line-height: 26px; background-color: #ffffff;">&nbsp;</p><img src ="http://www.blogjava.net/czihong/aggbug/393295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-12-21 13:06 <a href="http://www.blogjava.net/czihong/articles/393295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BLOBs and CLOBs  </title><link>http://www.blogjava.net/czihong/articles/392276.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 30 Nov 2012 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/392276.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/392276.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/392276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/392276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/392276.html</trackback:ping><description><![CDATA[<h1><br /></h1><div db.sect2"="" style="font-family: Arial, sans-serif; font-size: 13px;"><p db.para"="" style="margin-top: 1em;">solidDB&#174;&nbsp;can store binary and character data up to 2147483647 (2G - 1) bytes long. When such data exceeds a certain length, the data is called a BLOB (Binary Large OBject) or CLOB (Character Large OBject), depending upon the data type that stores the information. CLOBS contain only "plain text" and can be stored in any of the following data types:</p><p db.para"="" style="margin-top: 1em;">CHAR, WCHAR</p><p db.para"="" style="margin-top: 1em;">VARCHAR, WVARCHAR</p><p db.para"="" style="margin-top: 1em;">LONG VARCHAR (mapped to standard type CLOB),</p><p db.para"="" style="margin-top: 1em;">LONG WVARCHAR (mapped to standard type NCLOB)</p><p db.para"="" style="margin-top: 1em;">BLOBs can store any type of data that can be represented as a sequence of bytes, such as a digitized picture, video, audio, a formatted text document. (They can also store plain text, but you'll have more flexibility if you store plain text in CLOBs). BLOBs are stored in any of the following data types:</p><p db.para"="" style="margin-top: 1em;">BINARY</p><p db.para"="" style="margin-top: 1em;">VARBINARY</p><p db.para"="" style="margin-top: 1em;">LONG VARBINARY (mapped to standard type BLOB)</p><p db.para"="" style="margin-top: 1em;">Since character data is a sequence of bytes, character data can be stored in BINARY fields, as well as in CHAR fields. CLOBs can be considered a subset of BLOBs.</p><p db.para"="" style="margin-top: 1em;">For convenience, we will use the term BLOBs to refer to both CLOBs and BLOBs.</p><p db.para"="" style="margin-top: 1em;">For most non-BLOB data types, such as integer, float, date, etc., there is a rich set of valid operations that you can do on that data type. For example, you can add, subtract, multiply, divide, and do other operations with FLOAT values. Because a BLOB is a sequence of bytes and the database server does not know the "meaning" of that sequence of bytes (i.e. it doesn't know whether the bytes represent a movie, a song, or the design of the space shuttle), the operations that you can do on BLOBs are very limited.</p><p db.para"="" style="margin-top: 1em;">solidDB&nbsp;does allow you to perform some string operations on CLOBs. For example, you can search for a particular substring (e.g. a person's name) inside a CLOB by using the&nbsp;<span apiname=""  db.function"="">LOCATE()</span>&nbsp;function. Because such operations require a lot of the server's resources (memory and/or CPU time),&nbsp;solidDB&nbsp;allows you to limit the number of bytes of the CLOB that are processed. For example, you might specify that only the first 1 megabyte of each CLOB be searched when doing a string search. For more information, see the description of the MaxBlobExpressionSize configuration parameter in&nbsp;<em i=""  db.emphasis"="" style="font-style: italic;">solidDB&nbsp;Administration Guide</em>.</p><p db.para"="" style="margin-top: 1em;">Although it is theoretically possible to store the entire blob "inside" a typical table, if the blob is large, then the server usually performs better if most or all of the blob is not stored in the table. In&nbsp;solidDB, if a blob is no more than N bytes long, then the blob is stored in the table. If the blob is longer than N bytes, then the first N bytes are stored in the table, and the rest of the blob is stored outside the table as disk blocks in the physical database file. The exact value of "N" depends in part upon the structure of the table, the disk page size that you specified when you created the database, etc., but is always at least 256. (Data 256 bytes or shorter is always stored in the table.)</p><p db.para"="" style="margin-top: 1em;">If a data row size is larger than one third of the disk block size of the database file, you must store it partly as a BLOB.</p><p db.para"="" style="margin-top: 1em;">The SYS_BLOBS system table is used as a directory for all BLOB data in the physical database file. One SYS_BLOB entry can accommodate 50 BLOB parts. If the BLOB size exceeds 50 parts, several SYS_BLOB entries per BLOB are needed.</p><p db.para"="" style="margin-top: 1em;">The query below returns an estimate on the total size of BLOBs in the database.</p><pre db.programlisting"="" style="font-family: 'Courier New', Courier, monospace; font-size: 13px; background-color: #dadada; padding: 5px; white-space: pre-wrap; word-wrap: break-word;">select sum(totalsize) from sys_blobs</pre><p db.para"="" style="margin-top: 1em;">The estimate is not accurate, because the info is only maintained at checkpoints. After two empty checkpoints, this query should return an accurate response.</p></div><img src ="http://www.blogjava.net/czihong/aggbug/392276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-11-30 13:44 <a href="http://www.blogjava.net/czihong/articles/392276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAP采用BDB作为后端数据库的理由</title><link>http://www.blogjava.net/czihong/articles/377257.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 03 May 2012 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/377257.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/377257.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/377257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/377257.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/377257.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">1.许多世界知名的大公司都采用了BDB作为多种关键性业务的后端数据库。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Sleepycat Software makes Berkeley DB, the most widely used application-specific data management software in the world with more than 200 million deployments. Customers such as Amazon, AOL, British Telecom, Cisco Systems, EMC, Ericsson, Google, Hitachi, HP, Motorola, RSA Security, Sun Microsystems, TIBCO and Veritas also rely on Berkeley DB for fast, scalable, reliable and cost-effective data management for their mission-critical applications.&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译:Sleepycat软件公司出品的Berkeley DB是一种在特定的数据管理应用程序中广泛使用的数据库系统,在世界范围内有超过两亿的用户支持.许多世界知名的厂商,像Amazon, AOL, British Telecom, Cisco Systems, EMC, Ericsson, Google, Hitachi, HP, Motorola, RSA Security, Sun Microsystems, TIBCO 以及 Veritas都依赖于BDB为他们的许多关键性应用提供快速的,弹性的,可靠的,并且高性价比的数据管理.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">2.以下是chinaunix.net上一位高手给出的解释，在这里引用一下。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">mysql就是用BDB实现的(mysql的后台) 。mysql快，BDB比mysql还要快N倍。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">BDB并发高于RDBMS。&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">容量支持可达256TB。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">基于HASH支持select数据比RDBMS快。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">3.BDB数据库与其它的几种数据库的比较。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">BDB数据库不同与其他几种数据库--关系型（Relational databases），面向对象型（Object-oriented databases），网络数据库（Network databases），它是一种嵌入式（embeded databases)数据库。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">下面先简要说说BDB与其它几种数据库的区别：</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（1）它们几乎都无一例外的采用了结构化查询语言（SQL），而BDB没有。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（2）它们几乎都无一例外的采用了客户/服务器模型，而BDB采用的是嵌入式模型。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">下面是在网上找的一些有关BDB的资料,解释了BDB之所以会和当前流行的大多数数据库不同的一些原因,所引资料未注明出处,后面的翻译是我自己加的：</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（1）Berkeley DB is an open source embedded database library that provides scalable, high-performance, transaction-protected data management services to applications. Berkeley DB provides a simple function-call API for data access and management.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：BDB是一个开放源代码的嵌入式数据库的函数库，它为应用程序提供弹性的，高性能的，transaction-protected的数据库管理服务，BDB为数据的访问和管理提供了简单的应用程序接口API。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（2）Berkeley DB is embedded because it links directly into the application. It runs in the same address space as the application. As a result, no inter-process communication, either over the network or between processes on the same machine, is required for database operations. Berkeley DB provides a simple function-call API for a number of programming languages, including C, C++, Java, Perl, Tcl, Python, and PHP. All database operations happen inside the library. Multiple processes, or multiple threads in a single process, can all use the database at the same time as each uses the Berkeley DB library. Low-level services like locking, transaction logging, shared buffer management, memory management, and so on are all handled transparently by the library.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：BDB之所以是嵌入式数据库是因为它是直接连到应用程序中的。它和应用程序在同一内存空间运行。其结果是，不管应用程序是运行在同一台机器上还是运行在网络上，在进行数据库操作时，它都无需进行进程间通信。BDB为许多编程语言提供了函数接口，这些语言包括C, C++, Java, Perl, Tcl, Python, 和 PHP。所有的数据库操作都发生在函数库内部。多个进程，或者是一个进程中的多个线程，都可以同时使用BDB，因为它们实际是在调用BDB函数库。一些像locking, transaction logging, shared buffer management, memory management等等之类的低级服务都可以由函数库透明地处理。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（3）The library is extremely portable. It runs under almost all UNIX and Linux variants, Windows, and a number of embedded real-time operating systems. It runs on both 32-bit and 64-bit systems. It has been deployed on high-end Internet servers, desktop machines, and on palmtop computers, set-top boxes, in network switches, and elsewhere. Once Berkeley DB is linked into the application, the end user generally does not know that there's a database present at all.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：BDB函数库是高度可移植的。它可以运行在几乎所有的UNIX和LINUX系统之上，也支持WINDOWS和多种嵌入式实时操作系统。它既可以运行在32位系统上，也可以运行在64位系统上。它活跃在高端服务器，桌面系统，掌上电脑，set-top boxes，网络交换机以及其它的一些领域。一旦BDB被连接到应用当中以后，终端用户一般是不知道后端数据库的存在的。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（4）Berkeley DB is scalable in a number of respects. The database library itself is quite compact (under 300 kilobytes of text space on common architectures), but it can manage databases up to 256 terabytes in size. It also supports high concurrency, with thousands of users operating on the same database at the same time. Berkeley DB is small enough to run in tightly constrained embedded systems, but can take advantage of gigabytes of memory and terabytes of disk on high-end server machines.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：BDB在许多方面都是弹性的。函数库本身非常紧凑（在常见的机器体系上大约只占用不到300K的text空间，但是它可以操作多达256TB的数据。它也支持高强度的并发操作，可以同时允许数以千计的用户在同一个数据库进行操作。在高端服务器领域，BDB是足够小的，它可以在高度受限的嵌入式系统上运行，但却可以利用高达GB量级的内存空间和高达TB量级的磁盘空间。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（5）Berkeley DB generally outperforms relational and object-oriented database systems in embedded applications for a couple of reasons. First, because the library runs in the same address space, no inter-process communication is required for database operations. The cost of communicating between processes on a single machine, or among machines on a network, is much higher than the cost of making a function call. Second, because Berkeley DB uses a simple function-call interface for all operations, there is no query language to parse, and no execution plan to produce.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：BDB在嵌入式应用方面的性能比关系型数据库和面向对象的数据库优越的原因是多方面的。首先，因为函数库和应用是运行在同一地址空间中的，省掉了数据库操作时的进程间通信。而众所周知，不管是在单机上还是在分布式系统上，进程间通信所花的时间远多于函数调用所要的时间。其次，因为BDB对所有的操作提供了简洁的函数调用接口，无需对查询语言进行解析，也不需要预执行。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（6）In contrast to most other database systems, Berkeley DB provides relatively simple data access services.Berkeley DB supports only a few logical operations on records. They are:</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Insert a record in a table.&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Delete a record from a table.&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Find a record in a table by looking up its key.&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Update a record that has already been found.&nbsp;</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：与其他大多数数据库系统相比，BDB提供了相对简单的数据访问服务。BDB只支持对记录所做的几种逻辑操作。它们是：</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">在表中插入一条记录。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">从表中删除一条记录。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">通过查询键（key）从表中查找一条记录。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">更新表中已有的一条记录。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">（7）Berkeley DB is not a standalone database server. It is a library, and runs in the address space of the application that uses it.It is possible to build a server application that uses Berkeley DB for data management. For example, many commercial and open source Lightweight Directory Access Protocol (LDAP) servers use Berkeley DB for record storage. LDAP clients connect to these servers over the network. Individual servers make calls through the Berkeley DB API to find records and return them to clients. On its own, however, Berkeley DB is not a server.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：BDB不是一个独立的数据库服务器。它是一个函数库，和调用它的应用程序是运行在同一地址空间中的。可以把BDB作为数据库管理系统来构建服务器程序。比如，有许多商业的和开源的轻量级目录访问协议（LDAP）服务器都使用BDB存储记录。LDAP客户端通过网络连接到服务器。服务器调用BDB的API来查找记录并返回给客户。而在它本身而言，BDB却不是数据库的服务器端。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">所以，BDB是一种完全不同于其它数据库管理系统的数据库，而且它也不是一个数据库服务器端。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">4.BDB的优点和缺点。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Berkeley DB is an ideal database system for applications that need fast, scalable, and reliable embedded database management. For applications that need different services, however, it can be a poor choice.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">Berkeley DB was conceived and built to provide fast, reliable, transaction-protected record storage. The library itself was never intended to provide interactive query support, graphical reporting tools, or similar services that some other database systems provide.We have tried always to err on the side of minimalism and simplicity. By keeping the library small and simple, we create fewer opportunities for bugs to creep in, and we guarantee that the database system stays fast, because there is very little code to execute. If your application needs that set of features, then Berkeley DB is almost certainly the best choice for you.</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">译：当面对的是对性能，规模和可靠性要求都比较高的嵌入式应用的时候，BDB是理想的数据库管理系统。但对于要求多种不同服务的应用而言，选择它是不适当的。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">BDB的初衷是提供快速的，可靠的，transaction-protected的记录存储。函数库本身并没有提供对交互查询的支持，也没有提供图形化的报表工具，或者一些其它的数据库管理系统提供的服务。我们一直在致力于保持函数库的短小和简练，这样做，可以使得bug出现的机会大大减小，而且因为只有很少的代码需要执行，我们可以保证数据库一直快速的运行。如果你的应用正好需要的是这样的一套功能的话，那么BDB几乎一定是你的首选对象。</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">5.我个人的观点</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Verdana, Tahoma, 'BitStream vera Sans', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; text-align: left; background-color: #ffffff; ">BDB之所以适合LDAP,一个关键的因素是它可以保证LDAP的快速响应.因为BDB本身是一种嵌入式的数据库,速度快是它最大的特点,也是它和其他数据库系统相比最大的优势.我们再来看LDAP,LDAP是一种一旦数据建立就很少需要改动的数据库,并且它最常用的操作是读取,查询,搜索等等不改变数据库内容的操作.而让BDB来做这几种事情无疑是最好的选择.这样,即使在有大量用户提交数据库查询的情况下,LDAP仍能快速反馈给用户有用信息.所以,速度的考虑是LDAP选用BDB的最大因素.这也是目前绝大多数的LDAP服务器都选用BDB的根本原因.</span>&nbsp;<img src ="http://www.blogjava.net/czihong/aggbug/377257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-05-03 11:38 <a href="http://www.blogjava.net/czihong/articles/377257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Make Auto Incrementing Field in MongoDB</title><link>http://www.blogjava.net/czihong/articles/374121.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 13 Apr 2012 17:11:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/374121.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/374121.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/374121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/374121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/374121.html</trackback:ping><description><![CDATA[<div><span style="font-size: 11px;">Side counter method</span></div><div><span style="font-size: 11px;">One can keep a counter of the current _id in a side document, in a collection dedicated to counters.</span></div><div><span style="font-size: 11px;">Then use FindAndModify to atomically obtain an id and increment the counter.</span></div><div><span style="font-size: 11px;"><br /></span></div><div><span style="font-size: 11px;">&gt; db.counters.insert({_id: "userId", c: 0});</span></div><div><span style="font-size: 11px;"><br /></span></div><div><span style="font-size: 11px;">&gt; var o = db.counters.findAndModify(</span></div><div><span style="font-size: 11px;">... &nbsp; &nbsp; &nbsp; &nbsp;{query: {_id: "userId"}, update: {$inc: {c: 1}}});</span></div><div><span style="font-size: 11px;">{ "_id" : "userId", "c" : 0 }</span></div><div><span style="font-size: 11px;">&gt; db.mycollection.insert({_id:o.c, stuff:"abc"});</span></div><div><span style="font-size: 11px;"><br /></span></div><div><span style="font-size: 11px;">&gt; o = db.counters.findAndModify(</span></div><div><span style="font-size: 11px;">... &nbsp; &nbsp; &nbsp; &nbsp;{query: {_id: "userId"}, update: {$inc: {c: 1}}});</span></div><div><span style="font-size: 11px;">{ "_id" : "userId", "c" : 1 }</span></div><div><span style="font-size: 11px;">&gt; db.mycollection.insert({_id:o.c, stuff:"another one"});</span></div><div><span style="font-size: 11px;">Once you obtain the next id in the client, you can use it and be sure no other client has it.</span></div><div><span style="font-size: 11px;"><br /></span></div><div><span style="font-size: 11px;">Optimistic loop method</span></div><div><span style="font-size: 11px;">One can do it with an optimistic concurrency "insert if not present" loop. The following example, in Mongo shell Javascript syntax, demonstrates.</span></div><div><span style="font-size: 11px;"><br /></span></div><div><span style="font-size: 11px;">// insert incrementing _id values into a collection</span></div><div><span style="font-size: 11px;">function insertObject(o) {</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; x = db.myCollection;</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; while( 1 ) {</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; // determine next _id value to try</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; var c = x.find({},{_id:1}).sort({_id:-1}).limit(1);</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; var i = c.hasNext() ? c.next()._id + 1 : 1;</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; o._id = i;</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; x.insert(o);</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; var err = db.getLastErrorObj();</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; if( err &amp;&amp; err.code ) {</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( err.code == 11000 /* dup key */ )</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("unexpected error inserting data: " + tojson(err));</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; &nbsp; &nbsp; break;</span></div><div><span style="font-size: 11px;">&nbsp; &nbsp; }</span></div><div><span style="font-size: 11px;">}</span></div><div><span style="font-size: 11px;">The above should work well unless there is an extremely high concurrent insert rate on the collection. In that case, there would be a lot of looping potentially.</span></div><div style="font-family: Tahoma; font-size: 11px; "></div><img src ="http://www.blogjava.net/czihong/aggbug/374121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-04-14 01:11 <a href="http://www.blogjava.net/czihong/articles/374121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SP</title><link>http://www.blogjava.net/czihong/articles/373733.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Tue, 10 Apr 2012 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/373733.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/373733.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/373733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/373733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/373733.html</trackback:ping><description><![CDATA[<div>-- --------------------------------------------------------------------------------</div><div>-- Routine DDL</div><div>-- Note: comments before and after the routine body will not be stored by the server</div><div>-- --------------------------------------------------------------------------------</div><div>DELIMITER $$</div><div></div><div>CREATE DEFINER=`root`@`localhost` PROCEDURE `chan_insert_date_by_starttime`()</div><div>BEGIN</div><div>&nbsp; DECLARE var_id decimal(18,0);&nbsp;</div><div>&nbsp; DECLARE var_issue decimal(18,0);&nbsp;</div><div>&nbsp; DECLARE var_date datetime ;</div><div></div><div>&nbsp; DECLARE cur1 CURSOR FOR&nbsp;</div><div>&nbsp; &nbsp; SELECT issue, datevalue&nbsp;</div><div>&nbsp; &nbsp; FROM jira.customfieldvalue</div><div>&nbsp; &nbsp; where customfield in (10006,10007)</div><div>&nbsp; &nbsp; and issue in (</div><div>&nbsp; &nbsp; &nbsp; &nbsp; SELECT distinct issue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FROM jira.customfieldvalue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; where customfield in (10007)</div><div>&nbsp; &nbsp; )</div><div>&nbsp; &nbsp; and issue not in (</div><div>&nbsp; &nbsp; &nbsp; &nbsp; SELECT distinct issue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FROM jira.customfieldvalue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; where customfield in (10006)</div><div>&nbsp; &nbsp; );</div><div></div><div>&nbsp; OPEN cur1;</div><div>&nbsp; read_loop: LOOP</div><div>&nbsp; &nbsp; FETCH cur1 INTO var_issue, var_date;</div><div>&nbsp; &nbsp; &nbsp; select (max(id) + 1) into var_id from jira.customfieldvalue ;</div><div>&nbsp; &nbsp; &nbsp; INSERT INTO jira.customfieldvalue(id,issue, customfield,datevalue)&nbsp;</div><div>&nbsp; &nbsp; &nbsp; VALUES (var_id,var_issue,10006, var_date);</div><div>&nbsp; END LOOP;</div><div>&nbsp; CLOSE cur1;</div><div>END<br /><br /><br /><br /><div>-- --------------------------------------------------------------------------------</div><div>-- Routine DDL</div><div>-- Note: comments before and after the routine body will not be stored by the server</div><div>-- --------------------------------------------------------------------------------</div><div>DELIMITER $$</div><div></div><div>CREATE DEFINER=`root`@`localhost` PROCEDURE `chan_insert_date_by_created`()</div><div>BEGIN</div><div></div><div>&nbsp; DECLARE var_id decimal(18,0);&nbsp;</div><div>&nbsp; DECLARE var_issue decimal(18,0);&nbsp;</div><div>&nbsp; DECLARE var_date datetime ;</div><div></div><div>&nbsp; DECLARE cur1 CURSOR FOR&nbsp;</div><div>&nbsp; &nbsp; SELECT id, created FROM jira.jiraissue where id in&nbsp;</div><div>&nbsp; &nbsp; ( &nbsp; &nbsp;SELECT issue&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; FROM jira.customfieldvalue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; where customfield in (10000)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; and issue not in (</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT distinct issue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM jira.customfieldvalue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; where customfield in (10007)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; and issue not in (</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT distinct issue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM jira.customfieldvalue</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; where customfield in (10006)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; )</div><div>&nbsp; &nbsp; ) &nbsp;;</div><div></div><div></div><div>&nbsp;</div><div></div><div>&nbsp; OPEN cur1;</div><div></div><div>&nbsp; read_loop: LOOP</div><div>&nbsp; &nbsp; FETCH cur1 INTO var_issue, var_date;</div><div>&nbsp; &nbsp; &nbsp; select (max(id) + 1) into var_id from jira.customfieldvalue ;</div><div>&nbsp; &nbsp; &nbsp; INSERT INTO jira.customfieldvalue(id,issue, customfield,datevalue)&nbsp;</div><div>&nbsp; &nbsp; &nbsp; VALUES (var_id,var_issue,10006, var_date);</div><div></div><div>&nbsp; END LOOP;</div><div></div><div>&nbsp; CLOSE cur1;</div><div></div><div></div><div>END</div></div><img src ="http://www.blogjava.net/czihong/aggbug/373733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-04-10 18:14 <a href="http://www.blogjava.net/czihong/articles/373733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL Auto Backup</title><link>http://www.blogjava.net/czihong/articles/372388.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Wed, 21 Mar 2012 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/372388.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/372388.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/372388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/372388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/372388.html</trackback:ping><description><![CDATA[<div><div>Below is the script example to backup mysql database in command line:-</div><div></div><div><span style="color: red; ">$ mysqldump -h localhost -u username -p database_name &gt; backup_db.sql</span></div><div></div><div>If your mysql database is very big, you might want to compress your sql file.</div><div>Just use the mysql backup command below and pipe the output to gzip,</div><div>then you will get the output as gzip file.</div><div></div><div><span style="color: red; ">$ mysqldump -u username -h localhost -p database_name | gzip -9 &gt; backup_db.sql.gz</span></div><div></div><div>If you want to extract the .gz file, use the command below:-</div><div><span style="color: red; ">$ gunzip backup_db.sql.gz</span></div><div></div><div>Type the following command to import sql data file:</div><div><span style="color: red; ">$ mysql -u username -p -h localhost DATA-BASE-NAME &lt; data.sql</span></div><div></div><div>In this example, import 'data.sql' file into 'blog' database using vivek as username:</div><div><span style="color: red; ">$ mysql -u vivek -p -h localhost blog &lt; data.sql</span></div><div></div><div>If you have a dedicated database server, replace localhost hostname with with actual server name or IP address as follows:</div><div><span style="color: red; ">$ mysql -u username -p -h 202.54.1.10 databasename &lt; data.sql</span></div><div></div><div>OR use hostname such as mysql.cyberciti.biz</div><div><span style="color: red; ">$ mysql -u username -p -h mysql.cyberciti.biz database-name &lt; data.sql</span></div><div></div><div>If you do not know the database name or database name is included in sql dump you can try out something as follows:</div><div><span style="color: red; ">$ mysql -u username -p -h 202.54.1.10 &lt; data.sql</span></div><div></div><div>To auto backup database, please read <a href="http://www.noupe.com/how-tos/10-ways-to-automatically-manually-backup-mysql-database.html">10 ways to Automatically &amp; Manually Backup MySQL Database&nbsp;</a>, here is one example</div><div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; "><div><span style="font-size: 14px; "><span style="font-size: 13px; "><span style="color: #000000; ">[root@sdc</span><span style="color: #000000; ">-</span><span style="color: #000000; ">d1</span><span style="color: #000000; ">-</span><span style="color: #000000; ">pangaea</span><span style="color: #000000; ">-</span><span style="color: #000000; ">devops1&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">]#&nbsp;vi&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">etc</span><span style="color: #000000; ">/</span><span style="color: #000000; ">crontab</span></span></span></div>SHELL</span><span style="color: #000000; ">=/</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">/</span><span style="color: #000000; ">bash<br />PATH</span><span style="color: #000000; ">=/</span><span style="color: #000000; ">sbin:</span><span style="color: #000000; ">/</span><span style="color: #000000; ">bin:</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">sbin:</span><span style="color: #000000; ">/</span><span style="color: #000000; ">usr</span><span style="color: #000000; ">/</span><span style="color: #000000; ">bin<br />MAILTO</span><span style="color: #000000; ">=</span><span style="color: #000000; ">root<br />HOME</span><span style="color: #000000; ">=/</span><span style="color: #000000; "><br /><br />#&nbsp;For&nbsp;details&nbsp;see&nbsp;man&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">&nbsp;crontabs<br /><br />#&nbsp;Example&nbsp;of&nbsp;job&nbsp;definition:<br />#&nbsp;.</span><span style="color: #000000; ">----------------</span><span style="color: #000000; ">&nbsp;minute&nbsp;(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">59</span><span style="color: #000000; ">)<br />#&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;.</span><span style="color: #000000; ">-------------</span><span style="color: #000000; ">&nbsp;hour&nbsp;(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">23</span><span style="color: #000000; ">)<br />#&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;.</span><span style="color: #000000; ">----------</span><span style="color: #000000; ">&nbsp;day&nbsp;of&nbsp;month&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">31</span><span style="color: #000000; ">)<br />#&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;.</span><span style="color: #000000; ">-------</span><span style="color: #000000; ">&nbsp;month&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">12</span><span style="color: #000000; ">)&nbsp;OR&nbsp;jan,feb,mar,apr&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />#&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;.</span><span style="color: #000000; ">----</span><span style="color: #000000; ">&nbsp;day&nbsp;of&nbsp;week&nbsp;(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">)&nbsp;(Sunday</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;or&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">)&nbsp;OR&nbsp;sun,mon,tue,wed,thu,fri,sat<br />#&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; "><br />#&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;user</span><span style="color: #000000; ">-</span><span style="color: #000000; ">name&nbsp;command&nbsp;to&nbsp;be&nbsp;executed<br /></span><span style="color: red; ">59</span><span style="color: #000000; ">&nbsp;</span><span style="color: red; ">23</span><span style="color: #000000; ">&nbsp;</span><span style="color: red; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: red; ">*</span><span style="color: red; ">&nbsp;tue&nbsp;root&nbsp;mysqldump&nbsp;</span><span style="color: red; ">-</span><span style="color: red; ">u&nbsp;root&nbsp;</span><span style="color: red; ">-</span><span style="color: red; ">proot123&nbsp;jira&nbsp;</span><span style="color: red; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: red; ">/</span><span style="color: red; ">export</span><span style="color: red; ">/</span><span style="color: red; ">home</span><span style="color: red; ">/</span><span style="color: red; ">web</span><span style="color: red; ">/</span><span style="color: red; ">dbbak</span><span style="color: red; ">/</span><span style="color: red; ">jira</span><span style="color: red; ">/</span><span style="color: red; ">jira_$(date&nbsp;</span><span style="color: red; ">+</span><span style="color: red; ">\</span><span style="color: red; ">%</span><span style="color: red; ">Y\</span><span style="color: red; ">%</span><span style="color: red; ">m\</span><span style="color: red; ">%</span><span style="color: red; ">d).sql</span></div><div>This script will generate an backup file at 23:59 every Tue.</div><div><span style="color: red; ">Note</span></div><div><span style="color: red; ">The cron does not regonize `date +%Y%m%d`, so use $(date +\%Y\%m\%d) instead of it.</span></div></div><div></div><img src ="http://www.blogjava.net/czihong/aggbug/372388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-03-21 17:43 <a href="http://www.blogjava.net/czihong/articles/372388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB Admin Tool -- RockMongo Install for Ubuntu</title><link>http://www.blogjava.net/czihong/articles/372136.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sun, 18 Mar 2012 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/372136.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/372136.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/372136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/372136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/372136.html</trackback:ping><description><![CDATA[Since from the first time to use MongoDB in my own project, more than one month has passed. During this last month, I have to say MongoDB is powerful, and suit my project well, but it is hard to manage/admin the database. and the way of display json data is ugly by the build-in mongo commomd. For instance,<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&gt;&nbsp;db.User.find()<br />{&nbsp;"_id"&nbsp;:&nbsp;ObjectId("4f657b5e6803fa511a000000"),&nbsp;"about"&nbsp;:&nbsp;"Change&nbsp;the&nbsp;way&nbsp;people&nbsp;learn",&nbsp;"blackListCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"createTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"email"&nbsp;:&nbsp;"admin@stdtlk.com",&nbsp;"fanCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"fanId"&nbsp;:&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000")&nbsp;],&nbsp;"firstName"&nbsp;:&nbsp;"chan",&nbsp;"lastName"&nbsp;:&nbsp;"chen",&nbsp;"levle"&nbsp;:&nbsp;"0",&nbsp;"password"&nbsp;:&nbsp;"admin",&nbsp;"photoURL"&nbsp;:&nbsp;"img/admin.jpg",&nbsp;"school"&nbsp;:&nbsp;"Stdtlk&nbsp;University",&nbsp;"title"&nbsp;:&nbsp;"starter"&nbsp;}<br />{&nbsp;"_id"&nbsp;:&nbsp;ObjectId("4f6582986803fa3d1a000000"),&nbsp;"about"&nbsp;:&nbsp;"I&nbsp;like&nbsp;the&nbsp;way&nbsp;to&nbsp;learn",&nbsp;"blackListCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"createTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"email"&nbsp;:&nbsp;"google@stdtlk.com",&nbsp;"fanCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"fanId"&nbsp;:&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000")&nbsp;],&nbsp;"firstName"&nbsp;:&nbsp;"google",&nbsp;"lastName"&nbsp;:&nbsp;"google",&nbsp;"levle"&nbsp;:&nbsp;"0",&nbsp;"password"&nbsp;:&nbsp;"google",&nbsp;"photoURL"&nbsp;:&nbsp;"img/google.jpg",&nbsp;"school"&nbsp;:&nbsp;"AAA&nbsp;University",&nbsp;"title"&nbsp;:&nbsp;"starter"&nbsp;}<br />{&nbsp;"_id"&nbsp;:&nbsp;ObjectId("4f6582cc6803fa501a000003"),&nbsp;"about"&nbsp;:&nbsp;"Apple&nbsp;is&nbsp;greate",&nbsp;"blackListCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"createTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"email"&nbsp;:&nbsp;"apple@stdtlk.com",&nbsp;"fanCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"fanId"&nbsp;:&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000")&nbsp;],&nbsp;"firstName"&nbsp;:&nbsp;"apple",&nbsp;"lastName"&nbsp;:&nbsp;"apple",&nbsp;"levle"&nbsp;:&nbsp;"0",&nbsp;"password"&nbsp;:&nbsp;"apple",&nbsp;"photoURL"&nbsp;:&nbsp;"img/apple.jpg",&nbsp;"school"&nbsp;:&nbsp;"BBB&nbsp;University",&nbsp;"title"&nbsp;:&nbsp;"starter"&nbsp;}<br />{&nbsp;"_id"&nbsp;:&nbsp;ObjectId("4f6582ec6803faa91c000000"),&nbsp;"about"&nbsp;:&nbsp;"microsoft&nbsp;is&nbsp;old",&nbsp;"blackListCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"createTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"email"&nbsp;:&nbsp;"microsoft@stdtlk.com",&nbsp;"fanCreateTime"&nbsp;:&nbsp;"2012-03-16&nbsp;13:00",&nbsp;"fanId"&nbsp;:&nbsp;[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000"),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectId("4f657b5e6803fa511a000000")&nbsp;],&nbsp;"firstName"&nbsp;:&nbsp;"microsoft",&nbsp;"lastName"&nbsp;:&nbsp;"microsoft",&nbsp;"levle"&nbsp;:&nbsp;"0",&nbsp;"password"&nbsp;:&nbsp;"microsoft",&nbsp;"photoURL"&nbsp;:&nbsp;"img/microsoft.jpg",&nbsp;"school"&nbsp;:&nbsp;"CCC&nbsp;University",&nbsp;"title"&nbsp;:&nbsp;"starter"&nbsp;}</div><br />All documents are outputted in one line, if the document has a field which have huge length of characters, it is not easy to find out and read what we look for. So I look around on the internet, and read the <a href="http://www.mongodb.org/display/DOCS/Admin+UIs">MongoDB Admin UI</a>, it recommend some useful tools to admin the database. RockMongo is tool that catch my eyes, and many folks on stack overflow also put some positive feedback on this tool, hence I decide to try it out. Here are the steps to install Rockmongo on Ubuntu.<br />1. Install apache2, php5<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->sudo&nbsp;apt-get&nbsp;install&nbsp;apache2&nbsp;php5&nbsp;php5-dev&nbsp;php5-cli</div><br />2. Install php mongo driver<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->pecl&nbsp;install&nbsp;mongo</div><br />3. Config php.ini<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->root@ubuntu:~#&nbsp;find&nbsp;/&nbsp;-name&nbsp;php.ini<br />/etc/php5/apache2/php.ini<br />/etc/php5/cli/php.ini<br />root@ubuntu:~#&nbsp;echo&nbsp;"extension=mongo.so"&nbsp;&gt;&gt;&nbsp;/etc/php5/apache2/php.ini</div><br />4.check php install successfully<font size="2"><br /></font><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">root@ubuntu:~#&nbsp;sudo&nbsp;find&nbsp;/&nbsp;-name&nbsp;www<br />/var/www<br />root@ubuntu:~#&nbsp;sudo&nbsp;echo&nbsp;"&lt;?&nbsp;phpinfo()&nbsp;?&gt;"&nbsp;&gt;&gt;&nbsp;/var/www/info.php</div>open <a href="ttp://localhost/info.php">http://localhost/info.php<br /></a>if everything goes ok, this page will display<br /><img src="http://www.blogjava.net/images/blogjava_net/czihong/Screenshot.png" width="900" height="512" alt="" align="left" /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />5. download rockmongo from <a href="http://code.google.com/p/rock-php/downloads/list">rockmongo</a><font size="2"><br /></font><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">root@ubuntu:/var/www#&nbsp;cd&nbsp;/var/www<br />root@ubuntu:/var/www#&nbsp;wget&nbsp;http://rock-php.googlecode.com/files/rockmongo-v1.1.0.zip<br /><div>root@ubuntu:/var/www# unzip rockmongo-v1.1.0.zip -d rockmongo</div></div><br />6. lunch mongod<br /><br />7. restart apache server<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div style="display: inline-block; ">root@ubuntu</div>: /etc/init.d/apache2&nbsp;restart</div><br />8. open http://localhost/rockmongo/index.php &nbsp;by default, username and password are both admin.<br /><img src="http://www.blogjava.net/images/blogjava_net/czihong/111.png" alt="" width="900" height="496" /><br /><br /><br /> &nbsp;<img src ="http://www.blogjava.net/czihong/aggbug/372136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-03-18 15:54 <a href="http://www.blogjava.net/czihong/articles/372136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Indexes in MongoDB</title><link>http://www.blogjava.net/czihong/articles/370841.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Mon, 27 Feb 2012 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370841.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370841.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370841.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Refer to:&nbsp;http://www.mongodb.org/display/DOCS/IndexesBasicsAn index is a data structure that collects information about the values of the specified fields in the documents of a collection. This d...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/370841.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/370841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-27 14:34 <a href="http://www.blogjava.net/czihong/articles/370841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Optimizing Object IDs</title><link>http://www.blogjava.net/czihong/articles/370837.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Mon, 27 Feb 2012 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370837.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370837.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370837.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; ">The&nbsp;<tt style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">_id</tt>&nbsp;field in a MongoDB document is very important and is always indexed for normal collections. This page lists some recommendations. Note that it is common to use the BSON ObjectID datatype for _id's, but the values of an&nbsp;<tt style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">_id</tt>&nbsp;field can be of any type.</p><h5><a name="OptimizingObjectIDs-Usethecollections%27naturalprimarykey%27intheidfield." style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(76, 58, 44) !important; "></a>Use the collections 'natural primary key' in the _id field.</h5><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; ">_id's can be any type, so if your objects have a natural unique identifier, consider using that in _id to both save space and avoid an additional index.</p><h5><a name="OptimizingObjectIDs-Whenpossible%2Cuseidvaluesthatareroughlyinascendingorder." style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(76, 58, 44) !important; "></a>When possible, use _id values that are roughly in ascending order.</h5><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; ">If the _id's are in a somewhat well defined order, on inserts the entire b-tree for the _id index need not be loaded.&nbsp;<a href="http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-TheBSONObjectIdDatatype" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-decoration: none; color: #375fa0; ">BSON ObjectIds</a>&nbsp;have this property.</p><h5><a name="OptimizingObjectIDs-StoreBinaryGUIDsasBinData%2Cratherthanashexencodedstrings" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(76, 58, 44) !important; "></a>Store Binary GUIDs as BinData, rather than as hex encoded strings</h5><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; "><a href="http://www.bsonspec.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-decoration: none; color: #375fa0; ">BSON</a>&nbsp;includes a binary data datatype for storing byte arrays. Using this will make the id values, and their respective keys in the _id index, twice as small.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; ">Note that unlike the BSON Object ID type (see above), most UUIDs do not have a rough ascending order, which creates additional caching needs for their index.</p><div panel"="" style="margin-top: 10px; margin-right: 20px; margin-bottom: 10px; margin-left: 20px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f3f4eb; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; overflow-x: auto; overflow-y: auto; border-top-color: #6699cc; border-right-color: #6699cc; border-bottom-color: #6699cc; border-left-color: #6699cc; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17px; text-align: -webkit-left; "><div panelcontent"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; padding-right: 12px; padding-left: 12px; font-size: 0.95em; "><pre style="margin-top: 10px; margin-bottom: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; overflow-y: auto; white-space: pre-wrap; font-family: 'Courier New', Courier, monospace; line-height: 1.3; ">&gt; <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #808080; background-color: inherit; ">// mongo shell bindata info: <br /></span>&gt; help misc         <br />&nbsp;&nbsp;&nbsp;&nbsp;b = <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #000091; background-color: inherit; ">new</span> BinData(subtype,base64str)  &nbsp;&nbsp;&nbsp;&nbsp;create a BSON BinData value         &nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;b.subtype()                         &nbsp;&nbsp;&nbsp;&nbsp;the BinData subtype (0..255)         <br />&nbsp;&nbsp;&nbsp;&nbsp;b.length()                          &nbsp;&nbsp;&nbsp;&nbsp;length of the BinData data in bytes         <br />&nbsp;&nbsp;&nbsp;&nbsp;b.hex()                             &nbsp;&nbsp;&nbsp;&nbsp;the data as a hex encoded string         <br />&nbsp;&nbsp;&nbsp;&nbsp;b.base64()                          &nbsp;&nbsp;&nbsp;&nbsp;the data as a base 64 encoded string         <br />&nbsp;&nbsp;&nbsp;&nbsp;b.toString() </pre></div></div><h5><a name="OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield." style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(76, 58, 44) !important; "></a>Extract insertion times from _id rather than having a separate timestamp field.</h5><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; ">The BSON ObjectId format provides documents with a creation timestamp (one second granularity) for free. Almost all drivers implement methods for extracting these timestamps; see the relevant api docs for details. In the shell:</p><div panel"="" style="margin-top: 10px; margin-right: 20px; margin-bottom: 10px; margin-left: 20px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f3f4eb; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; overflow-x: auto; overflow-y: auto; border-top-color: #6699cc; border-right-color: #6699cc; border-bottom-color: #6699cc; border-left-color: #6699cc; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17px; text-align: -webkit-left; "><div panelcontent"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; padding-right: 12px; padding-left: 12px; font-size: 0.95em; "><pre style="margin-top: 10px; margin-bottom: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; overflow-y: auto; white-space: pre-wrap; font-family: 'Courier New', Courier, monospace; line-height: 1.3; ">&gt; <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #808080; background-color: inherit; ">// mongo shell ObjectId methods <br /></span>&gt; help misc         <br />&nbsp;&nbsp;&nbsp;&nbsp;o = <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #000091; background-color: inherit; ">new</span> ObjectId()      create a <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #000091; background-color: inherit; ">new</span> ObjectId         <br />&nbsp;&nbsp;&nbsp;&nbsp;o.getTimestamp()        <span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #000091; background-color: inherit; ">return</span> timestamp derived from first 32 bits of the OID         <br />&nbsp;&nbsp;&nbsp;&nbsp;o.isObjectId()         <br />&nbsp;&nbsp;&nbsp;&nbsp;o.toString()         <br />&nbsp;&nbsp;&nbsp;&nbsp;o.equals(otherid) </pre></div></div><h5><a name="OptimizingObjectIDs-Sortbyidtosortbyinsertiontime" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(76, 58, 44) !important; "></a>Sort by _id to sort by insertion time</h5><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font-size: 13px; line-height: 13pt; color: #4c3a2c !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; max-width: 800px; font-family: helvetica, arial, sans-serif; text-align: -webkit-left; background-color: #f3f4eb; "><span style="background-color: yellow; ">BSON ObjectId's begin with a timestamp. Thus sorting by _id, when using the ObjectID type, results in sorting by time. Note: granularity of the timestamp portion of the ObjectID is to one second only.</span></p><div panel"="" style="margin-top: 10px; margin-right: 20px; margin-bottom: 10px; margin-left: 20px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; overflow-x: auto; overflow-y: auto; border-top-color: #6699cc; border-right-color: #6699cc; border-bottom-color: #6699cc; border-left-color: #6699cc; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17px; text-align: -webkit-left; background-color: #f3f4eb; "><div panelcontent"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; padding-right: 12px; padding-left: 12px; font-size: 0.95em; background-color: #ffffff; "><pre style="margin-top: 10px; margin-bottom: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; overflow-y: auto; white-space: pre-wrap; font-family: 'Courier New', Courier, monospace; line-height: 1.3; "><span style="background-color: yellow; ">&gt; </span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #808080; background-color: yellow; ">// get 10 newest items <br /></span><span style="background-color: yellow; ">&gt; db.mycollection.find().sort({id:-1}).limit(10);  </span></pre><div></div></div></div><img src ="http://www.blogjava.net/czihong/aggbug/370837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-27 14:06 <a href="http://www.blogjava.net/czihong/articles/370837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Five Reasons of Choosing MongoDB</title><link>http://www.blogjava.net/czihong/articles/370729.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 24 Feb 2012 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370729.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370729.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370729.html</trackback:ping><description><![CDATA[<div><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; list-style-position: initial; list-style-image: initial; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; text-align: left; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; word-wrap: break-word; ">Document Database &gt; Most of you data is embedded in a document, so in order to get the data about a person, you don't have to join several tables. Thus, better performance for many use cases.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; word-wrap: break-word; ">Strong Query Language &gt; Despite not been an RDBMS, MongoDB has a very strong query language that allows you to get something very specific or very general from a document or documents. The DB is queried using javascript so you can do many more things beside querying (e.g. functions, calculations).</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; word-wrap: break-word; ">Sharding &amp; Replication &gt; Sharding allows you application to scale horizontally rather than vertically. In other words, more small servers instead of one huge server. And replication gives you fail-over safety in several configurations (e.g. master/slave).</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; word-wrap: break-word; ">Powerful Indexing - I originally got interested in MongoDB because it allows geo-spatial indexing out of the box but it has many other indexing configurations as well.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; word-wrap: break-word; ">Cross-Platform - MongoDB has many&nbsp;<a href="http://www.mongodb.org/display/DOCS/Drivers" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #4a6b82; text-decoration: none; cursor: pointer; ">drivers</a>.</li></ol></div><img src ="http://www.blogjava.net/czihong/aggbug/370729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-24 22:12 <a href="http://www.blogjava.net/czihong/articles/370729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB vs. RDBMS Schema Design</title><link>http://www.blogjava.net/czihong/articles/370358.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Mon, 20 Feb 2012 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370358.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370358.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370358.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: In this article, based on chapter 4 of MongoDB in Action, author Kyle Banker explains how MongoDB schema differs from an equivalent RDBMS schema, and how common relationships between entities, such as...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/370358.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/370358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-20 19:34 <a href="http://www.blogjava.net/czihong/articles/370358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mongo Metadata</title><link>http://www.blogjava.net/czihong/articles/370295.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sun, 19 Feb 2012 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370295.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370295.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370295.html</trackback:ping><description><![CDATA[<div></div><div>The &lt;dbname&gt;.system.* namespaces in MongoDB are special and contain database system information. &nbsp;System collections include:</div><div></div><div>&lt;dbname&gt;.system.namespaces lists all namespaces.</div><div>&lt;dbname&gt;.system.indexes lists all indexes. Additional namespace / index metadata exists in the database.ns files, and is opaque.</div><div>&lt;dbname&gt;.system.profile stores database profiling information.</div><div>&lt;dbname&gt;.system.users lists users who may access the database.</div><div>Additionally, in the local database only there is replication information in system collections, e.g., local.system.replset contains the replica set configuration.</div><div></div><div>Information on the structure of a stored document is stored within the document itself. &nbsp;See BSON .</div><div></div><div>There are several restrictions on manipulation of objects in the system collections. Inserting in system.indexes adds an index, but otherwise that table is immutable (the special drop index command updates it for you). system.users is modifiable. system.profile is droppable.</div><div></div><div>Note: $ is a reserved character. Do not use it in namespace names or within field names. Internal collections for indexes use the $character in their names. These collection store b-tree bucket data and are not in BSON format (thus direct querying is not possible).</div><img src ="http://www.blogjava.net/czihong/aggbug/370295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-19 16:47 <a href="http://www.blogjava.net/czihong/articles/370295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Schema Design for MongoDB</title><link>http://www.blogjava.net/czihong/articles/370250.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 18 Feb 2012 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370250.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370250.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370250.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Schema design in MongoDB is very different than schema design in a relational DBMS. However it is still very important and the first step towards building an application.In relational data models, c...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/370250.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/370250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-18 15:58 <a href="http://www.blogjava.net/czihong/articles/370250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Basic Term of  MongoDB</title><link>http://www.blogjava.net/czihong/articles/370249.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 18 Feb 2012 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370249.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370249.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370249.html</trackback:ping><description><![CDATA[<div>
<p style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; "><span style="font-family: Arial; font-size: 14pt; font-size: 14px; line-height: 21px;"><font color="#000000" face="verdana, 'courier new'"></font></span></p><div><div><strong style="font-size: 14pt; ">Document</strong></div><div>MongoDB can be thought of as a document-oriented database. By 'document', we mean structured documents, not freeform text documents. These documents canbe thought of as objectsbut only the data of an object, not the code, methods or class hierarchy. Additionally, there is much less linking between documents in MongoDB data models than there is between objects in a program written in an object-oriented programming language.</div><div>In MongoDB the documents are conceptually JSON. More specifically the documents are represented in a format calledBSON(standing for Binary JSON).</div><div>Documents are stored inCollections.<br /></div><div><strong style="font-size: 14pt; ">Maximum Document Size</strong></div><div>MongoDB limits the data size of individual BSON objects/documents. At the time of this writing the limit is 16MB.</div><div>This limit is designed as a sanity-check; it is not a technical limit on document sizes. The thinking is that if documents are larger than this size, it is likely the schema is not ideal. Further it allows drivers to make some assumptions on the max size of documents.</div><div>The concept is that the maximum document size is a limit that ensures each document does not require an excessive amount of RAM from the machine, or require too much network bandwidth to fetch. For example, fetching a full 100MB document would take over 1 second to fetch over a gigabit ethernet connection. In this situation one would be limited to 1 request per second.</div><div>Over time, as computers grow in capacity, the limit will be adjusted upward.</div><div></div><div><strong style="font-size: 14pt; ">Collection</strong></div><div>MongoDB collections are essentially named groupings of documents. You can think of them as roughly equivalent to relational database tables.</div><div>A MongoDB collection is a collection ofBSONdocuments. These documents usually have the same structure, but this is not a requirement since MongoDB is a schema-free (or more accurately, "dynamic schema") database. You may store a heterogeneous set of documents within a collection, as you do not need predefine the collection's "columns" or fields.</div><div>A collection is created when the first document is inserted.</div><div>Collection names should begin with letters or an underscore and may include numbers; $ is reserved. Collections can be organized in namespaces; these are named groups of collections defined using a dot notation. For example, you could define collections blog.posts and blog.authors, both reside under "blog". Note that this is simply an organizational mechanism for the user -- the collection namespace is flat from the database's perspective.</div><div>The maximum size of a collection name is 128 characters (including the name of the db and indexes). It is probably best to keep it under 80/90 chars.</div><div></div><div><strong style="font-size: 14pt; ">Namespace</strong></div><div>MongoDB stores BSON objects in collections. The concatenation of the database name and the collection name (with a period in between) is called a namespace.</div><div></div><div>For example, acme.users is a namespace, where acme is the database name, and users is the collection name. Note that periods can occur in collection names, so a name such as acme.blog.posts is legal too (in that case blog.posts is the collection name.</div></div><p>&nbsp;</p>
</div>
<div></div><img src ="http://www.blogjava.net/czihong/aggbug/370249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-18 15:52 <a href="http://www.blogjava.net/czihong/articles/370249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么要用非关系数据库？</title><link>http://www.blogjava.net/czihong/articles/370243.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Sat, 18 Feb 2012 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/370243.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/370243.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/370243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/370243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/370243.html</trackback:ping><description><![CDATA[<div><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">随着互联网web2.0网站的兴起，非关系型的数据库现在成了一个极其热门的新领域，非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站，特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题，例如：&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; "><strong>1、High&nbsp;performance&nbsp;-&nbsp;对数据库高并发读写的需求</strong>&nbsp;<br />web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息，所以基本上无法使用动态页面静态化技术，因此数据库并发负载非常高，往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住，但是应付上万次SQL写数据请求，硬盘IO就已经无法承受了。其实对于普通的BBS网站，往往也存在对高并发写请求的需求，例如像JavaEye网站的实时统计在线用户状态，记录热门帖子的点击次数，投票计数等，因此这是一个相当普遍的需求。&nbsp;<br /><br /><strong>2、Huge&nbsp;Storage&nbsp;-&nbsp;对海量数据的高效率存储和访问的需求&nbsp;</strong><br />类似Facebook，twitter，Friendfeed这样的SNS网站，每天用户产生海量的用户动态，以Friendfeed为例，一个月就达到了2.5亿条用户动态，对于关系数据库来说，在一张2.5亿条记录的表里面进行SQL查询，效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统，例如腾讯，盛大，动辄数以亿计的帐号，关系数据库也很难应付。&nbsp;<br /><br /><strong>3、High&nbsp;Scalability&nbsp;&amp;&amp;&nbsp;High&nbsp;Availability-&nbsp;对数据库的高可扩展性和高可用性的需求&nbsp;</strong><br />在基于web的架构当中，数据库是最难进行横向扩展的，当一个应用系统的用户量和访问量与日俱增的时候，你的数据库却没有办法像web&nbsp;server和app&nbsp;server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说，对数据库系统进行升级和扩展是非常痛苦的事情，往往需要停机维护和数据迁移，为什么数据库不能通过不断的添加服务器节点来实现扩展呢？&nbsp;<br /><br />在上面提到的&#8220;三高&#8221;需求面前，关系数据库遇到了难以克服的障碍，而对于web2.0网站来说，关系数据库的很多主要特性却往往无用武之地，例如：&nbsp;<br /><br /><strong>1、数据库事务一致性需求</strong>&nbsp;<br />很多web实时系统并不要求严格的数据库事务，对读一致性的要求很低，有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。&nbsp;<br /><br /><strong>2、数据库的写实时性和读实时性需求</strong>&nbsp;<br />对关系数据库来说，插入一条数据之后立刻查询，是肯定可以读出来这条数据的，但是对于很多web应用来说，并不要求这么高的实时性，比方说我（JavaEye的robbin）发一条消息之后，过几秒乃至十几秒之后，我的订阅者才看到这条动态是完全可以接受的。&nbsp;<br /><br /><strong>3、对复杂的SQL查询，特别是多表关联查询的需求</strong>&nbsp;<br />任何大数据量的web系统，都非常忌讳多个大表的关联查询，以及复杂的数据分析类型的复杂SQL报表查询，特别是SNS类型的网站，从需求以及产品设计角度，就避免了这种情况的产生。往往更多的只是单表的主键查询，以及单表的简单条件分页查询，SQL的功能被极大的弱化了。&nbsp;<br /><br />因此，关系数据库在这些越来越多的应用场景下显得不那么合适了，为了解决这类问题的非关系数据库应运而生，现在这两年，各种各样非关系数据库，特别是键值数据库(Key-Value&nbsp;Store&nbsp;DB)风起云涌，多得让人眼花缭乱。前不久国外刚刚举办了</span><a href="http://journal.uggedal.com/nosql-east-2009---summary-of-day-1" target="_blank" data_ue_src="http://journal.uggedal.com/nosql-east-2009---summary-of-day-1" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">NoSQL&nbsp;Conference</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">，各路NoSQL数据库纷纷亮相，加上未亮相但是名声在外的，起码有超过10个开源的NoSQLDB，例如：&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Redis，Tokyo&nbsp;Cabinet，Cassandra，Voldemort，MongoDB，Dynomite，HBase，CouchDB，Hypertable，&nbsp;Riak，Tin，&nbsp;Flare，&nbsp;Lightcloud，&nbsp;KiokuDB，Scalaris，&nbsp;Kai，&nbsp;ThruDB，&nbsp;&nbsp;......&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">这些NoSQL数据库，有的是用C/C++编写的，有的是用Java编写的，还有的是用Erlang编写的，每个都有自己的独到之处，看都看不过来了，</span><a href="http://robbin.javaeye.com/" target="_blank" data_ue_src="http://robbin.javaeye.com/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">我(robbin)</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">也只能从中挑选一些比较有特色，看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类：&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; ">一、满足极高读写性能需求的Kye-Value数据库：Redis，Tokyo&nbsp;Cabinet，&nbsp;Flare&nbsp;<br /><br />高性能Key-Value数据库的主要特点就是具有极高的并发读写性能，Redis，Tokyo&nbsp;Cabinet，&nbsp;Flare，这3个Key-Value&nbsp;DB都是用C编写的，他们的性能都相当出色，但出了出色的性能，他们还有自己独特的功能：&nbsp;<br /><br />1、</span><a href="http://code.google.com/p/redis/" target="_blank" data_ue_src="http://code.google.com/p/redis/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">Redis</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Redis是一个很新的项目，刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库，很像memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作，Redis的性能非常出色，每秒可以处理超过10万次读写操作，是我知道的性能最快的Key-Value&nbsp;DB。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Redis的出色之处不仅仅是性能，Redis最大的魅力是支持保存List链表和Set集合的数据结构，而且还支持对List进行各种操作，例如从List两端push和pop数据，取List区间，排序等等，对Set支持各种集合的并集交集操作，此外单个value的最大限制是1GB，不像memcached只能保存1MB的数据，因此Redis可以用来实现很多有用的功能，比方说用他的List来做FIFO双向链表，实现一个轻量级的高性能消息队列服务，用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间，因此也可以被当作一个功能加强版的memcached来用。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Redis的主要缺点是数据库容量受到物理内存的限制，不能用作海量数据的高性能读写，并且它没有原生的可扩展机制，不具有scale（可扩展）能力，要依赖客户端来实现分布式读写，因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。目前使用Redis的网站有github，Engine&nbsp;Yard。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">2、</span><a href="http://1978th.net/" target="_blank" data_ue_src="http://1978th.net/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">Tokyo&nbsp;Cabinet和Tokoy&nbsp;Tyrant</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">TC和TT的开发者是日本人Mikio&nbsp;Hirabayashi，主要被用在日本最大的SNS网站mixi.jp上，TC发展的时间最早，现在已经是一个非常成熟的项目，也是Kye-Value数据库领域最大的热点，现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎，而TT提供了多线程高并发服务器，性能也非常出色，每秒可以处理4-5万次读写操作。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">TC除了支持Key-Value存储之外，还支持保存Hashtable数据类型，因此很像一个简单的数据库表，并且还支持基于column的条件查询，分页查询和排序功能，基本上相当于支持单表的基础查询功能了，所以可以简单的替代关系数据库的很多操作，这也是TC受到大家欢迎的主要原因之一，有一个Ruby的项目</span><a href="http://github.com/tsukasaoishi/miyazakiresistance" target="_blank" data_ue_src="http://github.com/tsukasaoishi/miyazakiresistance" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">miyazakiresistance</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">将TT的hashtable的操作封装成和ActiveRecord一样的操作，用起来非常爽。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">TC/TT在mixi的实际应用当中，存储了2000万条以上的数据，同时支撑了上万个并发连接，是一个久经考验的项目。TC在保证了极高的并发读写性能的同时，具有可靠的数据持久化机制，同时还支持类似关系数据库表结构的hashtable以及简单的条件，分页和排序操作，是一个很棒的NoSQL数据库。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">TC的主要缺点是在数据量达到上亿级别以后，并发写数据性能会大幅度下降，</span><a href="http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/" target="_blank" data_ue_src="http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">NoSQL:&nbsp;If&nbsp;Only&nbsp;It&nbsp;Was&nbsp;That&nbsp;Easy</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">提到，他们发现在TC里面插入1.6亿条2-20KB数据的时候，写入性能开始急剧下降。看来是当数据量上亿条的时候，TC性能开始大幅度下降，从TC作者自己提供的mixi数据来看，至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">这个是Tim&nbsp;Yang做的一个</span><a href="http://timyang.net/data/mcdb-tt-redis/" target="_blank" data_ue_src="http://timyang.net/data/mcdb-tt-redis/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">Memcached，Redis和Tokyo&nbsp;Tyrant的简单的性能评测，仅供参考</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">3、</span><a href="http://labs.gree.jp/Top/OpenSource/Flare-en.html" target="_blank" data_ue_src="http://labs.gree.jp/Top/OpenSource/Flare-en.html" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">Flare</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">TC是日本第一大SNS网站mixi开发的，而Flare是日本第二大SNS网站green.jp开发的，有意思吧。Flare简单的说就是给TC添加了scale功能。他替换掉了TT部分，自己另外给TC写了网络服务器，Flare的主要特点就是支持scale能力，他在网络服务端之前添加了一个node&nbsp;server，来管理后端的多个服务器节点，因此可以动态添加数据库服务节点，删除服务器节点，也支持failover。如果你的使用场景必须要让TC可以scale，那么可以考虑flare。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">flare唯一的缺点就是他只支持memcached协议，因此当你使用flare的时候，就不能使用TC的table数据结构了，只能使用TC的key-value数据结构存储。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; ">二、满足海量存储需求和访问的面向文档的数据库：MongoDB，CouchDB&nbsp;<br /><br />面向文档的非关系数据库主要解决的问题不是高性能的并发读写，而是保证海量数据存储的同时，具有良好的查询性能。MongoDB是用C++开发的，而CouchDB则是Erlang开发的：&nbsp;<br /><br />1、</span><a href="http://www.mongodb.org/display/DOCS/Home" target="_blank" data_ue_src="http://www.mongodb.org/display/DOCS/Home" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">MongoDB</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">MongoDB是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库当中功能最丰富，最像关系数据库的。他支持的数据结构非常松散，是类似json的bjson格式，因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大，其语法有点类似于面向对象的查询语言，几乎可以实现类似关系数据库单表查询的绝大部分功能，而且还支持对数据建立索引。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Mongo主要解决的是海量数据的访问效率问题，根据官方的文档，当数据量达到50GB以上的时候，Mongo的数据库访问速度是MySQL的10倍以上。Mongo的并发读写效率不是特别出色，根据官方提供的性能测试表明，大约每秒可以处理0.5万－1.5次读写请求。对于Mongo的并发读写性能，我（robbin）也打算有空的时候好好测试一下。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">因为Mongo主要是支持海量数据存储的，所以Mongo还自带了一个出色的分布式文件系统GridFS，可以支持海量的数据存储，但我也看到有些评论认为GridFS性能不佳，这一点还是有待亲自做点测试来验证了。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">最后由于Mongo可以支持复杂的数据结构，而且带有强大的数据查询功能，因此非常受到欢迎，很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用，比方说</span><a href="http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/" target="_blank" data_ue_src="http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">why&nbsp;we&nbsp;migrated&nbsp;from&nbsp;MySQL&nbsp;to&nbsp;MongoDB</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">就是一个真实的从MySQL迁移到MongoDB的案例，由于数据量实在太大，所以迁移到了Mongo上面，数据查询的速度得到了非常显著的提升。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">MongoDB也有一个ruby的项目</span><a href="http://github.com/jnunemaker/mongomapper" target="_blank" data_ue_src="http://github.com/jnunemaker/mongomapper" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">MongoMapper</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">，是模仿Merb的DataMapper编写的MongoDB的接口，使用起来非常简单，几乎和DataMapper一模一样，功能非常强大易用。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">2、CouchDB&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">CouchDB现在是一个非常有名气的项目，似乎不用多介绍了。但是我却对CouchDB没有什么兴趣，主要是因为CouchDB仅仅提供了基于HTTP&nbsp;REST的接口，因此CouchDB单纯从并发读写性能来说，是非常糟糕的，这让我立刻抛弃了对CouchDB的兴趣。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; ">三、满足高可扩展性和可用性的面向分布式计算的数据库：Cassandra，Voldemort&nbsp;<br /><br />面向scale能力的数据库其实主要解决的问题领域和上述两类数据库还不太一样，它首先必须是一个分布式的数据库系统，由分布在不同节点上面的数据库共同构成一个数据库服务系统，并且根据这种分布式架构来提供online的，具有弹性的可扩展能力，例如可以不停机的添加更多数据节点，删除数据节点等等。因此像Cassandra常常被看成是一个开源版本的Google&nbsp;BigTable的替代品。Cassandra和Voldemort都是用Java开发的：&nbsp;<br /><br />1、</span><a href="http://incubator.apache.org/cassandra/" target="_blank" data_ue_src="http://incubator.apache.org/cassandra/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">Cassandra</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Cassandra项目是Facebook在2008年开源出来的，随后Facebook自己使用Cassandra的另外一个不开源的分支，而开源出来的Cassandra主要被Amazon的Dynamite团队来维护，并且Cassandra被认为是Dynamite2.0版本。目前除了Facebook之外，twitter和digg.com都在使用Cassandra。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Cassandra的主要特点就是它不是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对Cassandra的一个写操作，会被复制到其他节点上去，对Cassandra的读操作，也会被路由到某个节点上面去读取。对于一个Cassandra群集来说，扩展性能是比较简单的事情，只管在群集里面添加节点就可以了。我看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Cassandra也支持比较丰富的数据结构和功能强大的查询语言，和MongoDB比较类似，查询功能比MongoDB稍弱一些，twitter的平台架构部门领导Evan&nbsp;Weaver写了一篇文章介绍Cassandra：</span><a href="http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/" target="_blank" data_ue_src="http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/</a><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">，有非常详细的介绍。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Cassandra以单个节点来衡量，其节点的并发读写性能不是特别好，有文章说评测下来Cassandra每秒大约不到1万次读写请求，我也看到一些对这个问题进行质疑的评论，但是评价Cassandra单个节点的性能是没有意义的，真实的分布式数据库访问系统必然是n多个节点构成的系统，其并发性能取决于整个系统的节点数量，路由效率，而不仅仅是单节点的并发负载能力。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">2、</span><a href="http://project-voldemort.com/" target="_blank" data_ue_src="http://project-voldemort.com/" style="font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-decoration: none; text-align: left; ">Voldemort</a>&nbsp;<br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">Voldemort是个和Cassandra类似的面向解决scale问题的分布式数据库系统，Cassandra来自于Facebook这个SNS网站，而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的NoSQL数据库，例如Cassandar，Voldemort，Tokyo&nbsp;Cabinet，Flare等等。Voldemort的资料不是很多，因此我没有特别仔细去钻研，Voldemort官方给出Voldemort的并发读写性能也很不错，每秒超过了1.5万次读写。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">从Facebook开发Cassandra，Linkedin开发Voldemort，我们也可以大致看出国外大型SNS网站对于分布式数据库，特别是对数据库的scale能力方面的需求是多么殷切。前面我（robbin）提到，web应用的架构当中，web层和app层相对来说都很容易横向扩展，唯有数据库是单点的，极难scale，现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向，这也是为什么现在Cassandra这么热门的主要原因。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">如今，NoSQL数据库是个令人很兴奋的领域，总是不断有新的技术新的产品冒出来，改变我们已经形成的固有的技术观念，我自己（robbin）稍微了解了一些，就感觉自己深深的沉迷进去了，可以说NoSQL数据库领域也是博大精深的，我（robbin）也只能浅尝辄止，我（robbin）写这篇文章既是自己一点点钻研心得，也是抛砖引玉，希望吸引对这个领域有经验的朋友来讨论和交流。&nbsp;</span><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><br style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; text-align: left; " /><span style="color: #444444; font-family: 'Microsoft Yahei', 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; line-height: normal; ">从我（robbin）个人的兴趣来说，分布式数据库系统不是我能实际用到的技术，因此不打算花时间深入，而其他两个数据领域（高性能NoSQLDB和海量存储NoSQLDB）都是我很感兴趣的，特别是Redis，TT/TC和MongoDB这3个NoSQL数据库，因此我接下来将写三篇文章分别详细介绍这3个数据库。</span></div><img src ="http://www.blogjava.net/czihong/aggbug/370243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-02-18 15:48 <a href="http://www.blogjava.net/czihong/articles/370243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>