<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java &#38; Game &#187; 数据库</title>
	<atom:link href="http://www.javagg.com/archives/category/%e6%95%b0%e6%8d%ae%e5%ba%93/feed" rel="self" type="application/rss+xml" />
	<link>http://www.javagg.com</link>
	<description>java&#38;j2me</description>
	<lastBuildDate>Sat, 02 Jul 2011 08:59:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>开源面向对象数据库 db4o 之旅: 深入db4o</title>
		<link>http://www.javagg.com/archives/774</link>
		<comments>http://www.javagg.com/archives/774#comments</comments>
		<pubDate>Fri, 14 May 2010 02:22:50 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[db4o]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=774</guid>
		<description><![CDATA[前言
在开源面向对象数据库 db4o 之旅 系列文章的第 1 部分：初识 db4o 中，作者介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较； 在第 2 部分：db4o 查询方式中, 作者介绍了 db4o 的三种不同的查询方式：QBE、SODA 以及 Native Queries，并分别通过这三种不同的途径实现了两个关联对象的查询。
前面我们已经介绍了如何在 db4o 中查询以及添加对象，在本文中我们将会向您介绍在 db4o 中如何对对象进行更新以及删除操作。
更新数据
场景一
我们来设想这样的场景：一位名叫“张三”的人买了车，并上好了牌照（如本系列第二部分之代码），而他基本信息的地址并不详细，只写了“成都市”，在一次主管部门检查此人信息的时候，发现了这个问题，并立即着手修改。
在 db4o 中，我们这样来实现对这个用户信息的修改（清单1）：
清单1. 修改地址



&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; 


package com;


&#160;


import bo.People;


&#160;


import com.db4o.Db4o;


import com.db4o.ObjectContainer;


import com.db4o.ObjectSet;


import com.db4o.query.Predicate;


&#160;


public class DB4OTest&#123;


&#160;


&#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a name="N1007A">前言</a></p>
<p>在开源面向对象数据库 <a href="http://www.ibm.com/developerworks/cn/java/j-db4o/"><em>db4o 之旅</em></a> 系列文章的第 1 部分：<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/">初识 db4o</a> 中，作者介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较； 在第 2 部分：<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/">db4o 查询方式</a>中, 作者介绍了 db4o 的三种不同的查询方式：QBE、SODA 以及 Native Queries，并分别通过这三种不同的途径实现了两个关联对象的查询。<span id="more-774"></span></p>
<p>前面我们已经介绍了如何在 db4o 中查询以及添加对象，在本文中我们将会向您介绍在 db4o 中如何对对象进行更新以及删除操作。</p>
<p><a name="N10094">更新数据</a></p>
<p><strong>场景一</strong></p>
<p>我们来设想这样的场景：一位名叫“张三”的人买了车，并上好了牌照（如本系列第二部分之代码），而他基本信息的地址并不详细，只写了“成都市”，在一次主管部门检查此人信息的时候，发现了这个问题，并立即着手修改。</p>
<p>在 db4o 中，我们这样来实现对这个用户信息的修改（<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code1">清单1</a>）：<br />
<a name="code1"><strong>清单1. 修改地址</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.People;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectSet;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectSet&lt;People&gt; result = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;People&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>People people<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> people.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;张三&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; People people = result.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//修改地址</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; people.<span class="me1">setAddress</span><span class="br0">&#40;</span><span class="st0">&quot;成都市金牛区xxx号&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">set</span><span class="br0">&#40;</span>people<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>修改数据是如此的简单，通过 NQ 查询出 People 对象，接着修改其地址，最后保存即可。现在我们来看看修改是否成功, 打开 ObjectManager ，如<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig1">图 1</a> 所示，我们可以看到数据库里的用户数据已经更新了。<br />
<a name="fig1"><strong>图1. 修改地址</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/figures/1.jpg" border="0" alt="图1. 修改地址" /></p>
<p>与本系列文章第二部分不同的是，我们利用 ObjectSet&lt;People&gt; result 来获取返回结果，而不是 List&lt;People&gt; list。查阅 ObjectSet 的 API 我们发现 ObjectSet 实际上继承了 java.util.List 和 java.util.Iterator。为什么要继承两个接口？这是由于 db4o 为了方便开发者而有意这样设计的，db4o 的设计目标就是轻量级，这样的继承方式为 ObjectSet 提供了多种特性，而无需开发者在多个集合接口之间转换。</p>
<p><strong>场景二</strong></p>
<p>让我们考虑下面这个场景:<br />
由于工作原因，“张三”要离开省会去其他城市发展，他的汽车也要在那里使用，为了方便，他还是决定重新更换为本地牌照。</p>
<p>这次我们几乎和场景一采用同样的代码，但结果却不同（<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code2">清单2</a>）：<br />
<a name="code2"><strong>清单2. 修改地址和车牌（不成功）</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.People;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectSet;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectSet&lt;People&gt; result = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;People&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>People people<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> people.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;张三&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; People people = result.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//修改地址</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; people.<span class="me1">setAddress</span><span class="br0">&#40;</span><span class="st0">&quot;绵阳市xx区xxx号&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//修改车牌号</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; people.<span class="me1">getAutoInfoList</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>.<span class="me1">setLicensePlate</span><span class="br0">&#40;</span><span class="st0">&quot;川B00000&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">set</span><span class="br0">&#40;</span>people<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>想必应该保存成功了吧，只是多加入了设置车牌的代码。打开 ObjectManager，如<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig2">图 2</a> 所示。很奇怪，地址保存成功了，而车牌却根本没变化。<br />
<a name="fig2"><strong>图2. 修改地址和车牌（不成功）</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/figures/2.jpg" border="0" alt="图2. 修改地址和车牌（不成功）" /></p>
<p>其实这也是 db4o 的有意安排。设想一个复杂对象有很多成员，并且这些成员又有自己的成员。当更新该对象，db4o 将不得不更新其所有的关联对象、关联对象的关联对象，等等。这将引起严重的性能惩罚，而且在大部分的情况下是没有必要这样的。</p>
<p>db4o 引入了“更新深度(update depth)”这一概念来控制被更新的对象成员树深度。默认的更新深度是 1，这就意味着只有基本类型和 String 类型的成员变量可以被更新，而修改对象成员将得不到任何反映，例如本例中修改 People 对象的 _autoInfoList 成员。</p>
<p>为了能更新成员对象，ob4o 提供了 cascadeOnUpdate() 方法，该方法必须在每次开启数据库之前设置<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code3">清单3</a>：<br />
<a name="code3"><strong>清单3. 修改地址和车牌（成功）</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.People;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectSet;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//级联设置</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db4o.<span class="me1">configure</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">objectClass</span><span class="br0">&#40;</span><span class="st0">&quot;bo.People&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">cascadeOnUpdate</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectSet&lt;People&gt; result = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;People&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>People people<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> people.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;张三&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; People people = result.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//修改地址</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; people.<span class="me1">setAddress</span><span class="br0">&#40;</span><span class="st0">&quot;绵阳市xx区xxx号&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//修改车牌号</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; people.<span class="me1">getAutoInfoList</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span>.<span class="me1">setLicensePlate</span><span class="br0">&#40;</span><span class="st0">&quot;川B00000&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">set</span><span class="br0">&#40;</span>people<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>这下终于如愿以偿，如<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig3">图 3</a> 所示。其实 db4o 为开发者想得很周到，关键是如何用好这些特性。<br />
<a name="fig3"><strong>图3. 修改地址和车牌（成功）</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/figures/3.jpg" border="0" alt="图3. 修改地址和车牌（成功）" /><br />
<a name="N1012A">删除数据</a></p>
<p><strong>场景三</strong></p>
<p>“张三”换了工作后，事业发展很快，准备把车卖了换新的，于是他去交管部门办理移交手续，删除关联的车辆信息<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code4">清单4</a>：<br />
<a name="code4"><strong>清单4. 删除车辆</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.AutoInfo;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectSet;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectSet&lt;AutoInfo&gt; result = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;AutoInfo&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>AutoInfo ai<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//匹配姓名和车牌号</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> ai.<span class="me1">getLicensePlate</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;川B00000&quot;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&amp;amp;&amp;amp; ai.<span class="me1">getOwnerNo</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;张三&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AutoInfo ai = result.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//删除车辆信息</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">delete</span><span class="br0">&#40;</span>ai<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>如<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig4">图 4</a> 所示，所关联的车辆信息已被删除了。<br />
<a name="fig4"><strong>图4. 删除车辆信息</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/figures/4.jpg" border="0" alt="图4. 删除车辆信息" /></p>
<p><strong>场景四</strong></p>
<p>在场景三的基础上修改一下，设想“张三”由于工作不顺，导致最后维护汽车的开支都困难，他不得不退出有车一族的行列<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code5">清单5</a>：<br />
<a name="code5"><strong>清单5. 删除所有信息</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.People;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectSet;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//级联设置</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db4o.<span class="me1">configure</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">objectClass</span><span class="br0">&#40;</span><span class="st0">&quot;bo.People&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; .<span class="me1">cascadeOnDelete</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectSet&lt;People&gt; result = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;People&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>People people<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//匹配姓名</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> people.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;张三&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; People people = result.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//删除车主以及关联的车辆信息</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">delete</span><span class="br0">&#40;</span>people<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>用过 Hibernate 的开发者都知道，它的级联删除让人留下了深刻印象，第一次使用的时候都会为之振奋。db4o 也为开发者提供了级联删除，和场景二的级联更新一样， cascadeOnDelete() 是专门为删除准备的，基本概念和 cascadeOnUpdate() 一致。打开 ObjectManager 我们会发现数据库已经清空了，张三的购车经历到此结束。</p>
<p><a name="N10177">结论</a></p>
<p>通过本系列文章，db4o 的优势已经体现得淋漓尽致，它的添加、更新、删除是如此的简单，正如 db4o 的口号那样——“仅需一行代码就能存储复杂结构对象，极大的降低了开发时间和成本，提供高效的性能，无需 DBA 干预”。</p>
<p>如本文有不详尽之处，大家可以参考官方的《用户指南》或访问 <a href="http://developer.db4o.com/forums/10/ShowForum.aspx">db4o 官方中文论坛</a>，db4o 中文社区正在火热成长！</p>
<p><a name="resources">参考资料 </a></p>
<p><strong>学习</strong></p>
<ul>
<li>db4o <a href="http://www.db4o.com/">官方网站</a> 。</li>
<li><a href="http://www.ibm.com/developerworks/cn/java/j-db4o/"><em>面向对象数据库 db4o 之旅系列</em></a>：查看此系列文章完整列表。</li>
<li><a href="http://www.odmg.org/">ODMG 官方网站</a>：了解 ODMG 技术。</li>
<li><a href="http://www.ibm.com/developerworks/cn/java/">developerWorks Java 技术专区</a>：数百篇关于 Java 编程各个方面的文章。</li>
</ul>
<p><strong>获得产品和技术</strong></p>
<ul>
<li><a href="http://www.db4o.com/china?src=cn">下载 db4o 免费版</a>。</li>
</ul>
<p><strong>讨论</strong></p>
<ul>
<li>db4o <a href="http://developer.db4o.com/forums/">开发者论坛</a>：讨论 db4o 技术。</li>
<li><a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=181&amp;cat=10">developerWorks Java 论坛</a>：学习 Java 技术。</li>
</ul>
<p><a name="author">作者简介</a></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr align="left" valign="top">
<td> </td>
<td width="100%">Rosen Jiang 来自成都，是 db4o 和 OO 的忠实 fans，是 2005 年 db4o 的 dvp 获得者之一。他正在 J2me 应用中使用 db4o，你可以通过 <a href="mailto:rosener_722@hotmail.com?cc=">rosener_722@hotmail.com</a> 和他联系。</td>
</tr>
</tbody>
</table>
<p> </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr align="left" valign="top">
<td> </td>
<td width="100%">Chris 来自香港，热爱开源和 db4o。他创办了中国最火热的 Java 和开源社区 Matrix（http://www.Matrix.org.cn）， 你可以通过 <a href="mailto:chris@Matrix.org.cn?cc=">chris@Matrix.org.cn</a> 和他联系。</td>
</tr>
</tbody>
</table>
<p> </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr align="left" valign="top">
<td> </td>
<td width="100%">张黄瞩，热爱开源软件，熟悉 Java/C/C++ 编程语言，对数据库技术网络技术均感兴趣。你可以通过 <a href="mailto:zhanghuangzhu@gmail.com?cc=">zhanghuangzhu@gmail.com</a> 联系他。</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/774/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开源面向对象数据库 db4o 之旅: db4o 查询方式</title>
		<link>http://www.javagg.com/archives/770</link>
		<comments>http://www.javagg.com/archives/770#comments</comments>
		<pubDate>Fri, 14 May 2010 02:12:06 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[db4o]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=770</guid>
		<description><![CDATA[ 
在 db4o 之旅 系列文章的第一部分：初识 db4o 中，作者介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较。在这篇文章中，作者将会介绍 db4o 的安装、启动以及三种不同的查询方式：QBE（Query by Example）、SODA（Simple Object Database Access） 以及 NQ（Native Queries），并分别通过这三种不同的途径实现了两个关联对象的查询。本文还示范了开发中最经常用到的几个典型功能的 db4o 实现。
db4o 所有最新的版本都可以直接在官方网站上下载，进入 db4o 的下载页面，我们可以看到最新的 for Java 稳定版本是 5.5，包括 JAR、源代码、入门文档、API 等内容的完整的打包文件只有 6 MB，db4o 还有一个对象数据库管理工具 ObjectManager，目前版本是 1.8（请在参考资源中下载）。
接着在 Eclipse 中新建 Java 项目，把 db4o 对象数据库引擎包 db4o-5.5-java5.jar 导入进项目。由于 db4o 支持多种版本的 JDK，除了 for JDK 5.0 的 db4o-5.5-java5.jar 外，还有 for JDK [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>在 <a href="http://www.ibm.com/developerworks/cn/java/j-db4o/"><em>db4o 之旅</em></a> 系列文章的第一部分：<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/">初识 db4o</a> 中，作者介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较。在这篇文章中，作者将会介绍 db4o 的安装、启动以及三种不同的查询方式：QBE（Query by Example）、SODA（Simple Object Database Access） 以及 NQ（Native Queries），并分别通过这三种不同的途径实现了两个关联对象的查询。本文还示范了开发中最经常用到的几个典型功能的 db4o 实现。<span id="more-770"></span></p>
<p>db4o 所有最新的版本都可以直接在官方网站上下载，进入 db4o 的<a href="http://www.db4o.com/community" target="_blank">下载页面</a>，我们可以看到最新的 for Java 稳定版本是 5.5，包括 JAR、源代码、入门文档、API 等内容的完整的打包文件只有 6 MB，db4o 还有一个对象数据库管理工具 ObjectManager，目前版本是 1.8（请在参考资源中<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#resources">下载</a>）。</p>
<p>接着在 Eclipse 中新建 Java 项目，把 db4o 对象数据库引擎包 db4o-5.5-java5.jar 导入进项目。由于 db4o 支持多种版本的 JDK，除了 for JDK 5.0 的 db4o-5.5-java5.jar 外，还有 for JDK 1.1、1.2-1.4 的 JAR 包，以适应多种环境。与 Hibernate、iBATIS SQL Maps 相比，db4o 更加自然，无需过多地引用第三方支持库。</p>
<p>db4o 怎样进行对象持久化呢？通过浏览目录可以发现，与传统的 RDBMS 一样，db4o 也有自己的数据库文件, 在 db4o 中数据库文件的后缀名是“*.yap”。让我们先来了解一下 db4o 对象数据库引擎的主要包结构：</p>
<ul>
<li><strong>com.db4o</strong><br />
com.db4o 包含了使用 db4o 时最经常用到的功能。两个最重要的接口是 com.db4o.Db4o 和 com.db4o.ObjectContainer。com.db4o.Db4o 工厂是运行 db4o 的起点，这个类中的静态方法可以开启数据库文件、启动服务器或连接一个已经存在的服务器，还可以在开启数据库之前进行 db4o 环境配置。com.db4o.ObjectContainer 接口很重要，开发过程中 99% 的时间都会用到它，ObjectContainer 可在单用户模式下作为数据库实例，也可作为 db4o 服务器的客户端。每个 ObjectContainer 实例都有自己的事务。所有的操作都有事务保证。当打开 ObjectContainer，就已经进入事务了，commit() 或 rollback() 时，下一个事务立即启动。每个 ObjectContainer 实例维护它自己所管理的已存储和已实例化对象，在需要 ObjectContainer 的时候，它会一直保持开启状态，一旦关闭，内存中数据库所引用的对象将被丢弃。</li>
<li><strong>com.db4o.ext</strong><br />
你也许想知道为什么在 ObjectContainer 中只能看见很少的方法，原因如下：db4o 接口提供了两个途径，分别在 com.db4o 和 com.db4o.ext 包中。这样做首先是为了让开发者能快速上手；其次为了让其他产品能更容易的复制基本的 db4o 接口；开发者从这一点上也能看出 db4o 是相当轻量级的。每个 com.db4o.ObjectContainer 对象也是 com.db4o.ext.ExtObjectContainer 对象。可以转换成 ExtObjectContainer 获得更多高级特性。</li>
<li><strong>com.db4o.config</strong><br />
com.db4o.config 包含了所有配置 db4o 所需的类。</li>
<li><strong>com.db4o.query</strong><br />
com.db4o.query 包包含了构造“原生查询, NQ（Native Queries）”所需的 Predicate 类。NQ 是 db4o 最主要的查询接口。</li>
</ul>
<p>db4o 提供两种运行模式，分别是本地模式和服务器模式。本地模式是指直接在程序里打开 db4o 数据库文件进行操作：</p>
<pre>ObjectContainer db = Db4o.openFile("auto.yap");</pre>
<p>而服务器模式则是客户端通过 IP 地址、端口以及授权口令来访问服务器：</p>
<p>服务器端：</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">ObjectServer server=Db4o.<span class="me1">openServer</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span>,<span class="nu0">1212</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">server.<span class="me1">grantAccess</span><span class="br0">&#40;</span><span class="st0">&quot;admin&quot;</span>,<span class="st0">&quot;123456&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>客户端：</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">ObjectContainer db=Db4o.<span class="me1">openClient</span><span class="br0">&#40;</span><span class="st0">&quot;192.168.0.10&quot;</span>,<span class="nu0">1212</span>,<span class="st0">&quot;admin&quot;</span>,<span class="st0">&quot;123456&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p> </p>
<p>两种方式都可以得到 ObjectContainer 实例，就目前 Java EE 应用环境来看，服务器模式更有现实意义；而本地模式更适合于嵌入式应用。为了简化演示，本文在下面的例子都将采用本地模式。</p>
<p>在下面的例子里，我们都会用到下面两个对象： People 和 AutoInfo 对象。</p>
<p>People 对象<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code1">清单1</a>：<br />
<strong>清单1. People 对象</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> bo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> People <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> _id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> _name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> _address;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> java.<span class="me1">util</span>.<span class="me1">List</span>&lt;AutoInfo&gt; _autoInfoList;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> getId<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> _id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setId<span class="br0">&#40;</span>java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> _id<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._id = _id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> _name;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setName<span class="br0">&#40;</span>java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> _name<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._name = _name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getAddress<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> _address;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setAddress<span class="br0">&#40;</span>java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> _address<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._address = _address;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> java.<span class="me1">util</span>.<span class="me1">List</span>&lt;AutoInfo&gt; getAutoInfoList<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">this</span>._autoInfoList;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> addAutoInfo<span class="br0">&#40;</span>AutoInfo _autoInfoList<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">null</span> == <span class="kw2">this</span>._autoInfoList<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._autoInfoList = <span class="kw2">new</span> java.<span class="me1">util</span>.<span class="me1">ArrayList</span>&lt;AutoInfo&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._autoInfoList.<span class="me1">add</span><span class="br0">&#40;</span>_autoInfoList<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>AutoInfo 对象<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code2">清单2</a>：<br />
<strong>清单2. AutoInfo 对象</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> bo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> AutoInfo<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> _id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> _licensePlate;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> bo.<span class="me1">People</span> _ownerNo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> getId <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> _id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setId <span class="br0">&#40;</span>java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> _id<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._id = _id;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getLicensePlate <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> _licensePlate;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setLicensePlate <span class="br0">&#40;</span>java.<span class="me1">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> _licensePlate<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._licensePlate = _licensePlate;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> bo.<span class="me1">People</span> getOwnerNo <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">this</span>._ownerNo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> setOwnerNo <span class="br0">&#40;</span>bo.<span class="me1">People</span> _ownerNo<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">this</span>._ownerNo = _ownerNo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>利用 set 方法把新对象存入 ObjectContainer，而对 ObjectContainer 中已有对象进行 set 操作则是更新该对象。db4o 保存数据库很简单，下面就是一个段完整的保存对象的代码：</p>
<p>AutoInfo 对象<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code3">清单3</a>：<br />
<strong>清单3</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.AutoInfo;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import bo.People;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//构造 People 对象</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; People peo = <span class="kw2">new</span> People<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; peo.<span class="me1">setId</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; peo.<span class="me1">setAddress</span><span class="br0">&#40;</span><span class="st0">&quot;成都市&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; peo.<span class="me1">setName</span><span class="br0">&#40;</span><span class="st0">&quot;张三&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//构造 AutoInfo 对象</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AutoInfo ai = <span class="kw2">new</span> AutoInfo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ai.<span class="me1">setId</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ai.<span class="me1">setLicensePlate</span><span class="br0">&#40;</span><span class="st0">&quot;川A00000&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//设置 People 和 AutoInfo 的关系</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ai.<span class="me1">setOwnerNo</span><span class="br0">&#40;</span>peo<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; peo.<span class="me1">addAutoInfo</span><span class="br0">&#40;</span>ai<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//保存对象</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">set</span><span class="br0">&#40;</span>peo<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>当我们运行上述代码，db4o 会自动创建“auto.yap”文件。让我们来看看到底保存成功没有，打开 ObjectManager 工具，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#fig1">如图 1 </a>所示。<br />
<strong>图1. 对象数据库管理工具</strong><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/figures/1.jpg" alt="图1. 对象数据库管理工具" /></p>
<p>“File”－&gt;“Open File”－&gt;选择刚才我们保存的“auto.yap”文件（“auto.yap”文件可在项目的根目录下找到），最新的 ObjectManager 1.8 版本为我们提供了“Read Only”方式读取数据库文件，避免 ObjectManager 占用数据库文件所导致的程序异常。</p>
<p>打开之后，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#fig2">如图 2 </a>所示，刚才存贮的 People 对象已经在数据库中了，并且还可以很直观的看到 AutoInfo 对象也放入了 ArrayList 中。这种可视化的对象关系有利于我们对数据的理解，是传统 RDBMS 无法比拟的。有些开发者会说 ObjectManager 工具略显简单，这点我想随着 db4o 的不断发展会加入更多的特性。在这个工具中，我们意外的发现了 Java 集合对象的踪影，db4o 把与 ArrayList 有直接关系的所有接口和父类都保存了，这样显得更直观。</p>
<p>在此，我保留了 _id 属性，这是因为通常在 Java EE 环境中，DAO 第一次不是把整个对象都返回到表现层，而是只返回了“标题”、“发布时间”这些信息（并隐式的返回id），接着 DAO 与数据库断开；要查看详情（比如文章内容）就需要进行 findById 操作，这时 DAO 要再次与数据库交互，只有唯一标识符才能正确地找到对象。这种<em>懒加载</em>方式也是很多书籍所推荐的。</p>
<p>回到本文的范例程序中，这个 _id 属性可由人工编码实现的“序列”进行赋值，当然 db4o 也提供了内部标识符 Internal IDs，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#fig2">如图 2 </a>中的 id=1669；以及 UUIDs。<br />
<strong>图2. 对象结构</strong><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/figures/2.jpg" alt="图2. 对象结构" /></p>
<p>img src=&#8221;http://www.ibm.com/i/v14/rules/blue_rule.gif&#8221; alt=&#8221;" width=&#8221;100%&#8221; height=&#8221;1&#8243; /&gt;<br />
<img src="http://www.ibm.com/i/c.gif" alt="" width="100%" height="4" /><br />
查询数据库</p>
<p>和 RDBMS 一样，db4o 也有自己的查询语言，分别是 QBE（Query by Example）、NQ（Native Queries）、SODA（Simple Object Database Access），db4o 更推荐使用 NQ 进行查询。NQ 方式提供了非常强大的查询功能，支持原生语言，也就意味着你可以使用 Java 来判断该对象是否符合条件，这是其他数据库查询语言无法比拟的。在某些情况下， db4o 核心会将 NQ 翻译成 SODA 以获得更高的性能。下面详细介绍一下这三种查询语言。</p>
<p>QBE（Query by Example）</p>
<p>QBE 规范可在<a href="http://www.cs.wisc.edu/~dbbook/openAccess/thirdEdition/qbe.pdf">这里下载</a>。QBE 最初由 IBM 提出，同时业界也有许多和 QBE 兼容的接口，包括著名的 Paradox。有些系统，比如微软的 Access，它的基于表单的查询也是受到了部分 QBE 思想的启发。在 db4o 中，用户可借用 QBE 快速上手，可以很容易适应 db4o 存取数据的方式。</p>
<p>当利用 QBE 为 db4o 提供模板（example）对象时，db4o 将返回所有和非默认值字段匹配的全部对象。内部是通过反射所有的字段和构造查询表达式（所有非默认值字段结合”AND”表达式）来实现。</p>
<p>例如，利用 QBE 查找到车牌号为“川A00000”的车主姓名，这是一个级联查询。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code4">清单4</a>：<br />
<strong>清单4</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.List;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import bo.AutoInfo;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//构造模板对象</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AutoInfo ai = <span class="kw2">new</span> AutoInfo<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ai.<span class="me1">setLicensePlate</span><span class="br0">&#40;</span><span class="st0">&quot;川A00000&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//查询对象</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;AutoInfo&gt; list = db.<span class="me1">get</span><span class="br0">&#40;</span>ai<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> x = <span class="nu0">0</span>; x &lt; list.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; x++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;车主姓名：&quot;</span>+list.<span class="me1">get</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span>.<span class="me1">getOwnerNo</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>但是 QBE 也有明显的限制：db4o 必须反射模板（example）对象的所有成员；无法执行更进一步的查询表达式（例如 AND、OR、NOT 等等）；不能约束 0（整型）、””（空字符串）或者 null（对象），因为这些都被认为是不受约束的。要绕过这些限制，db4o 提供了 NQ（Native Queries）。</p>
<p><a name="N10185">SODA（Simple Object Database Access）</a></p>
<p>SODA ，简单对象数据库访问，请查看<a href="http://sodaquery.sourceforge.net/">官方站点</a>，其中一位主要维护者是 Carl Rosenberger，Carl 正是 db4o 首席架构师。</p>
<p>SODA 就是一种与数据库通讯的对象 API。最终的目标是实现类型安全、对象复用、最小的字符串使用、与编程语言无关等特性。SODA 是 db4o 最底层的查询 API，目前 SODA 中使用字符串来定义字段，这样将不能实现类型安全也无法在编译时检查代码，而且写起来较麻烦，当然要达到设计目标这个阶段是必须的。大部分情况下 NQ（Native Queries）是很好的查询接口，不过遇到动态生成查询的时候 SODA 就大有作为了。</p>
<p>通过 SODA 查找到车牌号为“川A00000”的车主姓名。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code5">清单5</a>：</p>
<tr>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.List;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import bo.AutoInfo;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Query;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//构造查询对象</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Query query=db.<span class="me1">query</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//设置被约束实例</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">constrain</span><span class="br0">&#40;</span>AutoInfo.<span class="kw2">class</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//设置被约束实例的字段和约束条件</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; query.<span class="me1">descend</span><span class="br0">&#40;</span><span class="st0">&quot;_licensePlate&quot;</span><span class="br0">&#41;</span>.<span class="me1">constrain</span><span class="br0">&#40;</span><span class="st0">&quot;川A00000&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//查询对象</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;AutoInfo&gt; list = query.<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> x = <span class="nu0">0</span>; x &lt; list.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; x++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;车主姓名：&quot;</span>+list.<span class="me1">get</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span>.<span class="me1">getOwnerNo</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>通过 API，发现 Query 实例增加了 sortBy 按字段排序方法和 orderAscending正序、orderDescending 倒序排列方法，SODA 比 QBE 更进了一步。<br />
<a name="N101AA">NQ（Native Queries）</a></p>
<p>精彩总是在最后出场，NQ 才是 db4o 查询方式中最精彩的地方！有没有想过用你熟悉的的编程语言进行数据库查询呢？要是这样，你的查询代码将是 100% 的类型安全、100% 的编译时检查以及 100% 的可重构，很奇妙吧？NQ 可以做到这些。</p>
<p>有两篇论文专门讲解了 NQ 的基本概念和设计思路，分别是 <a href="http://www.db4o.com/china/Native%20Queries%20Whitepaper(Chinese).pdf">《Cook/Rosenberger，持久对象原生数据库查询语言》</a> 和 《Cook/Rai，Safe Query Objects: Statically Typed Objects as Remotely Executable Queries》。作为结果集的一部分，NQ 表达式必须返回 true 值来标记特定实例。如果可能的话 db4o 将尝试优化 NQ 表达式，并依赖索引来运行表达式。</p>
<p>通过 NQ 查找到车牌号为“川A00000”的车主姓名。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code6">清单6</a>：<br />
<a name="code6"><strong>清单6</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.List;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import bo.AutoInfo;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">List</span></a> &lt;AutoInfo&gt; list = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;AutoInfo&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>AutoInfo ai<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//这样才是类型安全的</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> ai.<span class="me1">getLicensePlate</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;川A00000&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> x = <span class="nu0">0</span>; x &lt; list.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; x++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>list.<span class="me1">get</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span>.<span class="me1">getOwnerNo</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>必须指出 NQ 的一个的问题是：在内部，db4o 设法把 NQ 转换成 SODA。但并不是所有的查询表达式都可以成功转换。有些查询表达式的流向图（flowgraph）非常难于分析。这种情况下，db4o 将不得不实例化一些持久对象来真实地运行 NQ 表达式。</p>
<p>正在开发中的 NQ 查询优化器就可以化解这个障碍，它将分析 NQ 表达式的每个部分，以确保最少量的实例化对象，以此提高性能。当然，优化器的不是灵丹妙药，关键还需要自己多优化代码。</p>
<p>开发 Java EE 项目经常会用到分页，怎样用 NQ 实现呢？向数据库写入六条记录。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#code7">清单7</a>：<br />
<a name="code7"><strong>清单7</strong></a></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.List;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co2">import bo.AutoInfo;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.Db4o;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.ObjectContainer;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import com.db4o.query.Predicate;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> DB4OTest<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//打开数据库</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectContainer db = Db4o.<span class="me1">openFile</span><span class="br0">&#40;</span><span class="st0">&quot;auto.yap&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List&lt;AutoInfo&gt; list = db.<span class="me1">query</span><span class="br0">&#40;</span><span class="kw2">new</span> Predicate&lt;AutoInfo&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">boolean</span> match<span class="br0">&#40;</span>AutoInfo ai<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//记录总数</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a> count = list.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//每页两条，分三页</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> x = <span class="nu0">0</span>; x &lt; <span class="nu0">3</span>; x++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;第&quot;</span>+x+<span class="st0">&quot;页：&quot;</span>+list.<span class="me1">get</span><span class="br0">&#40;</span>x*<span class="nu0">2</span><span class="br0">&#41;</span>.<span class="me1">getLicensePlate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;第&quot;</span>+x+<span class="st0">&quot;页：&quot;</span>+list.<span class="me1">get</span><span class="br0">&#40;</span>x*<span class="nu0">2</span><span class="nu0">+1</span><span class="br0">&#41;</span>.<span class="me1">getLicensePlate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw2">finally</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//关闭连接</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> </p>
<p>我们发现，在进行 NQ 查询时并没有加入任何条件（无条件返回 true），是不是相当于遍历了整个数据库？db4o 的设计者早就想到了这个问题，当 db.query() 执行完毕返回 list 实例的时候，db4o 只是与数据库同步取出内部 IDs 而已，并没有把所有的 AutoInfo 对象全部取出，只有在 list.get(x*2).getLicensePlate() 之后才会去根据 IDs 取出记录。所以不必担心性能问题。<br />
  </p>
<p> <a name="N101E6">结论</a></p>
<p>db4o 为开发者提供了多种查询方式，这些方式都很灵活。要引起大家注意的是：灵活在带来便利的同时也对开发者自身素质提出了更高的要求，（比如排序，既可以用 SODA 也可以用 Java 集合对象实现）在开发过程中一定要形成某种统一的开发模式，这样 db4o 才能最高效能地为我所用。</p>
<p><a name="resources">参考资料 </a></p>
<p><strong>学习</strong></p>
<ul>
<li>db4o <a href="http://www.db4o.com/">官方网站</a> 。</li>
<li><a href="http://www.ibm.com/developerworks/cn/java/j-db4o/"><em>面向对象数据库 db4o 之旅系列</em></a>：查看此系列文章完整列表。</li>
<li><a href="http://www.odmg.org/">ODMG 官方网站</a>：了解 ODMG 技术。</li>
<li><a href="http://www.ibm.com/developerworks/cn/java/">developerWorks Java 技术专区</a>：数百篇关于 Java 编程各个方面的文章。</li>
</ul>
<p><strong>获得产品和技术</strong></p>
<ul>
<li><a href="http://www.db4o.com/china?src=cn">下载 db4o 免费版</a>。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/770/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql使用普通用户备份出现的错误</title>
		<link>http://www.javagg.com/archives/726</link>
		<comments>http://www.javagg.com/archives/726#comments</comments>
		<pubDate>Thu, 08 Apr 2010 08:03:00 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[备份]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=726</guid>
		<description><![CDATA[mysql使用普通用户备份出现：
[root@xok.la]# mysqldump -u dbuser -ppass db &#62; db.sql
mysqldump: Got error: 1044: Access denied for user &#8216;dbuser&#8217;@'localhost&#8217; to database &#8216;db&#8217; when using LOCK TABLES
解决一：
加上-skip-lock-tables选项即可。即：
[root@xok.la]# mysqldump -u dbuser -ppass db &#8211;skip-lock-tables &#62; db.sql
解决2：
使用root账户备份。

]]></description>
			<content:encoded><![CDATA[<p>mysql使用普通用户备份出现：</p>
<p>[root@xok.la]# mysqldump -u dbuser -ppass db &gt; db.sql<br />
mysqldump: Got error: 1044: Access denied for user <a href="mailto:'dbuser'@'localhost'">&#8216;dbuser&#8217;@'localhost&#8217;</a> to database &#8216;db&#8217; when using LOCK TABLES<br />
解决一：</p>
<p>加上-skip-lock-tables选项即可。即：<span id="more-726"></span></p>
<p>[root@xok.la]# mysqldump -u dbuser -ppass db &#8211;skip-lock-tables &gt; db.sql<br />
解决2：</p>
<p>使用root账户备份。</p>
<p><a href="http://xok.la/2009/04/mysqldump_got_error_1044_access_denied_when_using_lock_tables.html"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/726/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql中text,longtext,mediumtext字段类型的意思,以及区别</title>
		<link>http://www.javagg.com/archives/721</link>
		<comments>http://www.javagg.com/archives/721#comments</comments>
		<pubDate>Thu, 08 Apr 2010 04:04:51 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=721</guid>
		<description><![CDATA[MySQL支持大量的列类型，它可以被分为3类：数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述，并且总结每个列类型的存储需求，然后提供每个类中的类型性质的更详细的描述。概述有意简化，更详细的说明应该考虑到有关特定列类型的附加信息，例如你能为其指定值的允许格式。 
由MySQL支持的列类型列在下面。下列代码字母用于描述中： 
M
指出最大的显示尺寸。最大的合法的显示尺寸是 255 。
D
适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30，但是应该不大于M-2。
方括号(“[”和“]”)指出可选的类型修饰符的部分。 
注意，如果你指定一个了为ZEROFILL，MySQL将为该列自动地增加UNSIGNED属性。 
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
一个很小的整数。有符号的范围是-128到127，无符号的范围是0到255。 
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
一个小整数。有符号的范围是-32768到32767，无符号的范围是0到65535。 
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
一个中等大小整数。有符号的范围是-8388608到8388607，无符号的范围是0到16777215。 
INT[(M)] [UNSIGNED] [ZEROFILL]
一个正常大小整数。有符号的范围是-2147483648到2147483647，无符号的范围是0到4294967295。 
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
这是INT的一个同义词。 
BIGINT[(M)] [UNSIGNED] [ZEROFILL] 
一个大整数。有符号的范围是-9223372036854775808到9223372036854775807，无符号的范围是0到 
18446744073709551615。注意，所有算术运算用有符号的BIGINT或DOUBLE值完成，因此你不应该使用大于9223372036854775807（63位)的有符号大整数，除了位函数！注意，当两个参数是INTEGER值时，-、+和*将使用BIGINT运算！这意味着如果你乘2个大整数(或来自于返回整数的函数)，如果结果大于9223372036854775807，你可以得到意外的结果。一个浮点数字，不能是无符号的，对一个单精度浮点数，其精度可以是]]></description>
			<content:encoded><![CDATA[<p>MySQL支持大量的列类型，它可以被分为3类：数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述，并且总结每个列类型的存储需求，然后提供每个类中的类型性质的更详细的描述。概述有意简化，更详细的说明应该考虑到有关特定列类型的附加信息，例如你能为其指定值的允许格式。 <span id="more-721"></span></p>
<p>由MySQL支持的列类型列在下面。下列代码字母用于描述中： </p>
<p>M<br />
指出最大的显示尺寸。最大的合法的显示尺寸是 255 。<br />
D<br />
适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30，但是应该不大于M-2。<br />
方括号(“[”和“]”)指出可选的类型修饰符的部分。 </p>
<p>注意，如果你指定一个了为ZEROFILL，MySQL将为该列自动地增加UNSIGNED属性。 </p>
<p>TINYINT[(M)] [UNSIGNED] [ZEROFILL]<br />
一个很小的整数。有符号的范围是-128到127，无符号的范围是0到255。 </p>
<p>SMALLINT[(M)] [UNSIGNED] [ZEROFILL]<br />
一个小整数。有符号的范围是-32768到32767，无符号的范围是0到65535。 </p>
<p>MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]<br />
一个中等大小整数。有符号的范围是-8388608到8388607，无符号的范围是0到16777215。 </p>
<p>INT[(M)] [UNSIGNED] [ZEROFILL]<br />
一个正常大小整数。有符号的范围是-2147483648到2147483647，无符号的范围是0到4294967295。 </p>
<p>INTEGER[(M)] [UNSIGNED] [ZEROFILL]<br />
这是INT的一个同义词。 </p>
<p>BIGINT[(M)] [UNSIGNED] [ZEROFILL] </p>
<p>一个大整数。有符号的范围是-9223372036854775808到9223372036854775807，无符号的范围是0到 </p>
<p>18446744073709551615。注意，所有算术运算用有符号的BIGINT或DOUBLE值完成，因此你不应该使用大于9223372036854775807（63位)的有符号大整数，除了位函数！注意，当两个参数是INTEGER值时，-、+和*将使用BIGINT运算！这意味着如果你乘2个大整数(或来自于返回整数的函数)，如果结果大于9223372036854775807，你可以得到意外的结果。一个浮点数字，不能是无符号的，对一个单精度浮点数，其精度可以是<=24，对一个双精度浮点数，是在25 和53之间，这些类型如FLOAT和DOUBLE类型马上在下面描述。FLOAT(X)有对应的FLOAT和DOUBLE相同的范围，但是显示尺寸和小数位数是未定义的。在MySQL3.23中，这是一个真正的浮点值。在更早的MySQL版本中，FLOAT(precision)总是有2位小数。该句法为了ODBC兼容性而提供。 </p>
<p>FLOAT[(M,D)] [ZEROFILL]<br />
一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38，0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。 </p>
<p>DOUBLE[(M,D)] [ZEROFILL]<br />
一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的DOUBLE或FLOAT(X)（25 < = X < = 53）代表一个双精密浮点数字。 </p>
<p>DOUBLE PRECISION[(M,D)] [ZEROFILL] </p>
<p>REAL[(M,D)] [ZEROFILL]<br />
这些是DOUBLE同义词。 </p>
<p>DECIMAL[(M[,D])] [ZEROFILL]<br />
一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列：“未压缩”意味着数字作为一个字符串被存储，值的每一位使用一个字符。小数点，并且对于负数，“-”符号不在M中计算。如果D是0，值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同，但是对一个给定的DECIMAL列，实际的范围可以通过M和D的选择被限制。如果D被省略，它被设置为0。如果M被省掉，它被设置为10。注意，在MySQL3.22里，M参数包括符号和小数点。 </p>
<p>NUMERIC(M,D) [ZEROFILL]<br />
这是DECIMAL的一个同义词。 </p>
<p>DATE<br />
一个日期。支持的范围是&#8217;1000-01-01&#8242;到&#8217;9999-12-31&#8242;。MySQL以&#8217;YYYY-MM-DD&#8217;格式来显示DATE值，但是允许你使用字符串或数字把值赋给DATE列。 </p>
<p>DATETIME<br />
一个日期和时间组合。支持的范围是&#8217;1000-01-01 00:00:00&#8242;到&#8217;9999-12-31 23:59:59&#8242;。MySQL以&#8217;YYYY-MM-DD HH:MM:SS&#8217;格式来显示DATETIME值，但是允许你使用字符串或数字把值赋给DATETIME的列。 </p>
<p>TIMESTAMP[(M)]<br />
一个时间戳记。范围是&#8217;1970-01-01 00:00:00&#8242;到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值，取决于是否M是14（或省略)、12、8或6，但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的，因为如果你不自己给它赋值，它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。<br />
TIME<br />
一个时间。范围是&#8217;-838:59:59&#8242;到&#8217;838:59:59&#8242;。MySQL以&#8217;HH:MM:SS&#8217;格式来显示TIME值，但是允许你使用字符串或数字把值赋给TIME列。 </p>
<p>YEAR[(2|4)]<br />
一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155，和0000（4位年格式），如果你使用2位，1970-2069( 70-69)。MySQL以YYYY格式来显示YEAR值，但是允许你把使用字符串或数字值赋给YEAR列。（YEAR类型在MySQL3.22中是新类型。） </p>
<p>CHAR(M) [BINARY]<br />
一个定长字符串，当存储时，总是是用空格填满右边到指定的长度。M的范围是1 ～ 255个字符。当值被检索时，空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较，除非给出BINARY关键词。NATIONAL CHAR（短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。 </p>
<p>[NATIONAL] VARCHAR(M) [BINARY]<br />
一个变长字符串。注意：当值被存储时，尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ～ 255个字符。 VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较，除非给出BINARY关键词值。 VARCHAR是CHARACTER VARYING一个缩写。 </p>
<p>TINYBLOB </p>
<p>TINYTEXT<br />
一个BLOB或TEXT列，最大长度为255(2^8-1)个字符。<br />
BLOB </p>
<p>TEXT<br />
一个BLOB或TEXT列，最大长度为65535(2^16-1)个字符。 </p>
<p>MEDIUMBLOB </p>
<p>MEDIUMTEXT<br />
一个BLOB或TEXT列，最大长度为16777215(2^24-1)个字符。<br />
LONGBLOB </p>
<p>LONGTEXT<br />
一个BLOB或TEXT列，最大长度为4294967295(2^32-1)个字符。 </p>
<p>ENUM(&#8216;value1&#8242;,&#8217;value2&#8242;,&#8230;)<br />
枚举。一个仅有一个值的字符串对象，这个值式选自与值列表&#8217;value1&#8242;、&#8217;value2&#8242;, &#8230;,或NULL。一个ENUM最多能有65535不同的值。 </p>
<p>SET(&#8216;value1&#8242;,&#8217;value2&#8242;,&#8230;)<br />
一个集合。能有零个或多个值的一个字符串对象，其中每一个必须从值列表&#8217;value1&#8242;, &#8216;value2&#8242;, &#8230;选出。一个SET最多能有64个成员。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/721/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(5)</title>
		<link>http://www.javagg.com/archives/684</link>
		<comments>http://www.javagg.com/archives/684#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:55:50 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=684</guid>
		<description><![CDATA[1)columnFamily下一个column和多个column的读取区别
2)columnfamily 和superColumnFamily的读取区别
测试机数量：两台，jvm最大使用内存都开到1.3G。
起始key: 1356278962 ;
改变组：
product_name1    :    &#8220;是一个非常可靠的大规模分布式存储系统&#8221;
product_name2    :    &#8220;中国惨败伊朗丢亚锦赛冠军创34年参赛最耻辱一败&#8221;
控制组：
product_value1    :    &#8220;第一次在主场丢冠军&#8221;
product_value2    :    &#8220;胡雪峰顶替受伤的刘炜&#8221;
product_value3    :    &#8220;朱芳雨都有外线出手机会&#8221;
product_value4    :    &#8220;张庆鹏传球意图太过明显&#8221;
product_value5    :    &#8220;最后一节比赛&#8221;
product_value6    :    &#8220;中国队首发：易建联、王治郅、朱芳雨、王仕鹏、胡雪峰&#8221;
product_value7    :    &#8220;中国队本次亚锦赛首次尝到失利的滋味，在家门口把冠军拱手相让&#8221;
product_value8    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体&#8221;
//下面这个是一个要存入的“摘要”
product_value9    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体，
            单打独斗的进攻模式成功率相当低。伊朗队内外结合，多点得分，
            继续扩大分差。朱芳雨传球被断，对手长传快攻，14号球员扣篮得分，
            28-53。王治郅强攻得手，造成哈达迪犯规，加罚命中。
            王治郅再次溜到篮下，反身投篮得分。王治郅成为中国队的唯一亮点，
            持球接连晃过三名球员的防守，投篮得分，加罚再中，
            36-53。靠着王治郅的出色发挥，中国队留住翻盘的一线希望。
            第三节结束，39-56，分差仍为17分。&#8221;
   
我们有的ColumnFamily: Standard1 Standard2 Super1 Super2
测试1：    向Standard1中写入10万条记录，此时Standard1中只有&#8221;product_name&#8221;一个column,key是从1356278962开始往后10万个
    insert()进行插入，速度很慢，不可能在一小时内完成
    CQL 用时256秒,关掉log后用时55秒
测试2：    然后在product_name1 和 product_name2之间反复修改key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次
    CQL：
    当config中的ReplicationFactor为1的时候，用时120秒
    当config中的ReplicationFactor为2的时候，用时183秒；关掉log后用时42秒
   
测试3：    将存在的各个key的product_name读取一遍（此时相应columnFamily中只有1个column）
    当config中的ReplicationFactor为1的时候：速度相当慢
    当config中的ReplicationFactor为2的时候：
        CQL：
        用时267秒；关掉log后用时145秒
        API：
        用get_column用时203秒；关掉log后用时135秒
以下均以ReplicationFactor=2来进行测试
测试4：    依照已经存在的各个key，向Standard1中写入10万条控制组里面的column数据
    [...]]]></description>
			<content:encoded><![CDATA[<p>1)columnFamily下一个column和多个column的读取区别<br />
2)columnfamily 和superColumnFamily的读取区别</p>
<p>测试机数量：两台，jvm最大使用内存都开到1.3G。</p>
<p>起始key: 1356278962 ;</p>
<p>改变组：<br />
product_name1    :    &#8220;是一个非常可靠的大规模分布式存储系统&#8221;<br />
product_name2    :    &#8220;中国惨败伊朗丢亚锦赛冠军创34年参赛最耻辱一败&#8221;<span id="more-684"></span></p>
<p>控制组：<br />
product_value1    :    &#8220;第一次在主场丢冠军&#8221;<br />
product_value2    :    &#8220;胡雪峰顶替受伤的刘炜&#8221;<br />
product_value3    :    &#8220;朱芳雨都有外线出手机会&#8221;<br />
product_value4    :    &#8220;张庆鹏传球意图太过明显&#8221;<br />
product_value5    :    &#8220;最后一节比赛&#8221;<br />
product_value6    :    &#8220;中国队首发：易建联、王治郅、朱芳雨、王仕鹏、胡雪峰&#8221;<br />
product_value7    :    &#8220;中国队本次亚锦赛首次尝到失利的滋味，在家门口把冠军拱手相让&#8221;<br />
product_value8    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体&#8221;</p>
<p>//下面这个是一个要存入的“摘要”<br />
product_value9    :    &#8220;下半场易边再战，中国队仍然如同梦游，球员之间没有形成整体，<br />
            单打独斗的进攻模式成功率相当低。伊朗队内外结合，多点得分，<br />
            继续扩大分差。朱芳雨传球被断，对手长传快攻，14号球员扣篮得分，<br />
            28-53。王治郅强攻得手，造成哈达迪犯规，加罚命中。<br />
            王治郅再次溜到篮下，反身投篮得分。王治郅成为中国队的唯一亮点，<br />
            持球接连晃过三名球员的防守，投篮得分，加罚再中，<br />
            36-53。靠着王治郅的出色发挥，中国队留住翻盘的一线希望。<br />
            第三节结束，39-56，分差仍为17分。&#8221;</p>
<p>   <br />
我们有的ColumnFamily: Standard1 Standard2 Super1 Super2</p>
<p>测试1：    向Standard1中写入10万条记录，此时Standard1中只有&#8221;product_name&#8221;一个column,key是从1356278962开始往后10万个</p>
<p>    insert()进行插入，速度很慢，不可能在一小时内完成<br />
    CQL 用时256秒,关掉log后用时55秒</p>
<p>测试2：    然后在product_name1 和 product_name2之间反复修改key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次<br />
    CQL：</p>
<p>    当config中的ReplicationFactor为1的时候，用时120秒<br />
    当config中的ReplicationFactor为2的时候，用时183秒；关掉log后用时42秒</p>
<p>   <br />
测试3：    将存在的各个key的product_name读取一遍（此时相应columnFamily中只有1个column）<br />
    当config中的ReplicationFactor为1的时候：速度相当慢<br />
    当config中的ReplicationFactor为2的时候：</p>
<p>        CQL：</p>
<p>        用时267秒；关掉log后用时145秒</p>
<p>        API：<br />
        用get_column用时203秒；关掉log后用时135秒</p>
<p>以下均以ReplicationFactor=2来进行测试</p>
<p>测试4：    依照已经存在的各个key，向Standard1中写入10万条控制组里面的column数据<br />
    API：</p>
<p>    batch_insert() 速度非常慢</p>
<p>    CQL：<br />
    90万个column元素,其中包括一个类似摘要大小的字符串(200字左右)，用时2004秒；关掉log后用时512秒。</p>
<p>测试5：    然后在product_name1 和 product_name2之间反复修改key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次</p>
<p>    API：<br />
    使用insert()速度相当慢</p>
<p>    CQL：<br />
    用时190秒；关掉log后用时45秒</p>
<p>测试6：    将存在的各个key的product_name读取一遍（此时相应columnFamily中已经有10个column了）</p>
<p>    API：</p>
<p>    使用get_column()用时757秒;关掉log后用时188秒</p>
<p>    CQL：</p>
<p>    用时更慢一些，用时861秒;关掉log后用时202秒</p>
<p>super测试1：在Super1中创建superColumn1，在superColumn1中只创建1个column-&#8221;product_name&#8221;,然后写入10万条数据,key是从1356278962开始往后10万个</p>
<p>    CQL：</p>
<p>    用时316秒;关掉log后用时60秒<br />
super测试2：然后在product_name1 和 product_name2之间反复修改superColumn1下key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次<br />
    CQL：</p>
<p>    用时195秒;关掉log后用时62秒<br />
super测试3：将存在的各个key的product_name读取一遍（此时相应superColumnFamily中只有1个column）</p>
<p>    API：</p>
<p>    get_column() 用时235秒;关掉log后用时234秒</p>
<p>    CQL：</p>
<p>    用时356秒 ;关掉log后用时158秒</p>
<p>super测试4：依照已经存在的各个key,依次向superColumn1中写入10万条控制组里面的column数据</p>
<p>    CQL：</p>
<p>    用时2058秒;关掉log后，竟然非常慢，不知道为什么，但是重新启动下节点后，速度变快，用时562秒<br />
super测试4：然后在product_name1 和 product_name2之间反复修改superColumn1下key-1356279962对应的&#8221;produck_name&#8221;这个column的内容10万次</p>
<p>   CQL：</p>
<p>   用时190秒,关掉log后用时48秒<br />
super测试6：将存在的各个key的product_name读取一遍（此时相应superColumnFamily中已经有10个column了）</p>
<p>    API：</p>
<p>    用get_column 用时 356秒;关掉log后用时191秒</p>
<p>    CQL：</p>
<p>    用时314秒;关掉log后用时208秒</p>
<p>结论：使用superColumn的开销不比column大很多，向columnFamily中加入更多的column对读取速度的影响不大。相比而言受log和ReplicationFactor的影响更大。另外在写入的时候CQL的效率更高，在读取的时候get_column更好一些。而API中的其他方法如batch_insert()，insert()效率明显不高。但这只是两个节点的情况，当有更多节点的时候情况可能又会不一样了。</p>
<p>转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/17/4456357.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/17/4456357.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/684/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(4)</title>
		<link>http://www.javagg.com/archives/682</link>
		<comments>http://www.javagg.com/archives/682#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:55:10 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=682</guid>
		<description><![CDATA[(一)依赖:cassandra.jar
             libthrift.jar
(二)连接:
    //该方法将返回一个Cassandra.Client实例,该实例包含和server端指定节点会话的API



&#160;


     public Cassandra.Client getClient&#40;&#41;


    &#123;


        //192.168.0.169为想连接到的某个节点的ip,9160为端口&#60;span id=&#34;more-682&#34;&#62;&#60;/span&#62;


&#160;


        TSocket socket = new TSocket&#40;&#34;192.168.0.169&#34;, 9160&#41;;


&#160;


        TTransport transport_ = socket;


&#160;


        TBinaryProtocol binaryProtocol = new TBinaryProtocol&#40;transport_, false, false&#41;;


        Cassandra.Client cassandraClient = new Cassandra.Client&#40;binaryProtocol&#41;;


&#160;


        try


        &#123;


            transport_.open&#40;&#41;;


        &#125;


        catch&#40;Exception e&#41;


        &#123;


            // Should move this to Log4J as well probably&#8230;


            System.err.println&#40;&#34;Exception &#34; + e.getMessage&#40;&#41;&#41;;          


            e.printStackTrace&#40;&#41;;


        &#125;


      


        return cassandraClient;


     


    [...]]]></description>
			<content:encoded><![CDATA[<p>(一)依赖:cassandra.jar</p>
<p>             libthrift.jar</p>
<p>(二)连接:</p>
<p>    //该方法将返回一个Cassandra.Client实例,该实例包含和server端指定节点会话的API</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">     <span class="kw2">public</span> Cassandra.<span class="me1">Client</span> getClient<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//192.168.0.169为想连接到的某个节点的ip,9160为端口&lt;span id=&quot;more-682&quot;&gt;&lt;/span&gt;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        TSocket socket = <span class="kw2">new</span> TSocket<span class="br0">&#40;</span><span class="st0">&quot;192.168.0.169&quot;</span>, <span class="nu0">9160</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        TTransport transport_ = socket;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        TBinaryProtocol binaryProtocol = <span class="kw2">new</span> TBinaryProtocol<span class="br0">&#40;</span>transport_, <span class="kw2">false</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        Cassandra.<span class="me1">Client</span> cassandraClient = <span class="kw2">new</span> Cassandra.<span class="me1">Client</span><span class="br0">&#40;</span>binaryProtocol<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            transport_.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">// Should move this to Log4J as well probably&#8230;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">err</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Exception &quot;</span> + e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;          </div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">      </div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">return</span> cassandraClient;</div>
</li>
<li class="li2">
<div class="de2">     </div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>(三)API</p>
<p>1)该方法向key的指定path插入一个数据，另外想要对key某指定path的数据进行修改也使用这个方法</p>
<p>   代码中的cli是一个Cassandra.Client实例</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">     <span class="kw2">public</span> <span class="kw4">void</span> test_insert<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key = <span class="st0">&quot;testkey&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;testColumn&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> value = <span class="st0">&quot;testValue&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//对数据进行定位</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = columnFamily+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//向cassandra中插入一条数据</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">insert</span><span class="br0">&#40;</span>tableName,key,path,value.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>2)该方法试用Cql语句的方式发送请求，有一个问题就是当请求的参数或不正确的时候，方法不会报错，只是返回为空；</p>
<p>   但是在语法出现错误的时候还是会有InvalidRequestException抛出,提示Unresolved compilation problems</p>
<p>   代码中的cli是一个Cassandra.Client实例</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">   <span class="kw2">public</span> <span class="kw4">void</span> test_excuteQuery<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            cli.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="st0">&quot;set Table1.Standard1['testKey2']['testColumn']=&#8217;testValue2&#8242;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            CqlResult_t crt = cli.<span class="me1">executeQuery</span><span class="br0">&#40;</span><span class="st0">&quot;get Table1.Standard1['testKey2']&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            List&lt;Map&lt;String, String&gt;&gt; rs = crt.<span class="me1">getResultSet</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//遍历显示所有column_t中的内容</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span><span class="br0">&#40;</span>rs != <span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">                <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span> ; i &lt; rs.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ; i++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                    Map&lt;String , String&gt; map = rs.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                    <span class="kw1">for</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key : map.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>key+<span class="st0">&quot; : &quot;</span>+map.<span class="me1">get</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">                <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;result set is null&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>3)根据path信息获取一个column</p>
<p>   path是一个定位信息，standard column family是两层 super column family是三层</p>
<p>   superColumnFamily:superColumn:standardColumn。</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">   <span class="kw2">public</span> <span class="kw4">void</span> test_get_column<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> column = <span class="st0">&quot;testColumn&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = columnFamily+<span class="st0">&quot;:&quot;</span>+column;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            column_t cmt = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, key, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下两个是等价的</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getColumnName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getFieldValue</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下两个是等价的</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#40;</span>cmt.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> cmt.<span class="me1">getFieldValue</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>,<span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下两个是等价的</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getTimestamp</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cmt.<span class="me1">getFieldValue</span><span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">          </div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>4)</p>
<p>    //术语解释：每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice</p>
<p>    //给定table,key和columnFamily的信息，<br />
    //此方法将返回，该key在当前columnFamily的slice中有都少个column元素<br />
    //该例子中key:&#8221;testKey2&#8243;在columnFamily:&#8221;Standard1&#8243;中的slice有几个column元素</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_column_count<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">get_column_count</span><span class="br0">&#40;</span>tableName, keyName, columnFamily<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>5) //暂不确定</p>
<p>    //根据给定的时间点，取出以后的对应给定key的一组columns<br />
    //但是好像在时间上有延迟,这个不确定</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_columns_since<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ALong+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Long</span></a> sinceTime = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="nu0">-5000</span>*<span class="nu0">1000</span>;<span class="co1">//取当前时间之前120秒以内的</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;column_t&gt; cmts = cli.<span class="me1">get_columns_since</span><span class="br0">&#40;</span>tableName , keyName , columnFamily , sinceTime<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;cmts size : &quot;</span>+cmts.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>6)//range queries may only be performed against an order-preserving partitioner<br />
    //如果系统试用的节点定位的RandomPartitioner的话那么这个方法将不能试用，好处是跟均衡的存储</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="co1">//此方法尚在研究中</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_key_range<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">get_key_range</span><span class="br0">&#40;</span><span class="st0">&quot;Table1&quot;</span>, <span class="st0">&quot;？？&quot;</span>, <span class="st0">&quot;？？&quot;</span>, <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">          </div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>7) //术语解释：每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 分成了很多slice</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="co1">//每一个columnFamily都存在一个排序,或按照name或按照time</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="co1">//该方法将取出对应某个key的一定区间段内的column元素</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_slice<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;    <span class="co1">//想要从哪个columnFamily中获取column</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw4">int</span> start = <span class="nu0">0</span>;<span class="co1">//起始位置</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw4">int</span> count = <span class="nu0">10</span>;<span class="co1">//获取数量</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;column_t&gt; cmts = cli.<span class="me1">get_slice</span><span class="br0">&#40;</span>tableName, keyName, columnFamily, start, count<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;cmts size : &quot;</span>+cmts.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p> <img src='http://www.javagg.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> //通过一个column的名字数组来查找相对应的属于给定key的slice（一组column 元素）</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_slice_by_names<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testKey&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        List&lt;String&gt; columnNameList = <span class="kw2">new</span> ArrayList&lt;String&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        columnNameList.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;testColumn&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; cmts = cli.<span class="me1">get_slice_by_names</span><span class="br0">&#40;</span>tableName, keyName, columnFamily, columnNameList<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>9)//描述一个table中的各个columnFamily的基本信息</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_describe_table<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">describeTable</span><span class="br0">&#40;</span><span class="st0">&quot;Table1&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>10)//批量的针对一个key插入数据</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_batch_insert<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;testkey2&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//当下的Map保存了ColumnFamily到他内部的column元素列表的一个映射</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//所以String 应该保存 对应columnFamily的名字。</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//column_t(column元素)包含：columnName , value , timestamp 三要素</span></div>
</li>
<li class="li2">
<div class="de2">            Map&lt;String , List&lt;column_t&gt;&gt; CFmap = <span class="kw2">new</span> HashMap&lt;String , List&lt;column_t&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//制作两个column_t实例</span></div>
</li>
<li class="li1">
<div class="de1">            column_t cmt1 = <span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;test_column_name_1&quot;</span> , <span class="st0">&quot;test_column_value_1&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span> , <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            column_t cmt2 = <span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;test_column_name_2&quot;</span> , <span class="st0">&quot;test_column_value_2&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span> , <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//制作一个column_t的list</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; cList = <span class="kw2">new</span> ArrayList&lt;column_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cList.<span class="me1">add</span><span class="br0">&#40;</span>cmt1<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cList.<span class="me1">add</span><span class="br0">&#40;</span>cmt2<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//制作一个将其写入CFmap中</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamilyName = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">            CFmap.<span class="me1">put</span><span class="br0">&#40;</span>columnFamilyName, cList<span class="br0">&#41;</span>;<span class="co1">//这样在以后的插入操作中，相应的column_t将插入&quot;Docin&quot;这个family中</span></div>
</li>
<li class="li1">
<div class="de1">            batch_mutation_t bmt = <span class="kw2">new</span> batch_mutation_t<span class="br0">&#40;</span>tableName , keyName , CFmap<span class="br0">&#41;</span>;<span class="co1">//完成插入的key的定位</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//执行这个针对相应key和colmunFamily的batch_insert</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">batch_insert</span><span class="br0">&#40;</span>bmt, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">           </div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>11)//同insert()相对的反向操作<br />
    //当我们试图查询一个不存在的column_t元素的时候，会有&#8221;NotFoundException&#8221;异常被抛出</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_remove<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnFamily = <span class="st0">&quot;Standard1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;removetest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;removetestkey&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> value = <span class="st0">&quot;removetestvalue&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = columnFamily+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li2">
<div class="de2">        <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//先将相应的column元素写入</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">insert</span><span class="br0">&#40;</span>tableName, keyName, path, value.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//尝试读出信息</span></div>
</li>
<li class="li1">
<div class="de1">            column_t cmt = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            displayColumn<span class="br0">&#40;</span>cmt<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//删除这条信息</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">remove</span><span class="br0">&#40;</span>tableName, keyName, path, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//尝试读出信息</span></div>
</li>
<li class="li1">
<div class="de1">        column_t cmt2;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            cmt2 = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            displayColumn<span class="br0">&#40;</span>cmt2<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;NotFoundException 异常抛出，column_元素已经被删除&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>12)//插入一个superColumn元素<br />
    //不含有内容的superColumn不能同过该方法被创建,会抛出异常</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_batch_insert_super_t<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName    = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName        = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamilyName = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生1个superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//首先产生1个column_t的list</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; Clist = <span class="kw2">new</span> ArrayList&lt;column_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//当两个名字一样的时候，先前的会被覆盖</span></div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper1&quot;</span>,<span class="st0">&quot;stardcolumn1&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper2&quot;</span>,<span class="st0">&quot;stardcolumn2&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生一个superColumn元素</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            superColumn_t sct = <span class="kw2">new</span> superColumn_t<span class="br0">&#40;</span>superColumnName , Clist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将这个元素装入到一个superColumn_t的List中</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;superColumn_t&gt; SClist = <span class="kw2">new</span> ArrayList&lt;superColumn_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            SClist.<span class="me1">add</span><span class="br0">&#40;</span>sct<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中</span></div>
</li>
<li class="li1">
<div class="de1">            Map&lt;String , List&lt;superColumn_t&gt;&gt; cfmap = <span class="kw2">new</span> HashMap&lt;String , List&lt;superColumn_t&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cfmap.<span class="me1">put</span><span class="br0">&#40;</span>superColumnFamilyName, SClist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//区别于一般的，这里要求的column元素是superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将整理好的信息关联一个key后生成一个mutation</span></div>
</li>
<li class="li2">
<div class="de2">            batch_mutation_super_t bmst = <span class="kw2">new</span> batch_mutation_super_t<span class="br0">&#40;</span>tableName,keyName,cfmap<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw4">boolean</span> block = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//执行这个mutation的插入操作</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">batch_insert_superColumn</span><span class="br0">&#40;</span>bmst, block<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>13)//获取一个SuperColumn中的信息</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_superColumn<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamilyName = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = superColumnFamilyName+<span class="st0">&quot;:&quot;</span>+superColumnName;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            superColumn_t sct = cli.<span class="me1">get_superColumn</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span><span class="br0">&#40;</span>sct != <span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Super Name : &quot;</span>+sct.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Size : &quot;</span>+sct.<span class="me1">getColumnsSize</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                List&lt;column_t&gt; clist = sct.<span class="me1">getColumns</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;super column is empty&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>14)//尝试向一个superColumn中添加column元素(就是column_t对象)<br />
   //注意：想superColumnFamily中添加一般的column元素是不被允许的,所以superColumnFamliy中只能有superColumn，而superColumn中只能有一般的column<br />
   //而一般的columnFamily中也只能有一般的column</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_insert_standard_to_super<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamily = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;normal_column&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> value = <span class="st0">&quot;normal_column_value_add&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = superColumnFamily+<span class="st0">&quot;:&quot;</span>+superColumnName+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">insert</span><span class="br0">&#40;</span>tableName, keyName, path, value.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//尝试取出这个元素并显示这个元素</span></div>
</li>
<li class="li1">
<div class="de1">            column_t cmt = cli.<span class="me1">get_column</span><span class="br0">&#40;</span>tableName, keyName, path<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="kw1">if</span><span class="br0">&#40;</span>cmt != <span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column name : &quot;</span>+cmt.<span class="me1">getColumnName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column value: &quot;</span>+<span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#40;</span>cmt.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column time : &quot;</span>+cmt.<span class="me1">getTimestamp</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;column is empty&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>NotFoundException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>15)//术语解释：每个key都对应一个Row的信息这个Row的信息又按照columnFamliy 或superColumnFamily分成了很多slice<br />
    //同针对一般的columnFamliy类似,这个方法是获取给定key的某个superColumnFamily的slice，这个slice中的元素都是superColumn</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_get_slice_super<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamily = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;superColumn_t&gt; sct = cli.<span class="me1">get_slice_super</span><span class="br0">&#40;</span>tableName, keyName, superColumnFamily, <span class="nu0">0</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AUnsupportedEncodingException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">UnsupportedEncodingException</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>16)<br />
//尝试删除一个superColumn节点，和属于该节点的column_t节点<br />
    //测试需要通过path来定位这个节点</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_remove_super<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> tableName = <span class="st0">&quot;Table1&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> keyName = <span class="st0">&quot;superkeytest&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnFamily = <span class="st0">&quot;Super1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumn = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> columnName = <span class="st0">&quot;stardcolumninsuper1&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> path = superColumnFamily+<span class="st0">&quot;:&quot;</span>+superColumn+<span class="st0">&quot;:&quot;</span>+columnName;</div>
</li>
<li class="li2">
<div class="de2">       </div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//先建立一个super_column_family 名字测试的时候是&quot;superColumn3&quot;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生1个superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//首先产生1个column_t的list</span></div>
</li>
<li class="li2">
<div class="de2">            List&lt;column_t&gt; Clist = <span class="kw2">new</span> ArrayList&lt;column_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//当两个名字一样的时候，先前的会被覆盖</span></div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper1&quot;</span>,<span class="st0">&quot;stardcolumn1&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            Clist.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw2">new</span> column_t<span class="br0">&#40;</span><span class="st0">&quot;stardcolumninsuper2&quot;</span>,<span class="st0">&quot;stardcolumn2&quot;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//产生一个superColumn元素</span></div>
</li>
<li class="li2">
<div class="de2">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> superColumnName = <span class="st0">&quot;superColumn3&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">            superColumn_t sct = <span class="kw2">new</span> superColumn_t<span class="br0">&#40;</span>superColumnName , Clist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将这个元素装入到一个superColumn_t的List中</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;superColumn_t&gt; SClist = <span class="kw2">new</span> ArrayList&lt;superColumn_t&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            SClist.<span class="me1">add</span><span class="br0">&#40;</span>sct<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//将这个super_column 的list连同对应的superColumnFamily的名字一起放入一个hashmap中</span></div>
</li>
<li class="li1">
<div class="de1">            Map&lt;String , List&lt;superColumn_t&gt;&gt; cfmap = <span class="kw2">new</span> HashMap&lt;String , List&lt;superColumn_t&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            cfmap.<span class="me1">put</span><span class="br0">&#40;</span>superColumnFamilyName, SClist<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//区别于一般的，这里要求的column元素是superColumn元素</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//将整理好的信息关联一个key后生成一个mutation</span></div>
</li>
<li class="li2">
<div class="de2">            batch_mutation_super_t bmst = <span class="kw2">new</span> batch_mutation_super_t<span class="br0">&#40;</span>tableName,keyName,cfmap<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw4">boolean</span> block = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//执行这个mutation的插入操作</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">batch_insert_superColumn</span><span class="br0">&#40;</span>bmst, block<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">       </div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//尝试删除之</span></div>
</li>
<li class="li1">
<div class="de1">            cli.<span class="me1">remove</span><span class="br0">&#40;</span>tableName, keyName, path, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">currentTimeMillis</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>InvalidRequestException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>UnavailableException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>17)//这个方法目前还不健全</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">    <span class="kw2">public</span> <span class="kw4">void</span> test_getProperty<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">            <span class="co1">//这事一个未健全的方法，现在只能返回对应&quot;tables&quot;的参数，也就是表名</span></div>
</li>
<li class="li1">
<div class="de1">            List&lt;String&gt; Plist = cli.<span class="me1">getStringListProperty</span><span class="br0">&#40;</span><span class="st0">&quot;tables&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span> ; i &lt; Plist.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> ; i++<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">                <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>Plist.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">// TODO Auto-generated catch block</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//现在只支持如下三个参数</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">getStringProperty</span><span class="br0">&#40;</span><span class="st0">&quot;cluster name&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//会直接把server端的storage_conf.xml读进来,可能用于做进一步的xml分析</span></div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">getStringProperty</span><span class="br0">&#40;</span><span class="st0">&quot;config file&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">            <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>cli.<span class="me1">getStringProperty</span><span class="br0">&#40;</span><span class="st0">&quot;version&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span>TException e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>一些注意的：<br />
1)cli的实例还有一些诸如sent_*和recv_*（成对出现）的公共方法，这些方法是供上面罗列的相应方法调用的，一般不用管，<br />
2)sent_*负责想服务器端发送消息<br />
3)recv_*将处理返回的所要的结果或处理错误信息抛出相应异常<br />
4)大部分方法可执行的前提是必须有一个精确的key信息,(describe_table和get_key_range除外)。<br />
5)一个superColumnFamily中只能存放superColumn_t元素而不能存放column_t元素<br />
6)一个columnFamily中只能存放column_t元素<br />
转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/14/4447359.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/14/4447359.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/682/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(3)</title>
		<link>http://www.javagg.com/archives/680</link>
		<comments>http://www.javagg.com/archives/680#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:54:20 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=680</guid>
		<description><![CDATA[当某个end point拿到一个key(比如&#8221;王老六&#8221;)并想取出他的相关信息的时候,这个节点是怎么知道这个key的相关信息是存放在哪些节点中的呢?
以下将用从客户端拿到的&#8221;get_clomun&#8221;请求为例，进行说明：
      &#8220;get_column&#8221;的相关信息会在CassandraServer的get_column(String tablename, String key, String columnPath)方法中被封装成一个readCommand实例，该对象简单包含了请求信息，另外也提供了一些别的方法。
      然后该command实例会最终被交给 StorageProxy.readProtocol(command,StorageService.ConsistencyLevel.WEAK)来处理，并期待这个方法能返回一个和key关联的columnFamily的数据，这些数据被装在一个row对象里返回的。
      在上述的StorageProxy.readProtocol(&#8230;)这个方法中，首先要做的事情就是根据提交的key(&#8220;王老六&#8221;)确定他的相关信息内容是存放在那些end point中的。而这个寻找end point的工作由StorageService.instance().getNStorageEndPoint(command.key)来完成。
      实际上，上述的StorageService的getNStorageEndPoint(String key)方法调用了他持有的实例&#8221;nodePicker_&#8221;的getStorageEndPoints(Token token) 来完成寻找end point这件事情。
      题外话：StorageService这个实例提供了本地节点数据存储和与其他节点交互的服务，这个实例是在节点启动之初被建立的，在建立的时候该实例会初始化一个nodePicker_放在其内部，这个nodePicker主要负责本地节点同其他节点的交互规则，也就是如何选择其他节点的策略。当前的策略有两种:RackAwareStrategy&#8211;机架敏感 和 RackUnawareStrategy&#8211;非机架敏感，默认策略是RackUnawareStrategy。
      所以默认情况下，nodePicker_就是一个RackUnawareStrategy实例，而他的 getStorageEndPoints(Token token)将被用来查找合适我们给出的key(&#8220;王老六&#8221;)的end point,这里合适的意思是“存有关于这个key的信息”。而这里提到的token是由key封装得来的，他对key进行了hash，并且继承了 Comparable接口。也就是说，这个token实例是可以和其他同类token比较大小的，而这样做的目的是为了“可以在Token组成的list 上进行二分查询Collection.binarySort，并定位查找目标的在list中的相对位置”&#8211;这种查找操作将被经常使用。默认情况下 token是一个BigIntegerToken的实例。
      nodePicker_最终会将查找的工作交给getStorageEndPoints(Token token, Map&#60;Token, EndPoint&#62; tokenToEndPointMap)来做，这个方法会返回一个查找到的end_point的数组。以下是对RackUnawareStrategy中的相应方法的说明（因为默认是使用这个方法）:
//此处的tokenToEndPointMap保存了该节点知道的所有其他节点，并且可以根据他们的token查找到
//此处的token是我们要查找的key(&#8220;王老五&#8221;)生成的token,他跟上面end point的token生成的算法是相同的，也都是BigIntegerToken



&#160;


public EndPoint&#91;&#93; getStorageEndPoints&#40;Token token, Map&#60;Token, EndPoint&#62; tokenToEndPointMap&#41;


    &#123;


        //根据key寻址的切入点


        int startIndex;


        List&#60;EndPoint&#62; list = new ArrayList&#60;EndPoint&#62;&#40;&#41;;


        int foundCount = 0;


        //将key的set装入一个ArrayList中，并完成排序，（一位token是comparable的）


        List [...]]]></description>
			<content:encoded><![CDATA[<p>当某个end point拿到一个key(比如&#8221;王老六&#8221;)并想取出他的相关信息的时候,这个节点是怎么知道这个key的相关信息是存放在哪些节点中的呢?<br />
以下将用从客户端拿到的&#8221;get_clomun&#8221;请求为例，进行说明：</p>
<p>      &#8220;get_column&#8221;的相关信息会在CassandraServer的get_column(String tablename, String key, String columnPath)方法中被封装成一个readCommand实例，该对象简单包含了请求信息，另外也提供了一些别的方法。<span id="more-680"></span></p>
<p>      然后该command实例会最终被交给 StorageProxy.readProtocol(command,StorageService.ConsistencyLevel.WEAK)来处理，并期待这个方法能返回一个和key关联的columnFamily的数据，这些数据被装在一个row对象里返回的。</p>
<p>      在上述的StorageProxy.readProtocol(&#8230;)这个方法中，首先要做的事情就是根据提交的key(&#8220;王老六&#8221;)确定他的相关信息内容是存放在那些end point中的。而这个寻找end point的工作由StorageService.instance().getNStorageEndPoint(command.key)来完成。</p>
<p>      实际上，上述的StorageService的getNStorageEndPoint(String key)方法调用了他持有的实例&#8221;nodePicker_&#8221;的getStorageEndPoints(Token token) 来完成寻找end point这件事情。</p>
<p>      题外话：StorageService这个实例提供了本地节点数据存储和与其他节点交互的服务，这个实例是在节点启动之初被建立的，在建立的时候该实例会初始化一个nodePicker_放在其内部，这个nodePicker主要负责本地节点同其他节点的交互规则，也就是如何选择其他节点的策略。当前的策略有两种:RackAwareStrategy&#8211;机架敏感 和 RackUnawareStrategy&#8211;非机架敏感，默认策略是RackUnawareStrategy。</p>
<p>      所以默认情况下，nodePicker_就是一个RackUnawareStrategy实例，而他的 getStorageEndPoints(Token token)将被用来查找合适我们给出的key(&#8220;王老六&#8221;)的end point,这里合适的意思是“存有关于这个key的信息”。而这里提到的token是由key封装得来的，他对key进行了hash，并且继承了 Comparable接口。也就是说，这个token实例是可以和其他同类token比较大小的，而这样做的目的是为了“可以在Token组成的list 上进行二分查询Collection.binarySort，并定位查找目标的在list中的相对位置”&#8211;这种查找操作将被经常使用。默认情况下 token是一个BigIntegerToken的实例。</p>
<p>      nodePicker_最终会将查找的工作交给getStorageEndPoints(Token token, Map&lt;Token, EndPoint&gt; tokenToEndPointMap)来做，这个方法会返回一个查找到的end_point的数组。以下是对RackUnawareStrategy中的相应方法的说明（因为默认是使用这个方法）:<br />
//此处的tokenToEndPointMap保存了该节点知道的所有其他节点，并且可以根据他们的token查找到</p>
<p>//此处的token是我们要查找的key(&#8220;王老五&#8221;)生成的token,他跟上面end point的token生成的算法是相同的，也都是BigIntegerToken</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> EndPoint<span class="br0">&#91;</span><span class="br0">&#93;</span> getStorageEndPoints<span class="br0">&#40;</span>Token token, Map&lt;Token, EndPoint&gt; tokenToEndPointMap<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//根据key寻址的切入点</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="kw4">int</span> startIndex;</div>
</li>
<li class="li1">
<div class="de1">        List&lt;EndPoint&gt; list = <span class="kw2">new</span> ArrayList&lt;EndPoint&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw4">int</span> foundCount = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//将key的set装入一个ArrayList中，并完成排序，（一位token是comparable的）</span></div>
</li>
<li class="li1">
<div class="de1">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">List</span></a> tokens = <span class="kw2">new</span> ArrayList&lt;Token&gt;<span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ACollections+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Collections</span></a>.<span class="me1">sort</span><span class="br0">&#40;</span>tokens<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//在排好序的tokens中二叉树搜索token，并返回token所在的位置的index</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//个人认为:根本别指望tokens里面能有我们要找的token，因为一个是end point的token集合,一个是查找key(&quot;王老六&quot;)生成的 </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//token，生成的时候都使用了hash，并且加入了大随即数，重合的概率很低。</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//这样做的主要目的是为了获得下面这个index，（参见binarySearch的说明可知）。</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//也就是：虽然下面这条语句不大可能从tokens中取出东西，但是生成的index将告诉我们，哪个end point的token离我们给出的</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//key&quot;王老六&quot;的token“最近”。而且，在节点情况固定下来的情况下，用当前这种方法，</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//key&quot;王老六&quot;的token确定的对应的end point也是不会改变的(每次都会取到这个end point，除非end point本身注册的变了)。</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//也就是说：这就成了一种方法，一种能够根据数据key(&quot;王老六&quot;)定位到一个end point的方法，</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//如果写数据时使用了这种策略找到一个end point 节点然后写进数据，那么手持相应的key在读数据的时候，同样使用这个策略，也</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//相应的能找到当时存入数据的那个节点，并把数据读出来。</span></div>
</li>
<li class="li2">
<div class="de2">          <span class="kw4">int</span> index = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ACollections+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Collections</span></a>.<span class="me1">binarySearch</span><span class="br0">&#40;</span>tokens, token<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//基本上这个条件里面的语句肯定会被执行</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//那如果真的用key(&quot;王老六&quot;)从tokens中找到对应了呢？这个方法里的策略就是，那就直接拿这个被确定的节点来当 “邻居”节点了</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//而key的tokens和end_point的token之所以能混在一起说话，是因为他们都是BigIntegerToken，在同一个数据空间中</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw1">if</span><span class="br0">&#40;</span>index &lt; <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">            <span class="co1">//以下的运算将把key(&quot;王老六&quot;)的&quot;邻居&quot;节点给&quot;翻译&quot;出来</span></div>
</li>
<li class="li2">
<div class="de2">            index = <span class="br0">&#40;</span>index + <span class="nu0">1</span><span class="br0">&#41;</span> * <span class="br0">&#40;</span><span class="nu0">-1</span><span class="br0">&#41;</span>;<span class="co1">//得到可以插入的位置</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span> <span class="br0">&#40;</span>index &gt;= tokens.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">                index = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw4">int</span> totalNodes = tokens.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">// Add the node at the index by default</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//把我们找到的&quot;邻居&quot;节点放到一个要返回的list中，当然,对于一个key(&quot;王老六&quot;)的信息还可能在其他节点上存有副本(replicas)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//再下面的操作会将这些存有副本的节点也一同取出</span></div>
</li>
<li class="li2">
<div class="de2">        list.<span class="me1">add</span><span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">get</span><span class="br0">&#40;</span>tokens.<span class="me1">get</span><span class="br0">&#40;</span>index<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        foundCount++;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//本来index是从0&#8230;一直到size()的一条线，如果我们用如下的方式选取index，就好似将所有的index数值放在了一个圆圈上，然后按</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//从小到大的方向在选取下一个index。startIndex就是一个切入点，本质上Partitioner提供了这个可被&quot;切入&quot;的结构和线索</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//猜想这也是为什么叫Partitioner的原因吧</span></div>
</li>
<li class="li1">
<div class="de1">        startIndex = <span class="br0">&#40;</span>index + <span class="nu0">1</span><span class="br0">&#41;</span>%totalNodes;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">// If we found N number of nodes we are good. This loop will just exit. Otherwise just</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">// loop through the list and add until we have N nodes.</span></div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">// replicas_对应storage-conf.xml中的最大副本数量</span></div>
</li>
<li class="li1">
<div class="de1">   </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">        <span class="co1">//将存有副本的节点也一同取出，就是最初&quot;邻居&quot;节点往后的若干个节点，具体若干几个是在storage-conf.xml的</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//&lt;ReplicationFactor&gt;标签中定义的</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = startIndex, count = <span class="nu0">1</span>; count &lt; totalNodes &amp;amp;&amp;amp; foundCount &lt; replicas_; ++count, i = <span class="br0">&#40;</span>i<span class="nu0">+1</span><span class="br0">&#41;</span>%totalNodes<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="kw1">if</span><span class="br0">&#40;</span> ! list.<span class="me1">contains</span><span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">get</span><span class="br0">&#40;</span>tokens.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">                list.<span class="me1">add</span><span class="br0">&#40;</span>tokenToEndPointMap.<span class="me1">get</span><span class="br0">&#40;</span>tokens.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">                foundCount++;</div>
</li>
<li class="li1">
<div class="de1">            <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">        <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">        <span class="co1">//统一下节点监听端口的信息</span></div>
</li>
<li class="li1">
<div class="de1">        retrofitPorts<span class="br0">&#40;</span>list<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">        <span class="kw2">return</span> list.<span class="me1">toArray</span><span class="br0">&#40;</span><span class="kw2">new</span> EndPoint<span class="br0">&#91;</span>list.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">    <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/14/4446665.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/14/4446665.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/680/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cassandra 学习笔记(2)</title>
		<link>http://www.javagg.com/archives/678</link>
		<comments>http://www.javagg.com/archives/678#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:53:23 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=678</guid>
		<description><![CDATA[源码中对节点的如下称呼应该是等价的: end point , node ,  machine , datacenter , host。
    cassandra节点的启动main()在类org.apache.cassandra.service.CassandraDaemon中，细节在 setup()中。过程中会start一个CassandraServer的实例peerStorageServer。 peerStorageServer在建立的时候，内部会实例化一个 StorageService实例，在该StorageService实例初始化的过程中，该节点的所有功能服务会被配置激活，这些操作是在 StorageService的默认构造器中完成的。
    StorageService的构造器中大致做了如下几件事情：
    1)生成一个storageLoadBalancer_s实例负责负载均衡，现在还没有明白原理。
    2)生成一个endPointSnitch_实例，这个提供了对两个end_point进行比较的一个途径，基本上是判断两个end_point是不是同一个ip等
    3)启动了MessagingService，并且注册了一些handler实例。MessagingService是负责该end_point与其他end_point进行通信的。两个节点间通信的内容被封装在一个Message的实例里面。
       比如，如果节点A想向节点B获得一定的数据，那么A需要通过自己的MessageService向节点B发送一个Message实例，这个实例里面包含了如下信息：这个请求的类型（属于什么stage） ，这个请求要调用的B的哪个handler来处理，以及这个请求的其他具体内容。当节点B接收到节点A发送过来的Message实例后，会将根据这个 Message实例内部指定的handler信息,将该实例转发相应的handler去处理。当然这样做的前提是这个指定的handler已经在B节点注册了，而这个注册过程就是在StorageService启动的时候完成的。
    4)consistencyManager_：还没明白什么意思。
    5)StageManager的配置：
       这个stage的概念来自于“SEDA“( staged event driven architecture)中的&#8221;S&#8221;,参考http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf。
       大致意思好像是可以将一个工作流程分为若干个阶段(stage)，然后给各个stage动态的分配线程资源来处理stage内定义的逻辑。stage和 stage之间的通信是通过任务队列完成的，当一个stage的逻辑执行完后，如果需要调用下一个stage来继续执行，那么就往下一个stage保有的任务队列中写入必要的任务信息。
       这样的SEDA结构的好处是：在实际的运行当中各个stage的忙闲程度是不一样的，可以通过将比较闲的stage上的线程资源分配给同期比较忙的stage来实现效率上的提高。
       在cassandra中，还是以3)中例子说明，在A节点发往B节点的Message实例中有一个“这个请求的类型”的信息，这个信息保存在 Message实例内header实例的type_上，是一个字符串。这个字符串标明了当MessageService获取了Message实例后究竟由那个 stage来负责执行指定的handler对象。因为handler对象只是定义了对Message的处理逻辑，所以需要stage里面的线程来对其进行执行。
       当前的stage只有4种，依次在StroageService的 /* All stage identifiers */标注下被定义，分别负责不同的任务，“ROW-READ-STAGE”是负责读取的，其他的含义还没有完全搞清楚，大概是负责修改，数据压缩和 http后台页面信息接收的。
       StageManager部分的源码还没哟看到，可能是负责各个stage间线程调度的吧。
    6)设置nodepicker_定义了当前节点对周围节点的查询策略，具体的还不清楚
转：http://blog.csdn.net/pakly_9527/archive/2009/08/13/4441540.aspx
]]></description>
			<content:encoded><![CDATA[<p>源码中对节点的如下称呼应该是等价的: end point , node ,  machine , datacenter , host。</p>
<p>    cassandra节点的启动main()在类org.apache.cassandra.service.CassandraDaemon中，细节在 setup()中。过程中会start一个CassandraServer的实例peerStorageServer。 peerStorageServer在建立的时候，内部会实例化一个 StorageService实例，在该StorageService实例初始化的过程中，该节点的所有功能服务会被配置激活，这些操作是在 StorageService的默认构造器中完成的。<span id="more-678"></span></p>
<p>    StorageService的构造器中大致做了如下几件事情：</p>
<p>    1)生成一个storageLoadBalancer_s实例负责负载均衡，现在还没有明白原理。</p>
<p>    2)生成一个endPointSnitch_实例，这个提供了对两个end_point进行比较的一个途径，基本上是判断两个end_point是不是同一个ip等</p>
<p>    3)启动了MessagingService，并且注册了一些handler实例。MessagingService是负责该end_point与其他end_point进行通信的。两个节点间通信的内容被封装在一个Message的实例里面。</p>
<p>       比如，如果节点A想向节点B获得一定的数据，那么A需要通过自己的MessageService向节点B发送一个Message实例，这个实例里面包含了如下信息：这个请求的类型（属于什么stage） ，这个请求要调用的B的哪个handler来处理，以及这个请求的其他具体内容。当节点B接收到节点A发送过来的Message实例后，会将根据这个 Message实例内部指定的handler信息,将该实例转发相应的handler去处理。当然这样做的前提是这个指定的handler已经在B节点注册了，而这个注册过程就是在StorageService启动的时候完成的。</p>
<p>    4)consistencyManager_：还没明白什么意思。</p>
<p>    5)StageManager的配置：</p>
<p>       这个stage的概念来自于“SEDA“( staged event driven architecture)中的&#8221;S&#8221;,参考<a href="http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf">http://www.eecs.harvard.edu/~mdw/papers/seda-sosp01.pdf</a>。</p>
<p>       大致意思好像是可以将一个工作流程分为若干个阶段(stage)，然后给各个stage动态的分配线程资源来处理stage内定义的逻辑。stage和 stage之间的通信是通过任务队列完成的，当一个stage的逻辑执行完后，如果需要调用下一个stage来继续执行，那么就往下一个stage保有的任务队列中写入必要的任务信息。</p>
<p>       这样的SEDA结构的好处是：在实际的运行当中各个stage的忙闲程度是不一样的，可以通过将比较闲的stage上的线程资源分配给同期比较忙的stage来实现效率上的提高。</p>
<p>       在cassandra中，还是以3)中例子说明，在A节点发往B节点的Message实例中有一个“这个请求的类型”的信息，这个信息保存在 Message实例内header实例的type_上，是一个字符串。这个字符串标明了当MessageService获取了Message实例后究竟由那个 stage来负责执行指定的handler对象。因为handler对象只是定义了对Message的处理逻辑，所以需要stage里面的线程来对其进行执行。</p>
<p>       当前的stage只有4种，依次在StroageService的 /* All stage identifiers */标注下被定义，分别负责不同的任务，“ROW-READ-STAGE”是负责读取的，其他的含义还没有完全搞清楚，大概是负责修改，数据压缩和 http后台页面信息接收的。</p>
<p>       StageManager部分的源码还没哟看到，可能是负责各个stage间线程调度的吧。</p>
<p>    6)设置nodepicker_定义了当前节点对周围节点的查询策略，具体的还不清楚</p>
<p>转：<a href="http://blog.csdn.net/pakly_9527/archive/2009/08/13/4441540.aspx">http://blog.csdn.net/pakly_9527/archive/2009/08/13/4441540.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/678/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Digg用NoSQL替代MySQL</title>
		<link>http://www.javagg.com/archives/668</link>
		<comments>http://www.javagg.com/archives/668#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:20:21 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.javagg.com/?p=668</guid>
		<description><![CDATA[
继 Twitter和Facebook之后,社交新闻网站Digg决定跟 MySQL说再见，并替换掉它的大部分基础设施组成，Digg将从LAMP（Linux、 Apache、MySQL和Perl/PHP/Python）架构迁移到基于Cassandra的NoSQL架构。
Apache Cassandra是一套开源分布式数据库管理系统，最初由Facebook开发，用于储存特别大的数据。Cassandra是一个混合型的非关系的数据 库，主要特点是它不是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对Cassandra的一个写操作，会被复制到其它节点上，对 Cassandra的读操作，也会被路由到某个节点上面去读取。
Casandra的使用者现在包括了Rackspace、Digg、Facebook、Twitter、Cisco、Mahalo、Ooyala等等。
开源中国社区为您准备了多款 NoSQL 开源软件，详情请看这里。
本文转自oschina.net     


]]></description>
			<content:encoded><![CDATA[<div>
<p><a href="http://www.oschina.net/news/7440/twitter-users-jump-and-plan-to-give-up-mysql">继 Twitter</a>和Facebook之后,社交新闻网站Digg决定跟 <a href="http://www.oschina.net/p/mysql">MySQL</a>说再见，并替换掉它的大部分基础设施组成，Digg将从LAMP（Linux、 Apache、MySQL和Perl/PHP/Python）架构迁移到基于Cassandra的NoSQL架构。<span id="more-668"></span></p>
<p><a href="http://www.oschina.net/p/cassandra">Apache Cassandra</a>是一套开源分布式数据库管理系统，最初由Facebook开发，用于储存特别大的数据。Cassandra是一个混合型的非关系的数据 库，主要特点是它不是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对Cassandra的一个写操作，会被复制到其它节点上，对 Cassandra的读操作，也会被路由到某个节点上面去读取。</p>
<p>Casandra的使用者现在包括了Rackspace、Digg、Facebook、Twitter、Cisco、Mahalo、Ooyala等等。</p>
<p>开源中国社区为您准备了多款 NoSQL 开源软件，详情请看<a href="http://www.oschina.net/project/tag/235/nosql">这里</a>。</p>
<p>本文转自oschina.net    <a href="http://www.oschina.net/"><img title="开源中国社区 (http://www.oschina.net)" src="http://www.oschina.net/img/logo.gif" alt="开源中国社区" /></a> </p>
</div>
<p><!-- google_ad_section_end --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/668/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>黑色星期五!!  mysql 数据损坏了~~</title>
		<link>http://www.javagg.com/archives/565</link>
		<comments>http://www.javagg.com/archives/565#comments</comments>
		<pubDate>Sat, 06 Mar 2010 16:10:14 +0000</pubDate>
		<dc:creator>纯净水</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">eric_DIARY_105879052</guid>
		<description><![CDATA[3月5日，真是黑色星期五~~~公司的那台sun v440不知为何突然连不上。
马上打电话给朋友，叫他一起去机房一次
到了后用contorl线连接终端一看，居然关机了~~日呀
打命令重开服务器，顺利~~~
接下来启动mysql。。。结果提示错误，启动失败~~
再次重启mysql终于可以启动了，本想应解决了
用软件连接看看，晕，进不了公司的数据库，只可以进mysql和infoxxxx-sxxx这二个数据库，其它的都进不了
当时脸都绿了~~~~~估计是服务器断电，导致数据库文件损坏了
重启了二次也不行，上网找了好久也没有明确的答案，而且不感乱动现在这样坏数据，因为我们是用innodb的，数据都在ibdata1这个文件中，有3.5g呢，后来让朋友再上网找找办法。
我就把ibdata1这个文件下载下来，先备份一个。
我灵光一闪，想放到我本地的mysql上，把本地的文件换了，看看如何。
开始干！！！！！！！！
建文一个新库，把除了mysql文件夹以外的所有文件删除了
再把原来数据库中的ibdata1文件和对应的数据库文件夹copy到mysql的库目录中
再启动mysql。
接下来打开mysql客户端，神奇的事来了，数据都回来了~~~呵呵
马上在服务器上再做一次。。。不行~~还是打不开，怪了，难道linux和windows的不太一样的么。
最后就把本机备份了一把，再恢复到服务器上。。。
解决了！！！！
ps:这个还没有验证数据有没有损失。。因为也无法验证了。。
后来发现，原因是mysql的infoxxx_scxxxx数据库中的tables表，中的对应DB的表的记录数据坏了，有些记录没有了.
]]></description>
			<content:encoded><![CDATA[<p>3月5日，真是黑色星期五~~~公司的那台sun v440不知为何突然连不上。</p>
<p>马上打电话给朋友，叫他一起去机房一次</p>
<p>到了后用contorl线连接终端一看，居然关机了~~日呀</p>
<p>打命令重开服务器，顺利~~~</p>
<p>接下来启动mysql。。。结果提示错误，启动失败~~<span id="more-565"></span></p>
<p>再次重启mysql终于可以启动了，本想应解决了</p>
<p>用软件连接看看，晕，进不了公司的数据库，只可以进mysql和infoxxxx-sxxx这二个数据库，其它的都进不了</p>
<p>当时脸都绿了~~~~~估计是服务器断电，导致数据库文件损坏了</p>
<p>重启了二次也不行，上网找了好久也没有明确的答案，而且不感乱动现在这样坏数据，因为我们是用innodb的，数据都在ibdata1这个文件中，有3.5g呢，后来让朋友再上网找找办法。</p>
<p>我就把ibdata1这个文件下载下来，先备份一个。</p>
<p>我灵光一闪，想放到我本地的mysql上，把本地的文件换了，看看如何。</p>
<p>开始干！！！！！！！！</p>
<p>建文一个新库，把除了mysql文件夹以外的所有文件删除了</p>
<p>再把原来数据库中的ibdata1文件和对应的数据库文件夹copy到mysql的库目录中</p>
<p>再启动mysql。</p>
<p>接下来打开mysql客户端，神奇的事来了，数据都回来了~~~呵呵</p>
<p>马上在服务器上再做一次。。。不行~~还是打不开，怪了，难道linux和windows的不太一样的么。</p>
<p>最后就把本机备份了一把，再恢复到服务器上。。。</p>
<p>解决了！！！！</p>
<p>ps:这个还没有验证数据有没有损失。。因为也无法验证了。。</p>
<p>后来发现，原因是mysql的infoxxx_scxxxx数据库中的tables表，中的对应DB的表的记录数据坏了，有些记录没有了.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javagg.com/archives/565/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

