<?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>Oracle Berkeley DB 中国研发团队的博客 &#187; Haomian Wang</title>
	<atom:link href="http://www.bdbchina.com/category/haomian-wang/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Thu, 15 Dec 2011 10:35:52 +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>Oracle Berkeley DB 产品家族介绍</title>
		<link>http://www.bdbchina.com/2010/09/oracle-berkeley-db-%e4%ba%a7%e5%93%81%e5%ae%b6%e6%97%8f%e4%bb%8b%e7%bb%8d/</link>
		<comments>http://www.bdbchina.com/2010/09/oracle-berkeley-db-%e4%ba%a7%e5%93%81%e5%ae%b6%e6%97%8f%e4%bb%8b%e7%bb%8d/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 05:45:49 +0000</pubDate>
		<dc:creator>haomianwang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[JE]]></category>
		<category><![CDATA[Mobile Sync Server]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1336</guid>
		<description><![CDATA[Oracle Berkeley DB最先由加州大学伯克利分校为了移除受到AT&#38;T限制的dbm代码，而从BSD 4.3到4.4时所改写的。经过将近二十年的衍化，目前Oracle Berkeley DB家族已经发展到包含4个独立产品线 &#8211; Berkeley DB、Berkeley DB Java 版、Berkeley DB XML和Mobile Server，被应用到行行业业，在全球有超过2亿的部署。
本文将分别介绍Oracle Berkeley DB四大产品线的特点以及应用，希望能对中国市场的新老用户有所启发和帮助。

1. Oracle Berkeley DB数据库产品系列
（图一）
Oracle Berkeley DB 产品家族目前有三大数据库产品，分别是：Berkeley DB，Berkeley DB XML 和 Berkeley DB Java Edition。它们的关系和系统架构可以参照图一。下面我将分别进行介绍。
1.1 Berkeley DB
Berkeley DB 也称 Core（下文都以此简称），是Berkeley DB家族第一个发布的产品。Core的核心代码全部由C语言写成，同时提供其他多种语言的应用程序接口（包括 C++, C#,  Java, Perl, Python, PHP, Tcl, Ruby等等）。Core有以下一些特点（请大家注意，下面列举的大部分特点其实是Berkeley DB家族所有产品的共同特点）：

基于Key/Value的存储：对于Core以及Berkeley DB其他产品来说，用户可以任意定义所存储数据的键（key）以及对应的值（value），这样的数据存储方式具有很好的灵活性和多样性。也是由于这个特点，Berkeley DB产品家族被业界归为非关系型（non-relational）数据库。
嵌入式数据管理：这里的嵌入式跟大家平时提到的嵌入式有点不一样。这里的嵌入式的意思是指，Core是作为库（library）的形式直接嵌入到用户的应用程序当中，和用户程序运行到同一地址空间，用户选择适当的API进行编程调用。这样“嵌入式”的最大好处就是不需要人为进行管理（即不需要专门的DBA），并可以大大提高程序开发的周期，和降低程序后期的维护成本。
体积(footprint)小：由于Core是直接嵌入应用程序当中，所以产品的体积必须越小越好。目前，Core的体积只有1M左右，这意味着，即使对于移动设备（如手机）来说，Core也可以十分轻松嵌入到你的程序中。
几乎具备数据库的所有功能和特性：对于这么小体积的数据库，你也许会问，Core会不会丧失很多数据库的特性呢。恰恰相反，在保持小体积的优势下，Berkeley DB几乎具备数据库的所有特性，包括：ACID，事务性（transaction），错误恢复（failure recover），高并发性（high concurrency）等等。
高可用性（high availability，简称HA)：高可用性一方面可以提高数据读取性能，另一方面是具备自动错误恢复（automatic failover）功能，使数据存储更加安全可靠。
高性能：Core拥有极高的数据存取性能，并且用户可以根据机器的配置进行调优。具体性能测试可以参考文档  Oracle [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle Berkeley DB最先由加州大学伯克利分校为了移除受到AT&amp;T限制的dbm代码，而从BSD 4.3到4.4时所改写的。经过将近二十年的衍化，目前Oracle Berkeley DB家族已经发展到包含4个独立产品线 &#8211; Berkeley DB、Berkeley DB Java 版、Berkeley DB XML和Mobile Server，被应用到行行业业，在全球有超过2亿的部署。</p>
<p>本文将分别介绍Oracle Berkeley DB四大产品线的特点以及应用，希望能对中国市场的新老用户有所启发和帮助。</p>
<p><span id="more-1336"></span></p>
<h1>1. Oracle Berkeley DB数据库产品系列</h1>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/09/bdb11gr21.png"><img class="aligncenter size-full wp-image-1416" style="margin-top: 10px; margin-bottom: 10px;" title="bdb11gr2" src="http://www.bdbchina.com/wp-content/uploads/2010/09/bdb11gr21.png" alt="" width="595" height="304" /></a>（图一）</p>
<p>Oracle Berkeley DB 产品家族目前有三大数据库产品，分别是：Berkeley DB，Berkeley DB XML 和 Berkeley DB Java Edition。它们的关系和系统架构可以参照<strong>图一</strong>。下面我将分别进行介绍。</p>
<h2><strong>1.1 Berkeley DB</strong></h2>
<p>Berkeley DB 也称 Core（下文都以此简称），是Berkeley DB家族第一个发布的产品。Core的核心代码全部由C语言写成，同时提供其他多种语言的应用程序接口（包括 C++, C#,  Java, Perl, Python, PHP, Tcl, Ruby等等）。Core有以下一些特点（请大家注意，下面列举的大部分特点其实是Berkeley DB家族所有产品的共同特点）：</p>
<ul>
<li><strong>基于Key/Value的存储</strong>：对于Core以及Berkeley DB其他产品来说，用户可以任意定义所存储数据的键（key）以及对应的值（value），这样的数据存储方式具有很好的灵活性和多样性。也是由于这个特点，Berkeley DB产品家族被业界归为非关系型（non-relational）数据库。</li>
<li><strong>嵌入式数据管理：</strong>这里的嵌入式跟大家平时提到的嵌入式有点不一样。这里的嵌入式的意思是指，Core是作为库（library）的形式直接嵌入到用户的应用程序当中，和用户程序运行到同一地址空间，用户选择适当的API进行编程调用。这样“嵌入式”的最大好处就是不需要人为进行管理（即不需要专门的DBA），并可以大大提高程序开发的周期，和降低程序后期的维护成本。</li>
<li><strong>体积(footprint)小：</strong>由于Core是直接嵌入应用程序当中，所以产品的体积必须越小越好。目前，Core的体积只有1M左右，这意味着，即使对于移动设备（如手机）来说，Core也可以十分轻松嵌入到你的程序中。</li>
<li><strong>几乎具备数据库的所有功能和特性：</strong>对于这么小体积的数据库，你也许会问，Core会不会丧失很多数据库的特性呢。恰恰相反，在保持小体积的优势下，Berkeley DB几乎具备数据库的所有特性，包括：ACID，事务性（transaction），错误恢复（failure recover），高并发性（high concurrency）等等。</li>
<li><strong>高可用性（high availability，简称HA)：</strong>高可用性一方面可以提高数据读取性能，另一方面是具备自动错误恢复（automatic failover）功能，使数据存储更加安全可靠。</li>
<li><strong>高性能：</strong>Core拥有极高的数据存取性能，并且用户可以根据机器的配置进行调优。具体性能测试可以参考文档 <a href="http://www.oracle.com/technology/products/berkeley-db/pdf/berkeley-db-perf.pdf" target="_blank"> Oracle Berkeley DB:Performance Metrics and Benchmarks</a>。</li>
</ul>
<p>尤其需要指出的是：最新版本的Oracle Berkeley DB（11gR2）的一个引人瞩目的特性就是我们引入了对SQL 92标准的支持（见图一红色圆圈部分）。Oracle Berkeley DB SQL接口完全兼容SQLite原有的编程接口， 从而以往运行在SQLite上的程序和应用都可以无缝的、方便的迁移到Oracle Berkeley DB这个更加强大的存储引擎。并且，Oracle Berkeley DB和SQLite还将进行长期的官方层面的合作，保证了Oracle Berkeley DB的SQL接口和SQLite保持一致，免除了用户的后顾之忧。此外，Berkeley DB SQL接口完美支持很多第三方的SQLite工具，如JDBC，ODBC，FireFox 3及其SQLite Manager 插件等。更多有关DBSQL的技术细节，可以参考本站另外一篇博客《<a href="http://www.bdbchina.com/2010/03/oracle-berkeley-db-%e6%94%af%e6%8c%81sql%e5%95%a6%ef%bc%81/" target="_blank">Oracle Berkeley DB 支持SQL啦</a>》。</p>
<p>也许有人会问：何时该选用BDB的Key/Value的选项，何时该选用BDB的SQL接口呢？</p>
<ul>
<li>简单的来理解，BDB的Key/Value的选项是一个本地持久化的“HashTable”，可以存取任何数据类型（声音、视频、图像、Java对象等），通过简单的put/get/delete接口来操作。简单的数据访问方式、不需要太多复杂的统计和分析计算的场合都可以使用。比如，微博客的底层数据管理；如果再和hadoop集成后，还可以做一些复杂的分析功能。</li>
</ul>
<ul>
<li>当使用场合需要轻量级的数据库、有SQL支持、要求高性能和高并发；或者需要和企业端的Oracle 数据库（如Oracle 11g）进行双向的数据同步时，建议可选用Oracle Berkeley DB的SQL接口。举例来说，手持设备/平台上（如Android，Windows Mobile、iPhone等）。</li>
</ul>
<p>更多关于Core的信息，可以参考下面相关链接：</p>
<ul>
<li><a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html" target="_blank">Core下载</a></li>
<li><a href="http://www.oracle.com/technology/documentation/berkeley-db/db/index.html" target="_blank">Core相关文档</a></li>
<li><a href="http://www.oracle.com/technology/products/berkeley-db/faq/db_faq.html" target="_blank">Core FAQ</a> （可以在此找到常见问题答案）</li>
<li><a href="http://forums.oracle.com/forums/forum.jspa?forumID=271" target="_blank">Core官方论坛</a> （在此论坛提出技术问题，会得到Berkeley DB组资深工程师的回答，当然，提问必须是英文。）</li>
<li><a href="http://forums.oracle.com/forums/forum.jspa?forumID=272" target="_blank">Core HA官方论坛</a></li>
</ul>
<h2><strong>1.2 Berkeley DB XML</strong></h2>
<p>Berkeley DB XML是基于Core数据存取之上，专门用于存取XML文档的数据库（如图一所示），简而言之，Berkeley DB XML以Core作为存储引擎，在此基础上建立对XML文档进行管理、索引和查询优化模块，并提供相应的XML 标准的API。因为Berkeley DB XML建立在Core之上，所以除了具备Core的大部分特点之外，还有以下针对XML文档的一些特点：</p>
<ul>
<li><strong>支持XQuery 1.0 and XPath 2.0。</strong></li>
<li><strong>十分灵活的索引功能：</strong>Berkeley DB XML支持节点（node），element（元素），attribute（属性）和元数据（meta-data）索引。这样灵活的索引可以极大提高查找性能，特别是针对存取较大的XML文件。</li>
<li><strong>支持对XML文档的修改</strong></li>
</ul>
<p>更多关于Berkeley DB XML的信息，可以参考下面相关链接：</p>
<ul>
<li><a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html" target="_blank">Berkeley DB XML下载</a></li>
<li><a href="http://www.oracle.com/technology/documentation/berkeley-db/xml/index.html" target="_blank">Berkeley DB XML相关文档</a></li>
<li><a href="http://www.oracle.com/technetwork/database/berkeleydb/xml-faq-088319.html" target="_blank">Berkeley DB XML FAQ</a></li>
<li><a href="http://forums.oracle.com/forums/forum.jspa?forumID=274" target="_blank">Berkeley DB XML官方论坛</a></li>
</ul>
<h2><strong>1.3 Berkeley DB Java Edition</strong></h2>
<p>Berkeley DB Java Edition（以下简称JE）是Berkeley DB产品家族另外一个独立的产品，也就是说，它并不像BDB XML一样基于BDB Core。JE 除了具备上述 Core 的特点（K/V存储、体积小、性能高以及高可用性（HA）等等）之外，还有以下特色：</p>
<ul>
<li><strong>纯java，简单易用：</strong>JE 是纯java语言编写的，意味着JE可以无缝运行于任何java环境。用户只需要在应用程序中包含JE的jar文件，便可调用JE的API进行编程，无需任何额外配置工作。</li>
<li><strong>更高的并发性，更高的性能：</strong>相对于Core，由于JE提供基于“记录”级别（record level，一条记录由Key和Value组成）的锁，所以JE拥有更高的并发性以及更高的读写性能。关于JE的性能测试，可以参考文档：
<ul>
<li><a href="http://www.oracle.com/technetwork/database/berkeleydb/je-derby-performance-130289.pdf" target="_blank">Oracle Berkeley DB Java Edition vs. Apache Derby: A Performance Comparison</a></li>
<li><a href="http://www.oracle.com/technetwork/database/berkeleydb/bdb-je-highavailability-whitepaper--129298.pdf" target="_blank">Oracle Berkeley DB Java Edition High Availability -Large Configuration and Scalability Testing</a></li>
</ul>
</li>
<li><strong>Java对象存储：</strong>JE 利用直接持久层（Direct Persistence Layer，DPL) 可以十分方便、灵活、快速存取用户定义的任意java对象。可参考文档<a href="http://www.oracle.com/technetwork/cn/database/berkeley-db/bdb-je-persistence-api-basics-133242-zhs.pdf?ssSourceSiteId=otnen" target="_blank">Direct Persistence Layer for Berkeley DB Java Edition</a>。</li>
<li><strong>适用于J2EE：</strong>JE 提供对Java Transaction API (JTA), J2EE Connector Architecture (JCA) 和 Java Management Extensions (JMX)的支持。</li>
</ul>
<p>更多关于JE的信息，可以参考下面相关链接：</p>
<ul>
<li><a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html" target="_blank">JE下载</a></li>
<li><a href="http://www.oracle.com/technology/documentation/berkeley-db/je/index.html" target="_blank">JE相关文档</a></li>
<li><a href="http://www.oracle.com/technology/products/berkeley-db/faq/je_faq.html" target="_blank">JE FAQ</a></li>
<li><a href="http://forums.oracle.com/forums/forum.jspa?forumID=273" target="_blank">JE官方论坛</a></li>
</ul>
<h2><strong>1.4 应用举例</strong></h2>
<p>概括而言，你需要一个数据存取的产品，并要满足：</p>
<ul>
<li>性能要求高，相应时间短、占用资源少的场合</li>
<li>方便管理，不需要DBA</li>
<li>数据访问方式是简单的，任何类型的数据</li>
<li>运行于普通硬件平台，随着业务增长可以水平扩展</li>
<li>高可用集群和容错备份</li>
</ul>
<p>可能的应用场景包括：</p>
<ul>
<li>搜索及内容管理</li>
<li>缓存及日志模块</li>
<li>SOA及Web Service的相关模块</li>
<li>资源、系统或者仪器管理</li>
<li>存储设备</li>
<li>网关、网络设备、网络计费系统等</li>
<li>消息队列、工作流等系统</li>
<li>授权及身份管理</li>
<li>仪器、终端和手持设备</li>
</ul>
<p>举例而言：</p>
<ol>
<li>某全球知名电子商务公司，选择Core作为中间层的静态数据缓存。当用户浏览产品页面的时候，所有的产品信息、价格、用户评价等等数据都是先从Core进行读取。这样可以大大提高页面的显示时间，从而增进用户购物体验。同时还利用Core来管理购物车和交易结算等。</li>
<li>某全球著名互联网公司，利用Core HA存取数亿用户的账户信息。Core HA的高性能、高并发性和高可用性满足了此互联网公司对用户登录功能的苛刻要求，包括极短的登录请求响应时间，24×7的无间断服务，高达十亿级别的扩展性，以及极高的可靠性。</li>
<li>比如某知名手机公司推出的智能手机选择Berkeley DB SQL作为其底层数据库。某知名POS机厂商也选择 Berkeley DB SQL接口作为新推出的某款POS机的存储引擎。</li>
<li>某全球连锁酒店选择Berkeley DB XML来实现在线预定和销售系统。</li>
<li>某大型跨国企业选择Berkeley DB XML里进行资产和仪器管理。</li>
<li>很多全球型的金融公司的交易系统和底层基础架构的数据存取模块中选择Berkeley DB及Berkeley DB JE。</li>
<li>军方的战场实施动态监控系统选择Berkeley DB JE。</li>
<li>若干全球知名的社交网站中选择Berkeley DB JE构建上千个节点的云计算方案。</li>
<li>某全球知名的网络服务商的视频点播、短信/邮件、视频电话等系统中。</li>
</ol>
<h1>2. Oracle Berkeley DB 11gR2 + Mobile Server</h1>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/07/BDB_MobileServer.png"><img class="aligncenter size-full wp-image-1340" style="margin-top: 10px; margin-bottom: 10px;" title="BDB_MobileServer" src="http://www.bdbchina.com/wp-content/uploads/2010/07/BDB_MobileServer.png" alt="" width="561" height="331" /></a>（图二）</p>
<p style="text-align: left;">Oracle Berkeley DB 11gR2 + Mobile Server 可以提供移动数据同步解决方案。Oracle Mobile Sync Server（以下简称为Mobile Server）是一个提供企业级移动解决方案的中间层（middle-tier infrastructure）。它的一端连接的是客户端数据库，另外一端连接的是Oracle数据库。Mobile Server主要提供以下功能：</p>
<ol>
<li>应用程序统一部署和配置。比如，应用Mobile Server方案的移动设备都可以自动实现软件的安装、更新和打补丁等等配置，这一过程不需要用户的过多参与。</li>
<li>移动设备统一管理。管理员可以远程收集众多移动设备的信息，同时也可以进行统一的操作与部署。比如，管理员可以远程向丢失的移动设备进行额外加密或者销毁设备中的数据。</li>
<li>移动设备与Oracle数据库的数据双向同步。与Oracle数据库的同步功能可以保持移动设备的完整性和及时性，并且不要求移动设备时刻与Oracle数据库保持连接。</li>
</ol>
<p>在Oracle Berkeley DB 11gR2之前，Mobile Server支持的客户端数据库是Oracle Database Lite Client。往后Oracle Berkeley DB 11gR2 会是Mobile Server客户端数据库的推荐选择，而原来的Oracle Database Lite Client将停止新功能开发。因为Berkeley DB 11gR2安装更加简单，性能更加优越，并且体积更小。Berkeley DB 11gR2 + Mobile Server的总体架构图如<strong>图二</strong>所示。</p>
<p>Oracle Mobile Server 的应用举例：</p>
<ol>
<li>某国的海岸卫队的舰船上的数据同步和设备管理。</li>
<li>某大型的博彩机构的手机订单系统。</li>
<li>某国海关的缉私等设备上。</li>
<li>某大型快速消费品公司的自动售货机上。</li>
</ol>
<p>更多关于Oracle Mobile Sync Server的信息，可以参考下面相关链接：</p>
<ul>
<li><a href="http://www.oracle.com/technetwork/database/database-lite/overview/index.html" target="_blank">Oracle Database Lite 10g</a></li>
<li><a href="http://www.oracle.com/technetwork/database/database-lite/lite-mobile-server-083863.html" target="_blank">Oracle Database Lite Mobile Server 10g</a></li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 1562px; width: 1px; height: 1px; overflow: hidden;">- 性能要求高，资源少的场合 （如任务密集型的应用，像工作流、规则引擎、队<br />
列、SOA事件管理和监控、网站缓存等）<br />
- 方便管理，不需要dba （如仪器、设备，像手机，汽车、医疗设备等）<br />
- 数据管理/访问方式是简单的，面向对象的 （如Twitter， facebook等，只需要<br />
简单、高效的插入和删除操作；不需要很多复杂的分析和统计功能）<br />
- 运行于普通硬件平台，随着业务增长可以水平扩展的 (如云计算、金融系统等）</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/09/oracle-berkeley-db-%e4%ba%a7%e5%93%81%e5%ae%b6%e6%97%8f%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>BDB Java Edition + prefuse, 轻松实现数据可视化</title>
		<link>http://www.bdbchina.com/2010/03/bdb-java-edition-prefuse-%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0%e6%95%b0%e6%8d%ae%e5%8f%af%e8%a7%86%e5%8c%96/</link>
		<comments>http://www.bdbchina.com/2010/03/bdb-java-edition-prefuse-%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0%e6%95%b0%e6%8d%ae%e5%8f%af%e8%a7%86%e5%8c%96/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 11:04:39 +0000</pubDate>
		<dc:creator>haomianwang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=784</guid>
		<description><![CDATA[数据可视化概述
这些年来，随着大量数据的产生，数据可视化（data visualization）广泛应用于科研、军事、金融、医疗等等领域。我们的生活也到处可见数据可视化的例子。比如，股票软件上显示的K线图，调查结果的柱状图、曲线图，人口分布的密度图等等等等。
那么，什么是数据可视化呢？根据维基百科的解释：Data visualization is the study of the visual representation of data, meaning &#8220;information which has been abstracted in some schematic form, including attributes or variables for the units of information&#8221;。简单来说，数据可视化就是用更加直观更加生动易懂的图形图像表现某种特定的数据集合。
这篇文章将简单介绍如何轻松利用BDB Java Edition （JE）和prefuse实现自己的数据可视化应用。
可视化工具和数据库的选择
首先我们选择prefuse作为数据可视化工具。prefuse是一个轻量级的用于可视化任意数据集（visualize the data）的java类库，它提供了多种数据可视化模式，比如柱状图、树图、饼图等等。它的优点是简单易用、可视化功能齐全。
但仅仅有可视化工具是不够的，还需要什么呢？当然还必须有存储数据的数据库。可以打个比方，数据是一栋房子，数据可视化就是我们要给房子做装修，让它更好看，那么数据库就是地基。没有地基，何来房子，更不用说装修了。那么，我们选择什么样的数据库呢。既然prefuse是java类库，而我们JE的特点是纯Java实现，性能高，footprint小等等，那么，JE绝对是一个很好的选择。
好了，现在就让我们看看JE + prefuse的威力吧。
数据集属性的定义
首先，我们选择需要做可视化的数据集。在这里，我给出的例子是可视化某个公司的员工数据，包括他们的基本属性，上下级关系和各自所参与的任务。
1. 员工（Employee）的属性
@Entity
public class Employee {
    @PrimaryKey
    int employeeId;

    @SecondaryKey(relate [...]]]></description>
			<content:encoded><![CDATA[<h2>数据可视化概述</h2>
<p>这些年来，随着大量数据的产生，数据可视化（data visualization）广泛应用于科研、军事、金融、医疗等等领域。我们的生活也到处可见数据可视化的例子。比如，股票软件上显示的K线图，调查结果的柱状图、曲线图，人口分布的密度图等等等等。</p>
<p>那么，什么是数据可视化呢？根据维基百科的解释：<strong>Data visualization</strong> is the study of the visual representation of data, meaning &#8220;information which has been abstracted in some schematic form, including attributes or variables for the units of information&#8221;。简单来说，数据可视化就是用更加直观更加生动易懂的图形图像表现某种特定的数据集合。</p>
<p>这篇文章将简单介绍如何轻松利用BDB Java Edition （JE）和<a href="http://prefuse.org/">prefuse</a>实现自己的数据可视化应用。</p>
<h2>可视化工具和数据库的选择</h2>
<p>首先我们选择prefuse作为数据可视化工具。prefuse是一个轻量级的用于可视化任意数据集（visualize the data）的java类库，它提供了多种数据可视化模式，比如柱状图、树图、饼图等等。它的优点是简单易用、可视化功能齐全。</p>
<p>但仅仅有可视化工具是不够的，还需要什么呢？当然还必须有存储数据的数据库。可以打个比方，数据是一栋房子，数据可视化就是我们要给房子做装修，让它更好看，那么数据库就是地基。没有地基，何来房子，更不用说装修了。那么，我们选择什么样的数据库呢。既然prefuse是java类库，而我们JE的特点是纯Java实现，性能高，footprint小等等，那么，JE绝对是一个很好的选择。</p>
<p>好了，现在就让我们看看JE + prefuse的威力吧。<span id="more-784"></span></p>
<h2>数据集属性的定义</h2>
<p>首先，我们选择需要做可视化的数据集。在这里，我给出的例子是可视化某个公司的员工数据，包括他们的基本属性，上下级关系和各自所参与的任务。</p>
<p><strong>1. 员工（Employee）的属性</strong></p>
<pre class="java:nogutter">@Entity
public class Employee {
    @PrimaryKey
    int employeeId;

    @SecondaryKey(relate = MANY_TO_ONE)
    String employeeName;

    @SecondaryKey(relate = MANY_TO_ONE)
    float salary;

    @SecondaryKey(relate = MANY_TO_ONE, relatedEntity=Employee.class,
                 onRelatedEntityDelete=NULLIFY)
    int managerId;

    @SecondaryKey(relate = MANY_TO_ONE, relatedEntity=Department.class,
                 onRelatedEntityDelete=NULLIFY)
    int departmentId;

    @SecondaryKey (relate =MANY_TO_MANY, relatedEntity=ServiceRequest.class,
                 onRelatedEntityDelete=NULLIFY)
    Set&lt;Integer&gt; SRIds = new HashSet&lt;Integer&gt;();

    String address;
    String email;
    String phone;

    /* setter and getter functions. */
}</pre>
<p><strong>2. 部门（Department）的属性</strong></p>
<pre class="java:nogutter">@Entity
class Department {
    @PrimaryKey
    int departmentId;

    @SecondaryKey(relate = ONE_TO_ONE)
    String departmentName;

    String location;

    /* setter and getter functions. */
}</pre>
<p><strong>3. 任务（ServiceRequest）的属性</strong></p>
<pre class="java:nogutter">@Entity
class ServiceRequest {
	@PrimaryKey
	int SRId;

	String title;
	String content;

/* setter and getter functions. */
}</pre>
<h2>数据可视化效果</h2>
<p>我们选择两种可视化方式：弧形树（radial tree）和节点树（node link tree）。下面看看我们的可视化效果。</p>
<p>利用radial tree来显示整个公司的结构（organization chart)：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot1.png"><img class="aligncenter size-large wp-image-835" title="snapshot" src="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot1-1024x628.png" alt="" width="839" height="514" /></a></p>
<p>上图左边最大的窗口显示的是整个公司的结构图。从图中可以看出公司有四个部门。每一个有颜色小节点代表一名员工，不同部门的员工具有不同的颜色。节点之间的连线表示上下级关系。上图右上角的小窗口显示的是选中的员工的具体信息。右下角的小窗口显示的是JE database 的schema图。从中可以看出我们定义了三个Entity: Employee, Department以及Service Request.</p>
<p>点击任意一个员工节点，将可以显示此员工的上下级结构图，也就是在此公司与之有关系的所有员工的结构图。比如我们点击名字叫Goodstein A. Chavez 的员工，结果如下图所示：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot2.png"><img class="aligncenter size-full wp-image-836" title="snapshot2" src="http://www.bdbchina.com/wp-content/uploads/2010/03/snapshot2.png" alt="" width="528" height="402" /></a></p>
<p>从上图可以看出，此员工有四名直接下属，而他的老板直接向公司的CEO汇报。</p>
<p>除了可以直接点击员工节点（基于员工ID）进行查询，我们还可以通过部门ID（Department ID）经理ID（Manager ID）和具体的任务ID（SR ID）和员工姓名来对员工进行查询。下面是对部门ID和任务ID查询的结果截图。</p>
<p>部门2的员工结构图（DeparmentID = 2）</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/byDepartment.png"><img class="aligncenter size-large wp-image-842" title="byDepartment" src="http://www.bdbchina.com/wp-content/uploads/2010/03/byDepartment-1024x261.png" alt="" width="805" height="205" /></a></p>
<p>部门2中，参与了任务3的员工（DeparmentID = 2 and SRId = 3）</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bySR.png"><img class="aligncenter size-large wp-image-843" title="bySR" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bySR-1024x265.png" alt="" width="803" height="208" /></a></p>
<p>值得一提的是，所有这些关系的查询都可以利用在JE里面定义的Entity之间的关系（relation），而不需要我们做额外的查询工作，比如想通过经理ID来查询此经理的直接下属，一句代码便可以实现：</p>
<p>dao.employeeByManagerId.subIndex(Integer.valueOf(searchKey)).entities();</p>
<h2>JE+prefuse的优势总结</h2>
<ol>
<li><strong>简单易用</strong>：用过JE的朋友都知道，利用JE（特别是JE DPL）能够十分轻松、灵活定义各种数据集模型，其get/put操作也特别简单，而且能够很容易写出特定的查询语句。而prefuse也提供了功能齐全的可视化API。所以，利用JE做数据的存取操作，利用prefuse做数据的可视化操作，其对接是十分直接和简便的。</li>
<li><strong>Footprint小</strong>：拿上面所举的员工数据可视化应用例子来说，整个应用程序打成可直接运行的jar文件才1.87M，但功能却很齐全（多种可视化效果，多种查询方式）。这样大小的程序，即使安装在一般的移动设备（比如手机）上运行都绰绰有余。</li>
<li><strong>性能高：</strong>数据可视化的性能主要体现在做查询和可视化的速度。还是以员工数据可视化为例，插入员工数据有1000条，存储到JE 数据库的大小是729k。之后用户对节点的点击和在输入框的查询，其可视化结果都能迅速得以显示（笔者没有做过具体的时间记录，但相信所需时间都是毫秒级的）。</li>
</ol>
<h2>结束语</h2>
<p>从这个例子我们可以看出在数据可视化方面，利用JE作为存储引擎是一个很好的选择。有兴趣的朋友不妨一试。另外，这里有一个十分有趣例子，是利用JE和Google Visualization API来可视化一栋房子的用电情况（ electric usage of Hypatia House），感兴趣的朋友请参考以下链接：<a href="http://excitedcuriosity.wordpress.com/2010/02/22/its-electric-ted-data-storage-and-plotting/">http://excitedcuriosity.wordpress.com/2010/02/22/its-electric-ted-data-storage-and-plotting/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/bdb-java-edition-prefuse-%e8%bd%bb%e6%9d%be%e5%ae%9e%e7%8e%b0%e6%95%b0%e6%8d%ae%e5%8f%af%e8%a7%86%e5%8c%96/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>在Google Android平台上运行Berkeley DB Java Edition</title>
		<link>http://www.bdbchina.com/2009/11/%e5%a6%82%e4%bd%95%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e9%85%8d%e7%bd%aeberkeley-db-java-edition/</link>
		<comments>http://www.bdbchina.com/2009/11/%e5%a6%82%e4%bd%95%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e9%85%8d%e7%bd%aeberkeley-db-java-edition/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 06:53:49 +0000</pubDate>
		<dc:creator>haomianwang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=735</guid>
		<description><![CDATA[Google 推出Android平台一年多以来，Android已经成为最受欢迎的手机操作系统之一（另外几个成熟的手机操作平台包括Symbian, iPhone/MacOS, Windows Mobile等）。目前，已经至少有12款手机使用Android平台，并且据报道将会有更多的手机采用Android平台。
Android平台内置的存储数据库（或者说存储引擎）是SQLite。但由于SQLite其自身的一些缺陷，比如非Java语言、并发读写性能不 佳、技术支持困难等等，所以我们的用户倾向于Berkeley DB。我在这里向大家推荐Berkeley DB Java Edition（简称BDB JE）。我们可以把BDB JE的优势（它除了是存Java语言实现外，还有很高的存储性能和良好的并发性支持、Oracle的开发及技术支持团队等等）充分运用到Android 平台上。众所周知，Android平台是类Java语言的，所以，BDB JE对Android平台的开发者而言是一款利器。
以下将手把手教你将BDB JE快速配置到Android平台上（本文，我们用Android在PC机上的模拟器 (avd) 作为实例平台）。

准备工作

 如果你的电脑上尚未安装Android SDK。那么首先点击这里下载并且安装 Android SDK。Android的官方主页上有详细的如何安装并且启动Android 模拟器（avd）的文档，这里就不再涉及。必须注意的一点是， 将你所安装的Android目录下（假如是&#60;android-installation -home&#62;）的 “tools” 文件夹路径加入到你电脑的路径（path）中去（相信有一定编程经验的读者一定很熟悉如何添加系统路径了），这样，你就可以直接在命令行上运行 Android的各种命令了。


点此下载最新版本的BDB JE。解压缩之后（假如你解压路径为JE_HOME/）可以看到在JE_HOME/lib/ 下有一个“je-android-4.0.71.jar”文件。如果找不到，说明你下载的不是最新版本的BDB JE。请到Oracle BDB JE官方网址进行下载：http://www.oracle.com/technology/products/berkeley-db/je/index.html。


在开始下面教程之前，我默认大家已经有一定的Android编程基础，如果没有，请大家到Android的官方主页上阅读相关文档（比如，如 何实现“hello world”）.

选择一：在装有Android 插件的Eclipse 编程环境下进行配置

 如果你编程的IDE是Eclipse，并且你已经在上面安装了Android编程插件（如何在Eclipse上安装Android插件，请看这里），那么就继续阅读本小节以下步骤。注意，我用的是Eclipse3.4.2（Ganymede）版本， 也许不同的版本配置上有稍微的区别。这里建议Eclipse3.4版本以上。


打开Eclipse，确认在Windows-&#62;Preference-&#62;Android下已经写入Android SDK的路径。进入"File-&#62;New-&#62;Project-&#62;Android-&#62;Android Project-&#62;Next Project"，在弹出的建立project的面板上选择build target（比如Android2.0），并填写Project name (JEExample)、 application name (JEExample)、package name (com.sleepycat.je) 和 activity name (JEExample)。最后点击Finish。Eclipse将会自动帮你生成一个Android工程。假设你所建立的工程路径是&#60;eclipse-je-android-dir&#62;


 进入”Project-&#62;Properties-&#62;Libraries-&#62;Add External [...]]]></description>
			<content:encoded><![CDATA[<p>Google 推出Android平台一年多以来，Android已经成为最受欢迎的手机操作系统之一（另外几个成熟的手机操作平台包括Symbian, iPhone/MacOS, Windows Mobile等）。目前，已经至少有12款手机使用Android平台，并且据报道将会有更多的手机采用Android平台。</p>
<p>Android平台内置的存储数据库（或者说存储引擎）是SQLite。但由于SQLite其自身的一些缺陷，比如非Java语言、并发读写性能不 佳、技术支持困难等等，所以我们的用户倾向于Berkeley DB。我在这里向大家推荐Berkeley DB Java Edition（简称BDB JE）。我们可以把BDB JE的优势（它除了是存Java语言实现外，还有很高的存储性能和良好的并发性支持、Oracle的开发及技术支持团队等等）充分运用到Android 平台上。众所周知，Android平台是类Java语言的，所以，BDB JE对Android平台的开发者而言是一款利器。</p>
<p>以下将手把手教你将BDB JE快速配置到Android平台上（本文，我们用Android在PC机上的模拟器 (avd) 作为实例平台）。</p>
<p><span id="more-735"></span></p>
<h2>准备工作</h2>
<ul>
<li> 如果你的电脑上尚未安装Android SDK。那么首先<a onclick="javascript:pageTracker._trackPageview('/outgoing/developer.android.com/sdk/index.html');" href="http://developer.android.com/sdk/index.html" target="_blank">点击这里下载</a>并且安装 Android SDK。Android的官方主页上有详细的如何安装并且启动Android 模拟器（avd）的文档，这里就不再涉及。必须注意的一点是， 将你所安装的Android目录下（假如是<code>&lt;android-installation -home&gt;）</code>的 “tools” 文件夹路径加入到你电脑的路径（path）中去（相信有一定编程经验的读者一定很熟悉如何添加系统路径了），这样，你就可以直接在命令行上运行 Android的各种命令了。</li>
</ul>
<ul>
<li><a onclick="javascript:pageTracker._trackPageview('/outgoing/www.oracle.com/technology/software/products/berkeley-db/je/index.html');" href="http://www.oracle.com/technology/software/products/berkeley-db/je/index.html" target="_blank">点此下载</a>最新版本的BDB JE。解压缩之后（假如你解压路径为JE_HOME/）可以看到在JE_HOME/lib/ 下有一个“je-android-4.0.71.jar”文件。如果找不到，说明你下载的不是最新版本的BDB JE。请到Oracle BDB JE官方网址进行下载：<a href="http://www.oracle.com/technology/products/berkeley-db/je/index.html" target="_blank"><span class="moz-txt-link-freetext">http://www.oracle.com/technology/products/berkeley</span>-db/je/index.html</a>。</li>
</ul>
<ul>
<li>在开始下面教程之前，我默认大家已经有一定的Android编程基础，如果没有，请大家到Android的官方主页上阅读相关文档（比如，如 何实现“hello world”）.</li>
</ul>
<h2>选择一：在装有Android 插件的Eclipse 编程环境下进行配置</h2>
<ul>
<li> 如果你编程的IDE是Eclipse，并且你已经在上面安装了Android编程插件（如何在Eclipse上安装Android插件，请看<a onclick="javascript:pageTracker._trackPageview('/outgoing/developer.android.com/intl/zh-CN/sdk/eclipse-adt.html#installing');" href="http://developer.android.com/intl/zh-CN/sdk/eclipse-adt.html#installing" target="_blank">这里</a>），那么就继续阅读本小节以下步骤。注意，我用的是Eclipse3.4.2（Ganymede）版本， 也许不同的版本配置上有稍微的区别。这里建议Eclipse3.4版本以上。</li>
</ul>
<ul>
<li>打开Eclipse，确认在Windows-&gt;Preference-&gt;Android下已经写入Android SDK的路径。进入<code>"File-&gt;New-&gt;Project-&gt;Android-&gt;Android Project-&gt;Next Project"</code>，在弹出的建立project的面板上选择build target（比如Android2.0），并填写Project name (JEExample)、 application name (JEExample)、package name (<code>com.sleepycat.je</code>) 和 activity name (<code>JEExample</code>)。最后点击Finish。Eclipse将会自动帮你生成一个Android工程。假设你所建立的工程路径是<code>&lt;eclipse-je-android-dir&gt;</code></li>
</ul>
<ul>
<li> 进入”Project-&gt;Properties-&gt;Libraries-&gt;Add External JARs”，在弹出的窗口中选择JE_HOME/lib/je-android-4.0.71.jar。点击OK，你将可以看到在你建立的工程 （JEExample）下面有Referenced Libraries目录，点击之后可以看到je-android-4.0.71.jar。</li>
</ul>
<ul>
<li> <code>复制代码（这些代码可在下面的"源代码"小节找到）</code><code>：</code>
<ul>
<li><code>将JEExample.java</code> 复制到<code>&lt;eclipse-je-android-dir&gt;/src/com/sleepycat/je</code></li>
<li><code>将main.xml</code> 复制到<code>&lt;eclipse-je-android-dir&gt;/</code> <code>res/layout/main.xml</code> and</li>
<li><code>将strings.xml</code> 复制到 <code>&lt;eclipse-je-android-dir&gt;/</code><code>res/values/strings.xml</code></li>
</ul>
</li>
<li> 在Eclipse中，打开main.xml，你可以看到在上一步中复制的代码。点击Run，运行JEExample。在正确运行之前，你还需要在 Android上面建立一个用于存储JE数据的文件夹，具体步骤看“在Android模拟器上运行程序”小节中的第一步。</li>
</ul>
<h2>选择二：在非IDE环境下进行配置</h2>
<ul>
<li> 如果你不喜欢用IDE（如Eclipse)进行编程，只想通过命令行进行配置，请继续阅读本小节以下步骤。</li>
</ul>
<ul>
<li>首先建立一个Android 的模拟器（AVD）（如果你还没有在你的电脑上建立过Android 的模拟器）：
<ul>
<li><code>在命令行运行 android create avd --target 3 --name my_avd</code> （注意，我在这里建立的是Android1.6的模拟器，你也可以建立Android2.0模拟器）</li>
<li>在你想要建立Android工程的目录下面，运行
<ul>
<li><code>android create project --path JEExample --package com.sleepycat.je --name JEExample --activity JEExample --target 3</code></li>
</ul>
<p>命令运行之后，将在你所在目录下面建立Android工程，文件夹的名称叫做JEExample，其中会有 <code>JEExample/src/com/sleepycat/je/JEExample.java 文件。<br />
</code></li>
</ul>
</li>
<li> 将JE_HOME/lib/je-android-4.0.71.jar 文件复制到<code>JEExample/libs</code></li>
</ul>
<ul>
<li> 将三个文件：<code>JEExample/src/com/sleepycat/je/JEExample.java</code>，     <code>JEExample/res/layout/main.xml </code><code>和 JEExample/res/values/strings.xml</code> 替换成下面“源代码”小节中对应的三个文件：<code>JEExample.java</code>，     <code>main.xml</code> 和 <code>strings.xml</code>。</li>
</ul>
<ul>
<li> 进入<code>&lt;android-installation-home&gt;/platforms/android-1.6/tools</code>， 打开 <code>dx.bat</code> 文件， 将其中一行 “<code>REM set javaOpts=-Xmx256M</code>” 改成 “<code>set javaOpts=-Xmx512M</code>“。注意“REM”要去掉。另外，如果你之前建立的Android模拟器 （AVD）是Android2.0，那么就更改<code>android-2.0/tools下的dx.bat文件。</code></li>
</ul>
<ul>
<li> 运行Android 模拟器：emulator -avd <code>my_avd</code></li>
</ul>
<ul>
<li> 用命令行进入JEExample目录，然后运行命令
<ul>
<li><code>ant install</code></li>
</ul>
</li>
</ul>
<p style="padding-left: 30px;">这个命令将会编译<code>JEExample.java</code> ，然后生成<code>JEExample/bin/JEExample-debug.apk</code> ，并将它安装到你所运行的Android 模拟器中。</p>
<h2>在Android模拟器上运行示例程序</h2>
<ul>
<li> 首先，为Android程序建立JE environment 路径，用于存储JE的数据（这一步不可忽略，并且路径名要跟程序一致，否则无法正确运行程序）。具体做法是 ：
<ul>
<li><code>在命令行运行adb shell mkdir /data/local/je</code>。或者你首先运行adb shell，然后cd data/local，最后mkdir je。</li>
<li>你也可以删除这个文件夹：<code>rm /data/local/je/*。更多adb shell的命令请参照Android文档。</code></li>
</ul>
</li>
<li> 在Android模拟器窗口上点击三角按钮（在Home界面）进入程序列表，在这里你可以看到已经安装上去的 JEExample 程序图标, 点击它，运行JEExample程序。 进入程序之后，在程序界面最上方可以看到  “JEExample”  字样，下面是一个 文字编辑框（TextEdit box）, 还有两个按钮，分别是 “Put Data” 和  “Get Data” 。</li>
</ul>
<ul>
<li> 存数据：
<ul>
<li>在文字编辑框里输入 key/data 数据对（比如 k1/d1）然后点击 “Put Data” 按钮，这样一条数据（键是k1，值是d1）便存进JE数据库中。</li>
</ul>
</li>
</ul>
<p style="padding-left: 30px;">你可以在命令行运行adb shell，进入<code>/data/local/je， 就可以看到JE的存储数据。</code></p>
<ul>
<li> 读数据：
<ul>
<li>在文字在文字编辑框里输入 你之前存储的键值key（比如k1），然后点击 “Get Data” 按钮，将会弹出“Get Data”的对话框，上面显示你之前存储的数据（比如d1）。</li>
</ul>
</li>
</ul>
<h2>JE示例源代码</h2>
<ul>
<li> JEExample.java
<pre><code>
package com.sleepycat.je;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.util.Log;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.File;

import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Transaction;

public class JEExample extends Activity {

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        try {
            final File envDir = new File("/data/local/je");
            final EnvironmentConfig envConfig = new EnvironmentConfig();
            envConfig.setTransactional(true);
            envConfig.setAllowCreate(true);
            final Environment env = new Environment(envDir, envConfig);
            final DatabaseConfig dbConfig = new DatabaseConfig();
            dbConfig.setTransactional(true);
            dbConfig.setAllowCreate(true);
            dbConfig.setSortedDuplicates(true);
            final Database db = env.openDatabase(null, "exampledb", dbConfig);

            setContentView(R.layout.main);
            final Button button1 = (Button) findViewById(R.id.do_put);
            button1.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {

                    final EditText editText =
                        (EditText) findViewById(R.id.entry);
                    final String keyData = editText.getText().toString();
                    final int idx = keyData.indexOf("/");
                    String key = null;
                    String data = null;
                    String result = null;
                    if (idx &lt; 0) {
                        result = "enter key/data to put";
                    } else {
                        key = keyData.substring(0, idx);
                        data = keyData.substring(idx + 1);
                        result = key + "/" + data;
                        final DatabaseEntry keyEntry =
                            new DatabaseEntry(key.getBytes());
                        final DatabaseEntry dataEntry =
                            new DatabaseEntry(data.getBytes());

                        try {
                            final Transaction txn =
                                env.beginTransaction(null, null);
                            final OperationStatus res =
                                db.put(txn, keyEntry, dataEntry);
                            if (res != OperationStatus.SUCCESS) {
                                result = "Error: " + res.toString();
                            }
                            txn.commit();
                        } catch (DatabaseException DE) {
                            result = "Caught exception: " + DE.toString();
                        }
                    }
                    Log.d("JE", "did put of: " + result);

                    if (result.contains("Caught exception:")) {
                    	new AlertDialog.Builder(JEExample.this).
                    	    setTitle("Put Data").setMessage(result).
                    	    setPositiveButton("Quit", new DialogInterface.OnClickListener() {
                    		    public void onClick(DialogInterface dialog, int whichButton) {
                    		    }
                    		}).show();
                    } else {
                    	new AlertDialog.Builder(JEExample.this).
                	        setTitle("Put Data").setMessage("You put the key/data pair: " + result).
                	        setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
                		        public void onClick(DialogInterface dialog, int whichButton) {
                		        }
                		    }).show();
                    }
                }
            });

            final Button button2 = (Button) findViewById(R.id.do_get);
            button2.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {

                    final EditText editText =
                        (EditText) findViewById(R.id.entry);
                    final String key = editText.getText().toString();
                    final DatabaseEntry keyEntry =
                        new DatabaseEntry(key.getBytes());
                    final DatabaseEntry dataEntry = new DatabaseEntry();
                    String result = null;
                    try {
                        final Transaction txn =
                            env.beginTransaction(null, null);
                        final OperationStatus res =
                            db.get(txn, keyEntry, dataEntry, null);
                        if (res != OperationStatus.SUCCESS) {
                            result = "Error: " + res.toString();
                        } else {
                            result = new String(dataEntry.getData());
                        }
                        txn.commit();
                    } catch (DatabaseException DE) {
                        result = "Caught exception: " + DE.toString();
                    }
                    Log.d("JE", "did get of: " + result);
                    if (result.contains("Caught exception:")) {
                    	new AlertDialog.Builder(JEExample.this).
                	        setTitle("Get Data").setMessage(result).
                	        setPositiveButton("Quit", new DialogInterface.OnClickListener() {
                		        public void onClick(DialogInterface dialog, int whichButton) {
                		        }
                		    }).show();
                    } else {
                    	new AlertDialog.Builder(JEExample.this).
                	        setTitle("Get Data").setMessage("Get result: " + result).
                	        setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
                		        public void onClick(DialogInterface dialog, int whichButton) {
                		        }
                		    }).show();
                    }
                }
            });
        } catch (Exception DE) {
            TextView tv = new TextView(this);
            tv.setText("blew chunks " + DE);
            setContentView(tv);
        }
    }
}
</code></pre>
</li>
<li> res/layout/main.xml
<pre><code>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    &gt;

  &lt;TextView android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="JEExample"
    /&gt;

  &lt;EditText android:id="@+id/entry"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@android:drawable/editbox_background"
            android:layout_below="@id/label"
    /&gt;

  &lt;Button android:id="@+id/do_put"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button_put"
    /&gt;

  &lt;Button android:id="@+id/do_get"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button_get"
    /&gt;
&lt;/LinearLayout&gt;
</code></pre>
</li>
<li> res/values/strings.xml
<pre><code>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;resources&gt;
    &lt;string name="app_name"&gt;JEExample&lt;/string&gt;
    &lt;string name="button_put"&gt;Put Data&lt;/string&gt;
    &lt;string name="button_get"&gt;Get Data&lt;/string&gt;
&lt;/resources&gt;</code></pre>
</li>
</ul>
<h2>结束语</h2>
<p>怎么样，是不是很简单就可以将JE配置到Android中了？你也赶紧试试吧。如果在配置或者安装过程中出错，欢迎给我留言。</p>
<p>注：英文好的同学，可以参照JE最新发布包中的&lt;je-home&gt;/docs/HOWTO-Android.html的英文原文。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/11/%e5%a6%82%e4%bd%95%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e9%85%8d%e7%bd%aeberkeley-db-java-edition/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>甲骨文中国(包括Berkeley DB)2010校招日程</title>
		<link>http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/</link>
		<comments>http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 06:37:50 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[Haomian Wang]]></category>
		<category><![CDATA[Linchun Sun]]></category>
		<category><![CDATA[campus]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=692</guid>
		<description><![CDATA[2010财年甲骨文(中国)校园招聘大致流程：
校园宣讲 -&#62; 在线申请 -&#62; 在线测试（涵盖：技术、性格、英文等）-&#62; 初步筛选 -&#62; 邀请合格同学on-site 笔试和面试 -&#62; 进一步筛选 -&#62; 发offer
校园宣讲会初步日程（注意：日期及时间请以51job和校园广告为准）：

Oct. 19th Shanghai Tongji Univ. (19:00-21:00)
Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)
Oct. 21th Guangzhou Southern China Univ. of Tech. (15:00-17:00)
Oct. 26th Beijing Tsinghua Univ. (19:00-21:00)
Oct. 27th Wuhan Huazhong Univ. of Science and Tech. (19:00-21:00)
Oct. 30th Hangzhou Zhejing Univ. (19:00-21:00)
Nov. 2nd Suzhou Suzhou Univ. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2010财年甲骨文(中国)校园招聘大致流程：</strong><br />
校园宣讲 -&gt; 在线申请 -&gt; 在线测试（涵盖：技术、性格、英文等）-&gt; 初步筛选 -&gt; 邀请合格同学on-site 笔试和面试 -&gt; 进一步筛选 -&gt; 发offer</p>
<p><strong>校园宣讲会初步日程（注意：日期及时间请以51job和校园广告为准）：</strong></p>
<ul>
<li>Oct. 19th Shanghai Tongji Univ. (19:00-21:00)</li>
<li>Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)</li>
<li>Oct. 21th Guangzhou Southern China Univ. of Tech. (15:00-17:00)</li>
<li>Oct. 26th Beijing Tsinghua Univ. (19:00-21:00)</li>
<li>Oct. 27th Wuhan Huazhong Univ. of Science and Tech. (19:00-21:00)</li>
<li>Oct. 30th Hangzhou Zhejing Univ. (19:00-21:00)</li>
<li>Nov. 2nd Suzhou Suzhou Univ. (14:00-16:00)</li>
<li>Nov. 4th Nanjing Southest Univ.(19:00-21:00)</li>
<li>Nov. 5th Dalian Dalian Univ. of Tech. (19:00-21:00)</li>
</ul>
<p><strong><span style="color: red">更新！！原计划于Nov.  6th的在线测试，因后台录入部分同学的纸质简历而推迟。新的时间安排：HR给的反馈是定在本周（Nov. 9th这周末或者周末以前），请大家留意Email通知并谅解。</span></strong></p>
<p><strong><span style="color: red">注: BDB的招聘行程（此项会持续更新，期待届时与你见面交流）</span></strong>：</p>
<ul>
<li>Chao Huang &#8211; 校园宣讲，Oct. 19th Shanghai Tongji Univ. (19:00-21:00)</li>
<li>Eric Wang &#8211; 校园宣讲，Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)</li>
</ul>
<p>今年Oracle会组织在多个城市进行面试，BDB初步决定参加下面4个。各位面试同学的时间地点请以电话通知为准。</p>
<ul>
<li>Eric Wang &#8211; 面试官，Nov. 17-18，深圳</li>
<li>Linchun Sun &#8211; 面试官，Nov. 19-20，广州</li>
<li>Chao Huang &#8211; 面试官，Nov. 25-27，北京</li>
<li>Chao Huang &#8211; 面试官，Nov. 24-25，上海</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/10/%e7%94%b2%e9%aa%a8%e6%96%87%e4%b8%ad%e5%9b%bd%e5%8c%85%e6%8b%acberkeley-dbfy2010%e6%a0%a1%e6%8b%9b%e6%97%a5%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>记Berkeley DB香港科技大学研讨会</title>
		<link>http://www.bdbchina.com/2009/09/%e8%ae%b0berkeley-db%e9%a6%99%e6%b8%af%e7%a7%91%e6%8a%80%e5%a4%a7%e5%ad%a6%e7%a0%94%e8%ae%a8%e4%bc%9a/</link>
		<comments>http://www.bdbchina.com/2009/09/%e8%ae%b0berkeley-db%e9%a6%99%e6%b8%af%e7%a7%91%e6%8a%80%e5%a4%a7%e5%ad%a6%e7%a0%94%e8%ae%a8%e4%bc%9a/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 09:32:46 +0000</pubDate>
		<dc:creator>haomianwang</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Haomian Wang]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=569</guid>
		<description><![CDATA[2009年九月十八日，甲骨文 Berkeley DB 技术研讨会在香港科学技术大学举行。本次研讨会的主题是：Having Challenges with Embedding Databases in your applications? 代表甲骨文公司参加本次技术研讨会的有：Ashok Joshi，director of Berkeley DB development ， Chao Huang，manager of Berkeley DB development。参加此次研讨会的观众包括甲骨文公司的客户，以及香港科大的教授和学生。
此次研讨会包括两大部分，第一部分由Chao Huang就甲骨文公司的数据库产品在嵌入式领域的应用做专题的演讲。Chao Huang分别介绍了Oracle Database，TimesTen，Berkeley DB和Oracle Lite的技术特点，并对每一个产品给予了详细的应用案例分析。最后，Chao Huang通过对每个产品特点的比较和优势的说明，列举了不同产品的应用场景，令客户能结合自身的需求做出正确的选择。
研讨会的第二部分由Ashok Joshi详细介绍Oracle Berkeley DB的技术。在这一部分的演讲中，Ashok Joshi生动地与观众分享了Oracle Berkeley DB家族的三大产品：Berkeley DB Core，Berkeley DB JE 和 Berkeley DB XML，并对其中的关键技术做了简单明了的介绍。结合Berkeley DB的技术特点，Ashok Joshi同样给出了典型的应用案例，包括Amazon，Google等等。这些案例均让客户们更深入更客观地了解了Berkeley DB的技术优势和应用场景。
会后，Ashok Joshi和Chao Huang还耐心回答了香港科大的学生们关于加入Berkeley DB team的诸多问题，包括Berkeley DB team在全球的研发力量，Berkeley DB team在深圳的研发情况，以及一些招聘的流程。在这一过程中，学生们表现出强烈的想加入Berkeley [...]]]></description>
			<content:encoded><![CDATA[<p>2009年九月十八日，甲骨文 Berkeley DB 技术研讨会在香港科学技术大学举行。本次研讨会的主题是：<a href="http://www.bdbchina.com/2009/08/berkeley-db%E7%A0%94%E8%AE%A8%E4%BC%9A%E6%B8%AF%E7%A7%91%E5%A4%A7918/"><span style="font-family: Arial,Helvetica,sans-serif; font-size: x-small;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><strong>Having Challenges with Embedding Databases in your applications?</strong></span></span></a> 代表甲骨文公司参加本次技术研讨会的有：Ashok Joshi，director of Berkeley DB development ， Chao Huang，manager of Berkeley DB development。参加此次研讨会的观众包括甲骨文公司的客户，以及香港科大的教授和学生。</p>
<p>此次研讨会包括两大部分，第一部分由Chao Huang就甲骨文公司的数据库产品在嵌入式领域的应用做专题的演讲。Chao Huang分别介绍了Oracle Database，TimesTen，Berkeley DB和Oracle Lite的技术特点，并对每一个产品给予了详细的应用案例分析。最后，Chao Huang通过对每个产品特点的比较和优势的说明，列举了不同产品的应用场景，令客户能结合自身的需求做出正确的选择。</p>
<p>研讨会的第二部分由Ashok Joshi详细介绍Oracle Berkeley DB的技术。在这一部分的演讲中，Ashok Joshi生动地与观众分享了Oracle Berkeley DB家族的三大产品：Berkeley DB Core，Berkeley DB JE 和 Berkeley DB XML，并对其中的关键技术做了简单明了的介绍。结合Berkeley DB的技术特点，Ashok Joshi同样给出了典型的应用案例，包括Amazon，Google等等。这些案例均让客户们更深入更客观地了解了Berkeley DB的技术优势和应用场景。</p>
<p>会后，Ashok Joshi和Chao Huang还耐心回答了香港科大的学生们关于加入Berkeley DB team的诸多问题，包括Berkeley DB team在全球的研发力量，Berkeley DB team在深圳的研发情况，以及一些招聘的流程。在这一过程中，学生们表现出强烈的想加入Berkeley DB team的热情。我们也希望，今年能在港科找到最适合我们Berkeley DB team的优秀人才。</p>
<p>趁着这次研讨会的机会，Ashok Joshi和Chao Huang还抽空拜访了香港科技大学计算机系的几位教授，探讨潜在的合作机会。教授们都对Berkeley DB产生浓厚的兴趣，希望将来能在Berkeley DB上开展一些研究课题，包括数据库方面和信息可视化方面。</p>
<p>这次研讨会取得了较大的成功。一方面，我们很好地向客户和在校的大学生推广了甲骨文嵌入式数据库技术，特别是Berkeley DB产品，另一方面，我们和香港科学技术大学建立了良好的关系。我们期待明年的技术研讨会能吸引更多的客户、教授与学生的参与，期待Berkeley DB能得到更广泛的推广和应用。</p>
<p>如果有进一步的反馈，或需要了解更多，请联系 <em>haomian.wang at oracle dot com</em> 。</p>
<p><span style="font-size: small;"><br />
</span><span style="font-size: small;"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/09/%e8%ae%b0berkeley-db%e9%a6%99%e6%b8%af%e7%a7%91%e6%8a%80%e5%a4%a7%e5%ad%a6%e7%a0%94%e8%ae%a8%e4%bc%9a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
Դ
