<?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 中国研发团队的博客</title>
	<atom:link href="http://www.bdbchina.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Mon, 08 Mar 2010 11:22:34 +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>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[bdb JE]]></category>
		<category><![CDATA[prefuse]]></category>
		<category><![CDATA[visualization]]></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>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB 批量插入更新与删除用法示例</title>
		<link>http://www.bdbchina.com/2010/03/berkeley-db-%e6%89%b9%e9%87%8f%e6%8f%92%e5%85%a5%e6%9b%b4%e6%96%b0%e4%b8%8e%e5%88%a0%e9%99%a4%e7%94%a8%e6%b3%95%e7%a4%ba%e4%be%8b/</link>
		<comments>http://www.bdbchina.com/2010/03/berkeley-db-%e6%89%b9%e9%87%8f%e6%8f%92%e5%85%a5%e6%9b%b4%e6%96%b0%e4%b8%8e%e5%88%a0%e9%99%a4%e7%94%a8%e6%b3%95%e7%a4%ba%e4%be%8b/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 08:33:00 +0000</pubDate>
		<dc:creator>davidzhao</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[David Zhao]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=815</guid>
		<description><![CDATA[示例讲述Berkeley DB批量插入和删除的用法。]]></description>
			<content:encoded><![CDATA[<p>在Berkeley DB 4.8之前，我们可以执行的唯一的批量数据库操作是批量读取。<br />
从Berkeley DB 4.8开始，Berkeley DB支持批量插入/更新/删除，并且用法也与批量读取相似。<br />
批量插入/更新/删除对Berkeley DB的更新性能提升非常大，是一个值得认真学习的新功能。<br />
本文就以一个示例程序展示批量插入和批量删除的用法。<br />
<span id="more-815"></span><br />
/* 批量插入示例函数。*/<br />
void *<br />
run_bulk_insert()<br />
{<br />
int raw_key[NUM_KEY_INT];<br />
char raw_data[DATA_SIZE];<br />
DBT key, data;<br />
DB_ENV *envp;<br />
DB *dbp;<br />
DB_TXN *tid;<br />
int *insert_load;<br />
int insert_count, id, i, ret, op_flag;<br />
double tmp;</p>
<p>char *key_buf, *data_buf;<br />
void *p;<br />
int j;</p>
<p>/* Initialize structs and arrays */<br />
memset(raw_key, 0, KEY_SIZE);<br />
memset(raw_data, 0, DATA_SIZE);<br />
memset(&amp;key, 0, sizeof(DBT));<br />
memset(&amp;data, 0, sizeof(DBT));<br />
tid = NULL;</p>
<p>/* Initialize bulk insertion buffers */<br />
key_buf = malloc(KEY_SIZE * bulk_size * 2);<br />
data_buf = malloc(DATA_SIZE * bulk_size * 2);<br />
memset(key_buf, 0, KEY_SIZE * bulk_size * 2);<br />
memset(data_buf, 0, DATA_SIZE * bulk_size * 2);</p>
<p>/*<br />
* 初始化Bulk buffer.使用批量操作(bulk operations) 也就是<br />
* 批量插入/删除/更新/读取的时候，必须使用用户提供的内存。<br />
* 所以需要设置DBT对象的flags为DB_DBT_USERMEM，并且设置ulen成员而不是size成员。<br />
*/<br />
key.data = key_buf;<br />
key.ulen = KEY_SIZE * bulk_size * 2;<br />
key.flags = DB_DBT_USERMEM;<br />
data.data = data_buf;<br />
data.ulen = DATA_SIZE * bulk_size * 2;<br />
data.flags = DB_DBT_USERMEM;</p>
<p>op_flag = DB_MULTIPLE;/* 这个flag给put/get/del 表示执行批量插入/更新/读取/删除。 */</p>
<p>/*<br />
* 填充一个bulk buffer DBT 对象. 先调用DB_MULTIPLE_WRITE_INIT初始化该<br />
* DBT。必须传入一个工作指针p和data buffer DBT 对象。<br />
*/<br />
DB_MULTIPLE_WRITE_INIT(p, &amp;data);<br />
for (i = 0; i &lt; bulk_size; i++) {<br />
/*<br />
* 调用DB_MULTIPLE_WRITE_NEXT这个宏来向bulk buffer当中插入数据。<br />
* 需要确保bulk buffer足够大，否则会出现内存访问越界错误。<br />
*<br />
* 各参数说明：<br />
* p: 是这个宏内部使用的工作变量，由DB_MULTIPLE_WRITE_INIT初始化，并且必须在此处一直使用。<br />
* data: 是data buffer DBT对象。<br />
* raw_data: 是一个数据项所在的内存地址。你需要把你要装入的数据项传入这个参数。每个数据项<br />
* 可以含有任意长度的字节，长度限制是一个DBT的总长度限制，也就是2的32次方。<br />
* DATA_SIZE: 是本次宏调用的数据项长度。本例当中所有数据项长度相同，只是特例。完全可以<br />
* 使用变长的数据项。<br />
*<br />
* 循环结束后填充完成，这个data buffer当中有bulk_size个data，<br />
*/<br />
DB_MULTIPLE_WRITE_NEXT(p, &amp;data, raw_data, DATA_SIZE);<br />
}</p>
<p>/*<br />
* 批量插入insert_count条key/data pairs, 每一批插入bulk_size条key/data pairs.<br />
* 本例当中我们只准备了一批数据，所以最终插入的数据是重复的，不过这不影响示例本身。<br />
*/<br />
for (i = 0; i &lt; insert_count / bulk_size; ) {<br />
/*<br />
* 填充key buffer。填好后，这个key buffer当中有bulk_size个key，<br />
* 并且第i个key与data buffer 当中的第i个data做为一对key/data pair<br />
* 被插入数据库当中(i = 0, 1, 2, &#8230; bulk_size).<br />
*/<br />
DB_MULTIPLE_WRITE_INIT(p, &amp;key);<br />
for (j = i * bulk_size; j &lt; (i + 1) * bulk_size; j++) {<br />
raw_key[0] = insert_load[j];<br />
/* 在循环当中使用DB_MULTIPLE_WRITE_NEXT依次插入每条data到data buffer当中。<br />
* 循环结束后填充完成。*/<br />
DB_MULTIPLE_WRITE_NEXT(p, &amp;key, raw_key, KEY_SIZE);<br />
}</p>
<p>/* 启动事务准备批量插入。 */<br />
if ((ret = envp-&gt;txn_begin(envp, NULL, &amp;tid, 0)) != 0) {<br />
envp-&gt;err(envp, ret, &#8220;[insert] DB_ENV-&gt;txn_begin&#8221;);<br />
exit(EXIT_FAILURE);<br />
}</p>
<p>/*<br />
* 执行批量插入。key和data DBT 对象分别是key buffer和data buffer,<br />
* 其中必然含有相同书目的key和data items,key buffer当中的第i个<br />
* key item与data buffer当中的第i个data item 作为一个Key/data pair<br />
* 被插入数据库中。(i = 0, 1, 2, &#8230; bulk_size).<br />
*/<br />
switch(ret = dbp-&gt;put(dbp, tid, &amp;key, &amp;data, op_flag)) {<br />
case 0: /* 批量插入操作成功，提交事务。*/<br />
if ((ret = tid-&gt;commit(tid, 0)) != 0) {<br />
envp-&gt;err(envp, ret, &#8220;[insert] DB_TXN-&gt;commit&#8221;);<br />
exit(EXIT_FAILURE);<br />
}<br />
break;<br />
case DB_LOCK_DEADLOCK:<br />
/* 如果数据库操作发生死锁，那么必须abort事务。然后，可以选择重新执行该操作。*/<br />
if ((ret = tid-&gt;abort(tid)) != 0) {<br />
envp-&gt;err(envp, ret, &#8220;[insert] DB_TXN-&gt;abort&#8221;);<br />
exit(EXIT_FAILURE);<br />
}<br />
continue;<br />
default:<br />
envp-&gt;err(envp, ret, &#8220;[insert] DB-&gt;put ([%d]%d)&#8221;, i, insert_load[i]);<br />
exit(EXIT_FAILURE);<br />
}</p>
<p>i++;<br />
}</p>
<p>(void)free(key_buf);<br />
(void)free(data_buf);</p>
<p>return (NULL);<br />
}</p>
<p>/* 批量插入示例函数。*/<br />
void *<br />
run_bulk_delete()<br />
{<br />
int raw_key[NUM_KEY_INT];<br />
DBT key;<br />
DB_ENV *envp;<br />
DB *dbp;<br />
DB_TXN *tid;<br />
int *delete_load;<br />
int delete_count, id, i, ret, op_flag;<br />
double tmp;</p>
<p>char *key_buf;<br />
void *p;<br />
int j;</p>
<p>/* Initialize structs and arrays */<br />
memset(raw_key, 0, KEY_SIZE);<br />
memset(&amp;key, 0, sizeof(DBT));<br />
tid = NULL;</p>
<p>/*<br />
* 初始化批量删除使用的key buffer。由于批量删除不需要data，<br />
* 所以只需要初始化和填充key buffer。我们同样需要使用自己分配的内存。<br />
*/<br />
key_buf = malloc(KEY_SIZE * bulk_size * 2);<br />
memset(key_buf, 0, KEY_SIZE * bulk_size * 2);</p>
<p>/* 初始化key buffer DBT 对象，设置正确的flags和ulen成员。 */<br />
key.data = key_buf;<br />
key.ulen = KEY_SIZE * bulk_size * 2;<br />
key.flags = DB_DBT_USERMEM;<br />
op_flag = DB_MULTIPLE; /* 批量删除同样需要这个flag。*/</p>
<p>/*<br />
* 批量删除所有的数据。每一批删除由key buffer DBT 当中的key<br />
* 指定的bulk_size条key/data pair. 这两个宏的详细用法见上文。<br />
*/<br />
for (i = 0; i &lt; delete_count / bulk_size; ) {<br />
/* 为批量删除初始化并填充一个key buffer DBT 对象。 */<br />
DB_MULTIPLE_WRITE_INIT(p, &amp;key);<br />
for (j = i * bulk_size; j &lt; (i + 1) * bulk_size; j++) {<br />
raw_key[0] = delete_load[j];<br />
DB_MULTIPLE_WRITE_NEXT(p, &amp;key, raw_key, KEY_SIZE);<br />
}<br />
/* 启动事务。*/<br />
if ((ret = envp-&gt;txn_begin(envp, NULL, &amp;tid, 0)) != 0) {<br />
envp-&gt;err(envp, ret, &#8220;[delete] DB_ENV-&gt;txn_begin&#8221;);<br />
exit(EXIT_FAILURE);<br />
}</p>
<p>/*<br />
* 执行批量删除。key buffer DBT<br />
* 当中的bulk_size条key指定的key/data pairs会被从数据库当中删除。<br />
*/<br />
switch(ret = dbp-&gt;del(dbp, tid, &amp;key, op_flag)) {<br />
case 0: /* 批量删除操作成功，提交事务。*/<br />
if ((ret = tid-&gt;commit(tid, 0)) != 0) {<br />
envp-&gt;err(envp, ret, &#8220;[delete] DB_TXN-&gt;commit&#8221;);<br />
exit(EXIT_FAILURE);<br />
}<br />
break;<br />
case DB_LOCK_DEADLOCK:<br />
/* 如果数据库操作发生死锁，那么必须abort事务。然后，可以选择重新执行该操作。*/<br />
if ((ret = tid-&gt;abort(tid)) != 0) {<br />
envp-&gt;err(envp, ret, &#8220;[delete] DB_TXN-&gt;abort&#8221;);<br />
exit(EXIT_FAILURE);<br />
}<br />
continue;<br />
default:<br />
envp-&gt;err(envp, ret, &#8220;[delete] DB-&gt;del ([%d]%d)&#8221;, i, delete_load[i]);<br />
exit(EXIT_FAILURE);<br />
}<br />
i++;<br />
}</p>
<p>(void)free(key_buf);</p>
<p>return (NULL);<br />
}<!--more--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/berkeley-db-%e6%89%b9%e9%87%8f%e6%8f%92%e5%85%a5%e6%9b%b4%e6%96%b0%e4%b8%8e%e5%88%a0%e9%99%a4%e7%94%a8%e6%b3%95%e7%a4%ba%e4%be%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB XML 多线程添加文档例子</title>
		<link>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/</link>
		<comments>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 06:56:02 +0000</pubDate>
		<dc:creator>蔡瀛</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[Ying Cai]]></category>
		<category><![CDATA[蔡瀛]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=809</guid>
		<description><![CDATA[
import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;

public class DbxmlThreads extends Thread {

        public static XmlManager mgr = null;
        public static String containerName = "test.dbxml";
        [...]]]></description>
			<content:encoded><![CDATA[<pre name="code" class="java:nogutter">
import java.io.File;
import java.util.concurrent.CountDownLatch;

import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;

public class DbxmlThreads extends Thread {

        public static XmlManager mgr = null;
        public static String containerName = "test.dbxml";
        public static Environment dbEnv = null;
        private static XmlContainer cont = null;

        static {
                EnvironmentConfig envConf = new EnvironmentConfig();
                envConf.setThreaded(true);
                envConf.setAllowCreate(true);
                envConf.setTransactional(true);
                envConf.setInitializeCache(true);
                envConf.setInitializeLocking(true);
                envConf.setInitializeLogging(true);
                envConf.setCacheSize(64 * 1024 * 1024);
                envConf.setLockDetectMode(LockDetectMode.DEFAULT);

                XmlManagerConfig xmlMgrConfig = new XmlManagerConfig();
                xmlMgrConfig.setAdoptEnvironment(true);

                File dbHome = new File(".");

                try {
                        dbEnv = new Environment(dbHome, envConf);
                        mgr = new XmlManager(dbEnv, xmlMgrConfig);

                        // 创建XmlContainer
                        if(mgr.existsContainer(containerName)!=0)
                                mgr.removeContainer(containerName);

                        XmlContainerConfig containerConf = new XmlContainerConfig();
                        containerConf.setTransactional(true);
                        containerConf.setAllowCreate(true);
                        containerConf.setContainerType(XmlContainer.NodeContainer);
                        cont = mgr.openContainer(containerName, containerConf);
                        cont.setAutoIndexing(false);
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }

        private String name;
        private CountDownLatch doneSignal;

        DbxmlThreads(String name, CountDownLatch doneSignal) {
                this.name = name;
                this.doneSignal = doneSignal;
        }

        public void run() {
                XmlTransaction txn = null;
                try {
                        String content = "<"+name+">I am "+name+"</"+name+">";
                        for (int i = 0; i < 100; i++) {
                                XmlDocumentConfig dc = new XmlDocumentConfig();
                                dc.setGenerateName(true);
                                System.out.println(name+" insert "+i);
                                txn = mgr.createTransaction();

                                XmlDocument doc = mgr.createDocument();
                                doc.setContent(content);
                                cont.putDocument(txn, doc, dc);

                                txn.commit();
                        }
                } catch (XmlException e) {
                        System.out.println("insert error:" + e.getMessage());
                } finally {
                        doneSignal.countDown();
                }
        }

        public static void main(String[] args) throws Exception {

                CountDownLatch doneSignal = new CountDownLatch(5);
                DbxmlThreads threadA = new DbxmlThreads("A", doneSignal);
                DbxmlThreads threadB = new DbxmlThreads("B", doneSignal);
                DbxmlThreads threadC = new DbxmlThreads("C", doneSignal);
                DbxmlThreads threadD = new DbxmlThreads("D", doneSignal);
                DbxmlThreads threadE = new DbxmlThreads("E", doneSignal);

                threadA.start();
                threadB.start();
                threadC.start();
                threadD.start();
                threadE.start();

                doneSignal.await();

                XmlQueryContext qc = mgr.createQueryContext();
                String query = "collection('"+containerName+"')/A";
                XmlResults res = mgr.query(query, qc);
                System.out.println("The results size is: "+res.size());
                res.delete();
                cont.close();
                mgr.close();
        }

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/03/berkeley-db-xml-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e6%b7%bb%e5%8a%a0%e6%96%87%e6%a1%a3%e4%be%8b%e5%ad%90/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Java Edition Resources</title>
		<link>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-resources/</link>
		<comments>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-resources/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 11:09:49 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[David Zhao]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=804</guid>
		<description><![CDATA[Resources

The Berkeley DB Java Edition FAQ  has useful tips and should be a first stop when trouble shooting problems.
You can find product information, datasheets, and whitepapers on  the JE home page on OTN.
All JE release images are on the JE download page.
The JE documentation page has Javadoc, Getting Started Guides and tutorials.
Here is [...]]]></description>
			<content:encoded><![CDATA[<h4>Resources</h4>
<ul>
<li>The <a href="http://www.oracle.com/technology/products/berkeley-db/faq/je_faq.html">Berkeley DB Java Edition FAQ </a> has useful tips and should be a first stop when trouble shooting problems.</li>
<li>You can find product information, datasheets, and whitepapers on <a href="http://www.oracle.com/technology/products/berkeley-db/je/index.html"> the JE home page on OTN.</a></li>
<li>All JE release images are on <a href="http://www.oracle.com/technology/software/products/berkeley-db/je/index.html">the JE download page.</a></li>
<li>The <a href="http://www.oracle.com/technology/documentation/berkeley-db/je/index.html">JE documentation page</a> has Javadoc, Getting Started Guides and tutorials.</li>
<li>Here is the <a href="http://www.oracle.com/technology/software/products/berkeley-db/htdocs/jeoslicense.html">JE License</a>.</li>
<li>Charles Lamb, a JE developer, <a href="http://blogs.oracle.com/charleslamb"> blogs</a> about usage tips, announcements, and developer anecdotes.</li>
<li>There&#8217;s a whitepaper called <a href="http://www.oracle.com/technology/products/berkeley-db/pdf/performing%20queries%20in%20oracle%20berkeley%20db%20java%20edition.pdf">Performing Queries in Oracle Berkeley DB Java Edition.</a> The whitepaper takes common SQL queries and shows how to execute the same logic using the Direct Persistence Layer (DPL). The goal is to give users who are familiar with SQL some help in learning how to use the DPL.</li>
<li>Chinese language JE blogs are available at www.bdbchina.com</li>
<li>Application source code examples are included as part of the Berkeley DB JE distribution in the examples directory.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Java Edition Android/Google Maps Demo</title>
		<link>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-androidgoogle-maps-demo/</link>
		<comments>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-androidgoogle-maps-demo/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 11:06:03 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Google Map]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=801</guid>
		<description><![CDATA[Thanks to Chris Eastland at Nebula Software Systems for the screen shot of this cool Google Maps/Android app built on BDB JE. The location data is stored in a JE database running on the device.
See the details at Charles Lamb&#8217;s blog at              [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to Chris Eastland at Nebula Software Systems for the screen shot of this cool Google Maps/Android app built on BDB JE. The location data is stored in a JE database running on the device.</p>
<p>See the details at Charles Lamb&#8217;s blog at                                         <a title="New window will open" href="http://www.linkedin.com/redirect?url=http%3A%2F%2Fblogs%2Eoracle%2Ecom%2FcharlesLamb%2F2010%2F02%2Fberkeley_db_java_edition_andro%2Ehtml&amp;urlhash=gH3q" target="_blank">http://blogs.oracle.com/charlesLamb/2010/02/berkeley_db_java_edition_andro.html</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-androidgoogle-maps-demo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Java Edition/Android Whitepaper</title>
		<link>http://www.bdbchina.com/2010/02/berkeley-db-java-editionandroid-whitepaper/</link>
		<comments>http://www.bdbchina.com/2010/02/berkeley-db-java-editionandroid-whitepaper/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 11:04:26 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=799</guid>
		<description><![CDATA[Charles Lamb (BDB-JE 架构师) 最近发表的一篇关于在Google Android运行Berkeley DB Java Edition的白皮书。书中简要描述了JE在在Android平台上运行的一些优势和特点，诸如性能，可扩展性，索引，并发控制，事务和多对多的 事物-线程映射模型。
原文地址： http://www.oracle.com/technology/products/berkeley-db/pdf/bdb-je-android.pdf .
]]></description>
			<content:encoded><![CDATA[<p>Charles Lamb (BDB-JE 架构师) 最近发表的一篇关于在Google Android运行Berkeley DB Java Edition的白皮书。书中简要描述了JE在在Android平台上运行的一些优势和特点，诸如性能，可扩展性，索引，并发控制，事务和多对多的 事物-线程映射模型。</p>
<p>原文地址： <a title="New window will open" href="http://www.linkedin.com/redirect?url=http%3A%2F%2Fwww%2Eoracle%2Ecom%2Ftechnology%2Fproducts%2Fberkeley-db%2Fpdf%2Fbdb-je-android%2Epdf&amp;urlhash=zko9" target="_blank">http://www.oracle.com/technology/products/berkeley-db/pdf/bdb-je-android.pdf</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/berkeley-db-java-editionandroid-whitepaper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Java Edition: Handling Transactions in JE 4.0</title>
		<link>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-handling-transactions-in-je-4-0/</link>
		<comments>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-handling-transactions-in-je-4-0/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 10:56:02 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/2010/02/berkeley-db-java-edition-handling-transactions-in-je-4-0/</guid>
		<description><![CDATA[In his blog (                                        http://blogs.sun.com/jhalex/entry/handling_transactions_in_bdb_je ), Jeff Alexander of Sun&#8217;s project Aura describes how they&#8217;ve standardized [...]]]></description>
			<content:encoded><![CDATA[<p>In his blog (                                        <a title="New window will open" href="http://www.linkedin.com/redirect?url=http%3A%2F%2Fblogs%2Esun%2Ecom%2Fjhalex%2Fentry%2Fhandling_transactions_in_bdb_je&amp;urlhash=UpNv" target="_blank">http://blogs.sun.com/jhalex/entry/handling_transactions_in_bdb_je</a> ), Jeff Alexander of Sun&#8217;s project Aura describes how they&#8217;ve standardized on a calling convention for JE which provides uniform, yet flexible, transaction and exception handling.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/berkeley-db-java-edition-handling-transactions-in-je-4-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在JSP中使用Berkeley DB Java Edition</title>
		<link>http://www.bdbchina.com/2010/02/%e5%9c%a8jsp%e4%b8%ad%e4%bd%bf%e7%94%a8berkeley-db-java-edition/</link>
		<comments>http://www.bdbchina.com/2010/02/%e5%9c%a8jsp%e4%b8%ad%e4%bd%bf%e7%94%a8berkeley-db-java-edition/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 10:49:31 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[JE]]></category>
		<category><![CDATA[JSP]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=793</guid>
		<description><![CDATA[有来自开源社区的BDB-JE用户写的一篇博客，介绍了如何在JSP中使用JE来存取Java对象。英文好的朋友或者项目中有类似需求的朋友，不妨看看。原文地址为：http://reecegriffin.com/blog/berkeleyje.html。
在这篇博客中，作者简要提到了最新的JE 4.0 发布的新特性 &#8211; Replication。简言之就是支持高可用或集群功能，并提供了软件和硬件层面的负载均衡。个人认为，JE 4.0的高可用功能绝对是任务密集型的、要求7×24小时高可用的J2EE应用项目中的利器啊。  
最后，欢迎留言。
]]></description>
			<content:encoded><![CDATA[<p>有来自开源社区的BDB-JE用户写的一篇博客，介绍了如何在JSP中使用JE来存取Java对象。英文好的朋友或者项目中有类似需求的朋友，不妨看看。原文地址为：http://reecegriffin.com/blog/berkeleyje.html。</p>
<p>在这篇博客中，作者简要提到了最新的JE 4.0 发布的新特性 &#8211; Replication。简言之就是支持高可用或集群功能，并提供了软件和硬件层面的负载均衡。个人认为，JE 4.0的高可用功能绝对是任务密集型的、要求7×24小时高可用的J2EE应用项目中的利器啊。 <img src='http://www.bdbchina.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>最后，欢迎留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/%e5%9c%a8jsp%e4%b8%ad%e4%bd%bf%e7%94%a8berkeley-db-java-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>欢迎加入Berkeley DB群@LinkedIn</title>
		<link>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/</link>
		<comments>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 13:19:01 +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[bdb]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=791</guid>
		<description><![CDATA[首先祝各位访客新年快乐，虎年富贵吉祥！
Oracle Berkeley DB在LinkedIn.com上的新建了一个群，供全球的相关人士（包括工程师、产品经理、客户等）共同讨论Berkeley DB的话题和业界动态。群地址：http://www.linkedin.com/groups?gid=2131985. 欢迎加入！
Oracle Berkeley DB 中国研发团队
]]></description>
			<content:encoded><![CDATA[<p>首先祝各位访客新年快乐，虎年富贵吉祥！</p>
<p>Oracle Berkeley DB在LinkedIn.com上的新建了一个群，供全球的相关人士（包括工程师、产品经理、客户等）共同讨论Berkeley DB的话题和业界动态。群地址：<a href="http://www.linkedin.com/groups?gid=2131985">http://www.linkedin.com/groups?gid=2131985</a>. 欢迎加入！</p>
<p>Oracle Berkeley DB 中国研发团队</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/%e6%ac%a2%e8%bf%8e%e5%8a%a0%e5%85%a5berkeley-db%e7%be%a4linkedin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patch Releases of Oracle Berkeley DB Java Edition</title>
		<link>http://www.bdbchina.com/2010/02/patch-releases-of-oracle-berkeley-db-java-edition/</link>
		<comments>http://www.bdbchina.com/2010/02/patch-releases-of-oracle-berkeley-db-java-edition/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 06:31:33 +0000</pubDate>
		<dc:creator>chaohuang</dc:creator>
				<category><![CDATA[Berkeley DB JE]]></category>
		<category><![CDATA[Chao Huang]]></category>
		<category><![CDATA[bdb JE]]></category>
		<category><![CDATA[JE]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=788</guid>
		<description><![CDATA[The Oracle Berkeley DB team is pleased to announce the availability of Berkeley DB Java Edition for all supported platforms (BDB JE).
One major focus of Berkeley DB has been replication for high availability (HA), the other is support for the Google Android phone platform.
* Read the new &#8220;BDB JE on Android&#8221; whitepaper
* See a screenshot [...]]]></description>
			<content:encoded><![CDATA[<p>The Oracle Berkeley DB team is pleased to announce the availability of Berkeley DB Java Edition for all supported platforms (BDB JE).</p>
<p>One major focus of Berkeley DB has been replication for high availability (HA), the other is support for the Google Android phone platform.<br />
* Read the new &#8220;BDB JE on Android&#8221; <a href="http://www.oracle.com/technology/products/berkeley-db/pdf/bdb-je-android.pdf">whitepaper</a><br />
* See a <a href="http://blogs.oracle.com/charlesLamb/2010/02/berkeley_db_java_edition_andro.html">screenshot</a> of JE running on Android storing map coordinates displayed on Google Maps<br />
* Search Oracle.com for Android (google: &#8220;site:oracle.com android&#8221;) note that most results are about BDB JE</p>
<p><strong>Berkeley DB Java Edition (JE) 4.0.92</strong><em></em></p>
<p>Includes the following new features and changes:</p>
<p>* Enhancements have been added for JE High Availability, which supports the use of JE with replication.<br />
* The monitor package has several new event types which help a replicated application track replication group changes. A new example has been added to the replication example group to illustrate the use of RMI in replication write request forwarding.<br />
* New properties have been added to help administer a replication group in the face of major hardware failure.<br />
* A new RMI based example has been added to the set of JE HA Examples.<br />
* See the High Availability Guide for an introduction to the product, and the com.sleepycat.je.rep javadoc for API specifications.<br />
* JE&#8217;s MBeans and JConsole plugin have several new methods and capabilities to improve the ability to monitor an application. See the how-to for more information.<br />
* Changes were made to make it easier to control JE&#8217;s use of java.util.logging through programmatic means.<br />
* A number of bug fixes were made to work around problems in the Dvalvik libraries used by Android applications.<br />
* A number of general bug fixes, performance improvements, and documentation improvements were made.</p>
<p><strong>Software Downloads</strong></p>
<p>* Downloads available today at http://download.oracle.com/berkeley-db/je-4.0.92.zip.</p>
<p><strong>Questions?</strong></p>
<p>Please direct your questions to our OTN forum at http://forums.oracle.com/forums/forum.jspa?forumID=273.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/02/patch-releases-of-oracle-berkeley-db-java-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
