﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;b&gt;成都心情&lt;/b&gt;-随笔分类-Versant db4o 中文项目</title><link>http://www.blogjava.net/rosen/category/13739.html</link><description>努力和牛人缩短差距。</description><language>zh-cn</language><lastBuildDate>Fri, 09 Jul 2010 02:22:47 GMT</lastBuildDate><pubDate>Fri, 09 Jul 2010 02:22:47 GMT</pubDate><ttl>60</ttl><item><title>开源面向对象数据库 db4o 之旅: 使用 dRS “db4o 之旅（四）”</title><link>http://www.blogjava.net/rosen/archive/2010/07/09/325618.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 09 Jul 2010 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2010/07/09/325618.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/325618.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2010/07/09/325618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/325618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/325618.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很多开发者对 hibernate 性能表示置疑，下一次技术革新会是什么呢？——对象数据库<br>这篇文章是开源面向对象数据库  db4o 之旅   系列文章的第 4 部分，介绍面向对象数据库 db4o 的 db4o Replication System(dRS) —— db4o 复制系统，并对其如何同步 Oracle 数据库进行分析。&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2010/07/09/325618.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/325618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2010-07-09 10:19 <a href="http://www.blogjava.net/rosen/archive/2010/07/09/325618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Versant db4o 8.0 RC发布（翻译）</title><link>http://www.blogjava.net/rosen/archive/2010/05/13/320921.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Thu, 13 May 2010 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2010/05/13/320921.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/320921.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2010/05/13/320921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/320921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/320921.html</trackback:ping><description><![CDATA[从最近一次的db4o主版本(v7.0)发布到现在已经2年多了，是时候启动新一轮的db4o对象数据库主版本里程碑了：8.0版本。这些年Versant的db4o团队一直在努力工作，始终保持着向互联网时代的开发者提供创新数据库的传统，并在对象数据库技术领域创造新的辉煌。<br />
<br />
回首过去，7.0版本是非常易用的，其重要之处在于实现了透明激活以及其他重要特性，例如处理Runtime/Unchecked异常、MTOC(multi-transactional object-container 多事务对象容器)客户端和服务器端的实现以及在活动客户端的推更新(pushed updates)。我们曾经的db4o社区，注册用户已经超过85,000，这一切告诉我们产品的易用性是不容置疑的，尤其是原生对象的复杂映射完全可以与创可贴式(band-aid)的ORM技术相抗衡。<br />
<br />
展望未来，8.0主版本的发布更加关注性能，当然还是保持一如既往的易用性。本着挑战性能极限和易用性的精神，db4o进行了新一轮的改进，涉及到了内部非常根基的部分。尽管无法直观的看到改进了什么，但在运行的时候你能明显的体会到。db4o 8.0对<a href="http://developer.db4o.com/Blogs/Product/tabid/167/entryid/896/More-speed-in-db4o-8-0-with-new-BTree-IdSystem.aspx">标识管理系统进行了根本性的改变</a>，重点是改进了db4o server的I/O特性。正如Poleposition基准测试所显示的，这些改进都应验了db4o的卓越性能。未来，这些改进都为改进I/O集群、碎片整理和对象演进做好了准备。<br />
<br />
认识到db4o在嵌入式设备和桌面应用程序中的力量，我们扩展了db4o与大哥<a href="http://www.versant.com/en_US/products/objectdatabase/">Versant对象数据库</a>集成，进行端到端对象持久化的能力，而db4o复制技术可用于提供强大的从db4o高性能桌面到Versant大规模集群服务器的纯对象持久化。与此同时，db4o核心团队将继续把重点放在增强易用性，并在日益壮大的社区中扮演重要角色。例如增强了透明持久以及激活.NET集合、安全特性、客户和服务器优化、适时的支持了Android和Silverlight之类的轻量级环境。<br />
<br />
在技术创新的同时，Versant继续向开源社区敞开大门，一直向社区传播这这样的声音：对象数据库在互联网计算的新纪元中是非常重要的。继续保持7.0的新业务模式和产品预览发布策略，新的8.0遵循了更加流行的FLOSS开源授权模式，并持续提交和db4o一样的开源管理工具，例如OME(Object Manager Enterprise)工具以及Eclipse和Visual Studio插件。<br />
<br />
注意，这次新版本发布还是遵循标准流程。下面是一个汇总，db4o团队在整个2010年都会为8.0的最终发布而努力：<br />
<br />
新性能特性<br />
&nbsp;&nbsp;&nbsp; 内部Id系统将改善I/O、集群、碎片整理等 *<br />
&nbsp;&nbsp;&nbsp; 改进内存管理——通过2的因子(factor of 2)减小堆空间<br />
&nbsp;&nbsp;&nbsp; 在不同的负载，有多种新的缓存选项<br />
&nbsp;&nbsp;&nbsp; 快速集合的实现(BigSet)<br />
&nbsp;&nbsp;&nbsp; 自定义类型处理器<br />
&nbsp;&nbsp;&nbsp; 为client/server模式优化的对象预获取<br />
<br />
新功能<br />
&nbsp;&nbsp;&nbsp; 从db4o到大哥Versant的对象复制 *<br />
&nbsp;&nbsp;&nbsp; 针对Java和.NET集合的TP/TA *<br />
&nbsp;&nbsp;&nbsp; 对Silverlight和Mono的支持<br />
&nbsp;&nbsp;&nbsp; 提供.NET LINQ支持<br />
&nbsp;&nbsp;&nbsp; 国际化——Unicode，现在还是UTF-8和其他字符串编码...支持中文、日文字符集<br />
<br />
由开源社区提供的新功能<br />
&nbsp;&nbsp;&nbsp; 扩展开源授权——微软(Ms-PL, Ms-RL)，FLOSS授权，兼容GPL_v3<br />
&nbsp;&nbsp;&nbsp; 开源Eclipse和Visual Studio的OME插件<br />
&nbsp;&nbsp;&nbsp; DZone RefCard以及新的技术视频和播客<br />
&nbsp;&nbsp;&nbsp; 像MapMe这样的Android应用程序demo<br />
&nbsp;&nbsp;&nbsp; Eclipse和Visual Studio的TA/TP插件<br />
<br />
新的易用性改进<br />
&nbsp;&nbsp;&nbsp; 安全的套接字通讯<br />
&nbsp;&nbsp;&nbsp; 引进Maven资源库快照<br />
&nbsp;&nbsp;&nbsp; ADO .NET Data Services接口(IQueryable, IUpdateable)<br />
&nbsp;&nbsp;&nbsp; 新的运行时统计收集和可视化分析<br />
&nbsp;&nbsp;&nbsp; mdRS——为Google Android用户提供的移动dRS，以便能复制到关系型数据库<br />
&nbsp;&nbsp;&nbsp; Spring db4o扩展<br />
&nbsp;&nbsp;&nbsp; 对为空类型的Array的支持<br />
&nbsp;&nbsp;&nbsp; 简化后的新配置界面<br />
&nbsp;&nbsp;&nbsp; 支持.NET枚举作为值类型<br />
&nbsp;&nbsp;&nbsp; 业界率先支持CompactFramework上的LINQ<br />
&nbsp;&nbsp;&nbsp; .NET普通集合类型的支持<br />
&nbsp;&nbsp;&nbsp; 为推更新客户端缓存准备的提交回调函数<br />
&nbsp;&nbsp;&nbsp; 为.NET LINQ提供TP<br />
&nbsp;&nbsp;&nbsp; 集合感知的dRS实现<br />
<br />
*号标注的是RC版中不可用的，但计划放进最终版。<br />
<br />
Versant目标是为db4o社区用户提供最先进、最易用，最坚固、遵循ACID且高性能的数据库解决方案。新db4o 8.0的发布兑现了我们始终奉行的承诺。我们期待听到你的声音并愿和你一起并肩作战为未来交付新的创新。<br />
<br />
请帮助我们向你们的朋友和同事分享这样的声音：&#8220;工作中使用正确的工具，用对象数据库去应对互联网时代的数据管理挑战吧&#8221;。<br />
<br />
Robert Greene<br />
<br />
开源运营V.P.<br />
<br />
Versant——db4o团队 <br />
<br />
<strong><font color="#ff0000" face="宋体" size="2">请注意！引用、转贴本文应注明原译者：Rosen
Jiang 以及出处：</font></strong><a href="../archive/2007/02/rosen/rosen/rosen"><font color="#ff0000" face="宋体" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a><br />
<br />
<img src ="http://www.blogjava.net/rosen/aggbug/320921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2010-05-13 19:16 <a href="http://www.blogjava.net/rosen/archive/2010/05/13/320921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国际对象数据库大会（ICOODB）简介</title><link>http://www.blogjava.net/rosen/archive/2008/01/23/177365.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Wed, 23 Jan 2008 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2008/01/23/177365.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/177365.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2008/01/23/177365.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/177365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/177365.html</trackback:ping><description><![CDATA[
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="ZH-CN" style="FONT-SIZE: 18pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">大会目的</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 18pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p>
		</p>
		<table class="MsoTableGrid" style="BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0mm 5.4pt 0mm 5.4pt" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0mm; BORDER-LEFT: #d4d0c8; WIDTH: 801pt; PADDING-TOP: 0mm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top" width="1068">
										<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">ICOODB 2008</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">是本世纪<b style="mso-bidi-font-weight: normal">对象数据库方面的第一次国际大会</b>，将于</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">3</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">月</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">13</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">和</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">14</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">日在德国柏林召开。对科学家、工业、开发者和学生来说，在这里能面对面交流象数据库并相互碰撞灵感，这是一次难得的机会。大会旨在让人们对对象数据库产生兴趣，以一种<b style="mso-bidi-font-weight: normal">创新的方式把对象和数据库结合起来</b>，并代替或扩展关系型<b style="mso-bidi-font-weight: normal">数据库</b></span>
														<b style="mso-bidi-font-weight: normal">
																<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">/</span>
																<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">映射</span>
														</b>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">。</span>
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
														<br />
												</span>
										</p>
										<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">大会由一个独立的委员会组织，来自柏林应用科技大学（</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">TFH-Berlin</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">）的</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">Stefan Edlich</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">教授和英国喀里多尼亚大学（</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">Glasgow Caledonian University</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">）的</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">James Paterson</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">是本次大会的领导人，由</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">ODBMS.org</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">、</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">ODBMS</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">供应商、主要出版人提供支持，并由柏林应用科技大学提供场所。大会将在柏林应用科技大学召开。在<b style="mso-bidi-font-weight: normal">星期四</b>，也就是在“<b style="mso-bidi-font-weight: normal">理论日</b>”，焦点将在对象数据库的理论方面。<b style="mso-bidi-font-weight: normal">星期五</b>，也就是“<b style="mso-bidi-font-weight: normal">应用日</b>”，焦点将在实际应用和实现方面。为技术日准备的每篇论文都将进行<b style="mso-bidi-font-weight: normal">审阅</b>。更多关键信息、演讲和大会日程请查阅</span>
												<b style="mso-bidi-font-weight: normal">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
																<a href="http://odbmsjournal.org/icoodb/structure.html">
																		<span lang="ZH-CN">日程页面</span>
																</a>
														</span>
												</b>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">！</span>
												<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0mm; BORDER-LEFT: #d4d0c8; WIDTH: 126pt; PADDING-TOP: 0mm; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" valign="top" width="168">
										<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-font-kerning: 0pt">
														<a href="http://www.tfh-berlin.de/campus/lageplan.htm">
																<span style="TEXT-DECORATION: none; text-underline: none">
																		<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
																		<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
																				<v:stroke joinstyle="miter">
																				</v:stroke>
																				<v:formulas>
																						<v:f eqn="if lineDrawn pixelLineWidth 0">
																						</v:f>
																						<v:f eqn="sum @0 1 0">
																						</v:f>
																						<v:f eqn="sum 0 0 @1">
																						</v:f>
																						<v:f eqn="prod @2 1 2">
																						</v:f>
																						<v:f eqn="prod @3 21600 pixelWidth">
																						</v:f>
																						<v:f eqn="prod @3 21600 pixelHeight">
																						</v:f>
																						<v:f eqn="sum @0 0 1">
																						</v:f>
																						<v:f eqn="prod @6 1 2">
																						</v:f>
																						<v:f eqn="prod @7 21600 pixelWidth">
																						</v:f>
																						<v:f eqn="sum @8 21600 0">
																						</v:f>
																						<v:f eqn="prod @7 21600 pixelHeight">
																						</v:f>
																						<v:f eqn="sum @10 21600 0">
																						</v:f>
																				</v:formulas>
																				<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
																				</v:path>
																				<o:lock aspectratio="t" v:ext="edit">
																				</o:lock>
																		</v:shapetype>
																</span>
														</a>
														<img src="http://odbmsjournal.org/icoodb/img/grashof.jpg" />
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p>
		</p>
		<table class="MsoTableGrid" style="MARGIN: auto 4.85pt; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0mm 5.4pt 0mm 5.4pt; mso-table-lspace: 7.1pt; mso-table-rspace: 7.1pt; mso-table-anchor-vertical: paragraph; mso-table-anchor-horizontal: margin; mso-table-left: left; mso-table-top: .1pt" cellspacing="0" cellpadding="0" align="left" border="0">
				<tbody>
						<tr style="HEIGHT: 116.65pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0mm; BORDER-LEFT: #d4d0c8; WIDTH: 149.4pt; PADDING-TOP: 0mm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 116.65pt; BACKGROUND-COLOR: transparent" valign="top" width="199">
										<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-element: frame; mso-element-frame-hspace: 7.1pt; mso-element-wrap: around; mso-element-anchor-vertical: paragraph; mso-element-anchor-horizontal: margin; mso-element-top: .1pt; mso-height-rule: exactly" align="left">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-font-kerning: 0pt">
														<o:p>
																<img src="http://odbmsjournal.org/icoodb/img/icoodb_revised.gif" />
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0mm; BORDER-LEFT: #d4d0c8; WIDTH: 768.6pt; PADDING-TOP: 0mm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 116.65pt; BACKGROUND-COLOR: transparent" valign="top" width="1025">
										<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 0pt">
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">对象数据库在某些特定的应用程序类型中是明智的选择，这样能减少开发者成本和时间，也能帮助他们构建更加富有</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">OO</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">特性的应用程序。否则，如果盲目地加大数据库空间，迟早也还是会被关系数据库和</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">O/R</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">映射给充填满了。因此，本次大会的一个目的就是让大家能更好的理解什么情况下和为什么使用</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">ODBMS</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">。有了这种精神，我们想邀请你<strong>加入本次</strong></span>
												</span>
												<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 0pt">
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
																<strong>大会、起草一份论文或演讲、展示海报</strong>
														</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">或简单的到场观摩或和我们进一步接洽。如果你对某个主题有兴趣，只需要访问</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
																<a href="http://odbms.org/">odbms.org</a>
														</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">并阅读</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
																<a href="http://odbms.org/experts.html">
																		<span lang="ZH-CN">专家文章</span>
																</a>
														</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">或浏览包括演讲稿、指南、文章等在内的</span>
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
																<a href="http://odbms.org/downloads.html">
																		<span lang="ZH-CN">免费内容</span>
																</a>
														</span>
														<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">。</span>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-element: frame; mso-element-frame-hspace: 7.1pt; mso-element-wrap: around; mso-element-anchor-vertical: paragraph; mso-element-anchor-horizontal: margin; mso-element-top: .1pt; mso-height-rule: exactly" align="left">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 0pt">
														<o:p> </o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ Ｐゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="ZH-CN" style="FONT-SIZE: 18pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
								<font color="#ffffff">大</font>
								<font color="#ffffff">会</font>
								<font color="#ffffff">内</font>
								<font color="#ffffff">容</font>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 18pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<font color="#ffffff">感</font>
						<br />
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="ZH-CN" style="FONT-SIZE: 18pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
								<br />
								<br />
								<br />大会内容</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 18pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<br /> </p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">感兴趣的主题将被包括在内，但不局限于此：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库<b style="mso-bidi-font-weight: normal">研究</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库与关系型技术、映射、</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">JPA</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">等的<b style="mso-bidi-font-weight: normal">比较</b>。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库在工业、案例研究（能源、生物、移动领域、汽车</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">…</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">）</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库<b style="mso-bidi-font-weight: normal">产品</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库与<b style="mso-bidi-font-weight: normal">性能</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库与<b style="mso-bidi-font-weight: normal">查询语言</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库<b style="mso-bidi-font-weight: normal">体系和模式</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库在<b style="mso-bidi-font-weight: normal">嵌入式系统</b>中</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库在<b style="mso-bidi-font-weight: normal">高可用性</b>和<b style="mso-bidi-font-weight: normal">可变规模系统</b>中</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库的不同<b style="mso-bidi-font-weight: normal">编程语言</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库和<b style="mso-bidi-font-weight: normal">标准</b>（例如</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">odmg</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">“</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">4th generation</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">”）</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库的<b style="mso-bidi-font-weight: normal">培训</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-language: ZH-CN; mso-fareast-font-family: Wingdings">
						<span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">        </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">对象数据库<b style="mso-bidi-font-weight: normal">实现</b></span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
								<o:p> </o:p>
						</span>
				</b>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">如果你能在以上的任何主题有所贡献，或任何其他相关主题，请与我联系。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoPlainText" style="MARGIN: 0mm 0mm 0pt">
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">最后，请参考本网站的</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
						<a href="http://odbmsjournal.org/icoodb/faq.html">FAQ</a>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，相关新闻在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
						<a href="http://www.odbms.org/about_news_20070918.html">
								<span lang="ZH-CN">这里</span>
						</a>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">查阅，官方海报可以在</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
						<a href="http://odbmsjournal.org/icoodb/data/ICOODBposter.pdf">
								<span lang="ZH-CN">这里</span>
						</a>
				</span>
				<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-bidi-font-family: 'ＭＳ ゴシック'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">浏览。</span>
				<br />
				<br />
				<span id="ctl00_ctl00_bcr_topicView___TopicBody">
						<span id="ctl00_ctl00_bcr_topicView___TopicBody">
								<span style="FONT-FAMILY: 宋体">
										<strong>
												<font color="#ff0000" size="2">请注意！引用、转贴本文应注明原译者：RosenJiang 以及出处：</font>
										</strong>
										<a href="/rosen/archive/2007/02/rosen/rosen/rosen">
												<font face="宋体" color="#ff0000" size="2">
														<strong>http://www.blogjava.net/rosen</strong>
												</font>
										</a>
								</span>
						</span>
				</span>
		</p>
<img src ="http://www.blogjava.net/rosen/aggbug/177365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2008-01-23 21:24 <a href="http://www.blogjava.net/rosen/archive/2008/01/23/177365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapMe（翻译）</title><link>http://www.blogjava.net/rosen/archive/2007/12/13/167622.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Thu, 13 Dec 2007 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2007/12/13/167622.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/167622.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2007/12/13/167622.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/167622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/167622.html</trackback:ping><description><![CDATA[
		<p>
				<font size="5">
						<strong>
								<font color="#008000">简介</font>
								<br />
						</strong>
				</font>
				<br />
				<font size="3">本项目基于<a href="http://www.linkedin.com/in/davanum">Davanum Srinivas</a>开发的<a href="http://davanum.wordpress.com/2007/11/19/drawing-overlays-for-android-maps-aka-search-for-starbucks">BrowseMap</a>，<a href="http://davanum.wordpress.com/2007/11/19/drawing-overlays-for-android-maps-aka-search-for-starbucks">BrowseMap</a>是一个为Android开发的Google Maps浏览器，能提供：<br /><ul><li>在Android上浏览Google Maps
</li><li>地图的放大和缩小
</li><li>跟随鼠标移动（在真实设备上应该是触摸屏）
</li><li>交通和卫星视图之间转换
</li><li>定位</li></ul><p></p></font>（这样的地图应用程序基础功能实际上已经在Android上实现了）<br /><br />但是MapMe在这些基础功能之上提供了不少新特性，这都得感谢db4o对象持久引擎：
</p>
		<p>
		</p>
		<ul>
				<li>把位置信息登记到db4o（完整的地图持久化，包括缩放级别以及卫星交通视图） 
</li>
				<li>浏览书签列表 
</li>
				<li>编辑书签 
</li>
				<li>从书签中导航到地图上某个位置 
</li>
				<li>根据当前GPS所报告的位置居中显示地图 </li>
		</ul>
		<p>
				<strong>
						<font color="#008000" size="5">屏幕截图</font>
				</strong>
				<br />
				<br />想看应用程序是如何运作的，你可以观看在<a href="http://www.youtube.com/watch?v=uHNQKM7Qxhs">YouTube上的MapMe视频</a>、从一个外部服务器下载<a href="http://smartware.com.ar/tutorials/MapMe.avi">高分辨率视频</a>(30 Mb)或下面的屏幕截图：<br /><br />db4o总部（卫星+交通视图）<br /><br /><img src="http://developer.db4o.com/ProjectSpaces/download.ashx/MapMe/New-1.Png" /><br /><br />MapMe主菜单：<br /><br /><img src="http://developer.db4o.com/ProjectSpaces/download.ashx/MapMe/New-2.Png" /><br /><br />建立书签/导航点(navpoint)：<br /><br /><img src="http://developer.db4o.com/ProjectSpaces/download.ashx/MapMe/New-3.Png" /><br /><br />保存的书签/导航点(navpoint)列表：<br /><br /><img src="http://developer.db4o.com/ProjectSpaces/download.ashx/MapMe/New-4.Png" /><br /><br /><strong><font color="#008000" size="5">MapMe是如何运用db4o的</font></strong><br /><br />如果你查看源代码（下面有下载），你会发现DB helper类处理了所有的持久化操作（开启、存储、查询、计数数据库），而这一切都不超过80行代码！<br /><br />这一切都很简单，而且不会丧失性能。让我们来看一些项目中用到的持久化方法。</p>
		<p>
				<strong>
						<font color="#008000" size="4">开启数据库</font>
				</strong>
				<br />
				<br />开启数据库的确简单，并且在必要的时候还能自动生成数据库文件。一旦打开，db4o将锁定数据库文件。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> ObjectContainer db(){<br /><br />      </span>
				<span style="COLOR: #0000ff">try</span>
				<span style="COLOR: #000000"> {<br /><br />            </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(oc </span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">||</span>
				<span style="COLOR: #000000"> oc.ext().isClosed())<br /><br />                  oc </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Db4o.openFile(dbConfig(), db4oDBFullPath(context));<br /><br />            </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> oc;<br /><br />      } </span>
				<span style="COLOR: #0000ff">catch</span>
				<span style="COLOR: #000000"> (Exception e) {<br /><br />            Log.e(Db4oHelper.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">.getName(), e.toString());<br /><br />            </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000">;<br /><br />      }<br /><br />}<br /><br /> <br /><br /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> String db4oDBFullPath(Context ctx) {<br /><br />      </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> ctx.getDataDir() </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">browsemap.db4o</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br /><br />}</span>
		</div>
		<br />注意我们所存放的数据库文件路径是和上下文数据目录有关的。<br /><br /><font color="#008000"><strong><font size="4">配置数据库</font></strong><br /></font><br />这里我们提供一个配置对象，以便在打开数据库的时候把它传递进去（代码如下）。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> Configuration dbConfig(){<br /><br />      Configuration c </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Db4o.newConfiguration();<br /><br />      c.objectClass(MapBookmark.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">).objectField(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).indexed(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br /><br />      c.objectClass(MapBookmark.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">).updateDepth(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br /><br />      c.objectClass(MapBookmark.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">).minimumActivationDepth(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br /><br />      c.objectClass(MapBookmark.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">).cascadeOnDelete(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br /><br />      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> c;<br /><br />} </span></div><p>注意，为MapBookmark对象建立的索引字段是“name”，并设置激活和更新级别。<br /><br /><strong><font color="#008000" size="4">保存书签</font></strong></p><p>在这里我们调用一系列的操作，无论对象是否存在于数据库，对象都会被更新或插入。</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setBookmark(<br /><br />                        String name,<br /><br />                        String description,<br /><br />                        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> latitude,<br /><br />                        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> longitude,<br /><br />                        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> zoomLevel,<br /><br />                        </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> satellite,<br /><br />                        </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> traffic){<br /><br />     <br /><br />      MapBookmark bkm </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getBookmark(name);<br /><br />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(bkm </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><br />            bkm </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MapBookmark(name);<br /><br />      bkm.setDescription(description);<br /><br />      bkm.setLatitude(latitude);<br /><br />      bkm.setLongitude(longitude);<br /><br />      bkm.setZoomLevel(zoomLevel);<br /><br />      bkm.setSatellite(satellite);<br /><br />      bkm.setTraffic(traffic);<br /><br />      db().set(bkm);<br /><br />      db().commit();<br /><br />}</span></div><p>在保存到数据库之前，我们设置好所有字段。</p><p><strong><font color="#008000" size="4">根据名字查询书签<br /></font></strong><br />我们通过Query by Example(QBE)传入一个原型来取回以名字为条件的书签。</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> MapBookmark getBookmark(String name){<br /><br />      MapBookmark proto </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MapBookmark(name);<br /><br />      ObjectSet result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> db().get(proto);<br /><br />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(result.hasNext()){<br /><br />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (MapBookmark)result.next();<br /><br />      }<br /><br />      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><br />}</span></div><p>QBE利用反射来检查原型对象的字段。<br /><br /><strong><font color="#008000" size="4">查询所有书签</font></strong></p><p>这里我们把SODA查询结果拷贝到ArrayList中。但要注意，当使用Native Queries时你不必这样做（在这种情况下将直接返回List&lt;MapBookmark&gt;）。</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MapBookmark</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> getBookmarkList(){<br /><br />      ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MapBookmark</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> ret </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MapBookmark</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br /><br />        ObjectSet result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getBookmarks();<br /><br />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (result.hasNext())<br /><br />            ret.add((MapBookmark)result.next());<br /><br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ret;<br /><br />}<br /><br />   <br /><br /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> ObjectSet getBookmarks(){<br /><br />      Query query </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> db().query();<br /><br />      query.constrain(MapBookmark.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><br />      query.descend(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).orderAscending();<br /><br />      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> query.execute();<br /><br />}</span></div><p><strong><font color="#008000" size="4">删除书签</font></strong></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> deleteBookmark(String name) {<br /><br />      MapBookmark bkm </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getBookmark(name);<br /><br />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(bkm </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">){<br /><br />            db().delete(bkm);<br /><br />            db().commit();<br /><br />      }<br /><br />} </span></div><p>如果你的对象在db4o参考系统中存在，你可以轻松的调用delete()操作从数据库中删除它。<br /><br /><strong><font color="#008000" size="4">书签计数</font></strong></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> bookamrkCount(){<br /><br />      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> getBookmarks().size();<br /><br />}<br /><br />   <br /><br /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> ObjectSet getBookmarks(){<br /><br />      Query query </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> db().query();<br /><br />      query.constrain(MapBookmark.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br /><br />      query.descend(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).orderAscending();<br /><br />      </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> query.execute();<br /><br />}</span></div><p><br />要通过查询来进行对象计数，你只要询问查询结果的大小即可。<br /><br /><strong><font color="#008000" size="5">待完成</font></strong></p><ul><li>基于书签的查询功能（通过db4o查询）
</li><li>支持手势识别(gesture recognition)（<a href="http://code.google.com/android/reference/com/google/android/maps/GestureDetector.html">链接</a>）
</li><li>当前位置提示(Tweet current location)（<a href="http://davanum.wordpress.com/2007/11/21/twitter-client-for-android-how-to-make-xml-over-http-calls/">链接</a>）
</li><li>把跟踪到的GPS位置接收到屏幕上并把GPS路线存储到数据库上（以便今后查看）
</li><li>把位置发送给联系人（短消息、e-mail等）</li></ul><p><strong><font color="#008000" size="5">下载</font></strong><br /><br /><a href="http://developer.db4o.com/ProjectSpaces/view.aspx/MapMe/MapMe.Zip">MapMe.Zip</a><br /><a href="http://www.youtube.com/watch?v=uHNQKM7Qxhs">YouTube上的MapMe视频</a><br /><a href="http://smartware.com.ar/tutorials/MapMe.avi">高分辨率视频</a>(30 Mb)<br /><br /><span id="ctl00_ctl00_bcr_topicView___TopicBody"><span id="ctl00_ctl00_bcr_topicView___TopicBody"><span style="FONT-FAMILY: 宋体"><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原译者：RosenJiang 以及出处：</font></strong><a href="/rosen/archive/2007/02/rosen/rosen/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></span></span></span></p><img src ="http://www.blogjava.net/rosen/aggbug/167622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2007-12-13 23:44 <a href="http://www.blogjava.net/rosen/archive/2007/12/13/167622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么Android将掀起一场手机领域的狂风(Why Android will start the mobile Tornado)</title><link>http://www.blogjava.net/rosen/archive/2007/12/02/164654.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sun, 02 Dec 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2007/12/02/164654.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/164654.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2007/12/02/164654.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/164654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/164654.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 译者																																						序																																																																						 																								整个						2007...&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2007/12/02/164654.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/164654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2007-12-02 16:46 <a href="http://www.blogjava.net/rosen/archive/2007/12/02/164654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战 OpenLaszlo 与 db4o</title><link>http://www.blogjava.net/rosen/archive/2007/08/12/136191.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sun, 12 Aug 2007 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2007/08/12/136191.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/136191.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2007/08/12/136191.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/136191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/136191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: RIA，OpenLaszlo 与 db4o 搭配也不错。&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2007/08/12/136191.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/136191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2007-08-12 16:45 <a href="http://www.blogjava.net/rosen/archive/2007/08/12/136191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源面向对象数据库 db4o 之旅: 深入 db4o “db4o 之旅（三）”</title><link>http://www.blogjava.net/rosen/archive/2006/12/30/91052.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sat, 30 Dec 2006 11:11:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/12/30/91052.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/91052.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/12/30/91052.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/91052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/91052.html</trackback:ping><description><![CDATA[
		<p>
				<a name="N10082">
						<span class="atitle">
								<strong>
										<font size="4">前言</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在开源面向对象数据库 <a href="http://www.ibm.com/developerworks/cn/java/j-db4o/"><i><font color="#996699">db4o 之旅</font></i></a> 系列文章的第 1 部分：<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o1/"><font color="#5c81a7">初识 db4o</font></a> 中，作者介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较； 在第 2 部分：<a href="http://www.ibm.com/developerworks/cn/java/j-lo-db4o2/"><font color="#996699">db4o 查询方式</font></a>中, 作者介绍了 db4o 的三种不同的查询方式：QBE、SODA 以及 Native Queries，并分别通过这三种不同的途径实现了两个关联对象的查询。</p>
		<p>前面我们已经介绍了如何在 db4o 中查询以及添加对象，在本文中我们将会向您介绍在 db4o 中如何对对象进行更新以及删除操作。<br /> </p>
		<p>
				<a name="N1009C">
						<font size="4">
								<strong>
										<span class="atitle">更新数据</span>
								</strong>
						</font>
				</a>
		</p>
		<p>
				<b>场景一</b>
		</p>
		<p>我们来设想这样的场景：一位名叫“张三”的人买了车，并上好了牌照（如本系列第二部分之代码），而他基本信息的地址并不详细，只写了“成都市”，在一次主管部门检查此人信息的时候，发现了这个问题，并立即着手修改。</p>
		<p>在 db4o 中，我们这样来实现对这个用户信息的修改（<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code1"><font color="#5c81a7">清单1</font></a>）：</p>
		<p>
				<br />
				<a name="code1">
						<b>清单1. 修改地址</b>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
package com;

import bo.People;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			ObjectSet&lt;People&gt; result = db.query(new Predicate&lt;People&gt;() {
			    public boolean match(People people) {
			        return people.getName().equals("张三");
			    }
			});
			People people = result.next();
			//修改地址
			people.setAddress("成都市金牛区xxx号");
			db.set(people);
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>修改数据是如此的简单，通过 NQ 查询出 People 对象，接着修改其地址，最后保存即可。现在我们来看看修改是否成功, 打开 ObjectManager ，如<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig1"><font color="#5c81a7">图 1</font></a> 所示，我们可以看到数据库里的用户数据已经更新了。</p>
		<p>
				<br />
				<a name="fig1">
						<b>图1. 修改地址</b>
				</a>
				<br />
				<br />
				<img height="388" alt="db4o31.jpg" src="http://www.blogjava.net/images/blogjava_net/rosen/db4o31.jpg" width="552" border="0" />
		</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>
				<b>场景二</b>
		</p>
		<p>让我们考虑下面这个场景:<br />由于工作原因，“张三”要离开省会去其他城市发展，他的汽车也要在那里使用，为了方便，他还是决定重新更换为本地牌照。 </p>
		<p>这次我们几乎和场景一采用同样的代码，但结果却不同（<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code2"><font color="#5c81a7">清单2</font></a>）：</p>
		<p>
				<br />
				<a name="code2">
						<b>清单2. 修改地址和车牌（不成功）</b>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
package com;

import bo.People;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			ObjectSet&lt;People&gt; result = db.query(new Predicate&lt;People&gt;() {
			    public boolean match(People people) {
			        return people.getName().equals("张三");
			    }
			});
			People people = result.next();
			//修改地址
			people.setAddress("绵阳市xx区xxx号");
			//修改车牌号
			people.getAutoInfoList().get(0).setLicensePlate("川B00000");
			db.set(people);
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>想必应该保存成功了吧，只是多加入了设置车牌的代码。打开 ObjectManager，如<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig2"><font color="#5c81a7">图 2</font></a> 所示。很奇怪，地址保存成功了，而车牌却根本没变化。</p>
		<p>
				<br />
				<a name="fig2">
						<b>图2. 修改地址和车牌（不成功）</b>
				</a>
				<br />
				<br />
				<img height="391" alt="db4o32.jpg" src="http://www.blogjava.net/images/blogjava_net/rosen/db4o32.jpg" width="564" border="0" />
		</p>
		<p>其实这也是 db4o 的有意安排。设想一个复杂对象有很多成员，并且这些成员又有自己的成员。当更新该对象，db4o 将不得不更新其所有的关联对象、关联对象的关联对象，等等。这将引起严重的性能惩罚，而且在大部分的情况下是没有必要这样的。</p>
		<p>db4o 引入了“更新深度(update depth)”这一概念来控制被更新的对象成员树深度。默认的更新深度是 1，这就意味着只有基本类型和 String 类型的成员变量可以被更新，而修改对象成员将得不到任何反映，例如本例中修改 People 对象的 _autoInfoList 成员。</p>
		<p>为了能更新成员对象，ob4o 提供了 cascadeOnUpdate() 方法，该方法必须在每次开启数据库之前设置<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code3"><font color="#5c81a7">清单3</font></a>：</p>
		<p>
				<br />
				<a name="code3">
						<b>清单3. 修改地址和车牌（成功）</b>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
package com;

import bo.People;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
        //级联设置
		Db4o.configure().objectClass("bo.People")
        .cascadeOnUpdate(true);
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			ObjectSet&lt;People&gt; result = db.query(new Predicate&lt;People&gt;() {
			    public boolean match(People people) {
			        return people.getName().equals("张三");
			    }
			});
			People people = result.next();
			//修改地址
			people.setAddress("绵阳市xx区xxx号");
			//修改车牌号
			people.getAutoInfoList().get(0).setLicensePlate("川B00000");
			db.set(people);
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这下终于如愿以偿，如<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig3"><font color="#5c81a7">图 3</font></a> 所示。其实 db4o 为开发者想得很周到，关键是如何用好这些特性。</p>
		<p>
				<br />
				<a name="fig3">
						<b>图3. 修改地址和车牌（成功）</b>
				</a>
				<br />
				<br />
				<img height="379" alt="db4o33.jpg" src="http://www.blogjava.net/images/blogjava_net/rosen/db4o33.jpg" width="553" border="0" />
				<br />
		</p>
		<p>
				<a name="N10132">
						<span class="atitle">
								<font size="4">
										<strong>删除数据</strong>
								</font>
						</span>
				</a>
		</p>
		<p>
				<b>场景三</b>
		</p>
		<p>“张三”换了工作后，事业发展很快，准备把车卖了换新的，于是他去交管部门办理移交手续，删除关联的车辆信息<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code4"><font color="#5c81a7">清单4</font></a>：</p>
		<p>
				<br />
				<a name="code4">
						<b>清单4. 删除车辆</b>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
package com;

import bo.AutoInfo;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			ObjectSet&lt;AutoInfo&gt; result = db.query(new Predicate&lt;AutoInfo&gt;() {
			    public boolean match(AutoInfo ai) {
			    	//匹配姓名和车牌号
			        return ai.getLicensePlate().equals("川B00000") 
			        	   &amp;&amp; ai.getOwnerNo().getName().equals("张三");
			    }
			});
			AutoInfo ai = result.next();
			//删除车辆信息
			db.delete(ai);
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#fig4"><font color="#5c81a7">图 4</font></a> 所示，所关联的车辆信息已被删除了。</p>
		<p>
				<br />
				<a name="fig4">
						<b>图4. 删除车辆信息</b>
				</a>
				<br />
				<br />
				<img height="379" alt="db4o34.jpg" src="http://www.blogjava.net/images/blogjava_net/rosen/db4o34.jpg" width="553" border="0" />
		</p>
		<p>
				<b>场景四</b>
		</p>
		<p>在场景三的基础上修改一下，设想“张三”由于工作不顺，导致最后维护汽车的开支都困难，他不得不退出有车一族的行列<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o3/index.html#code5"><font color="#5c81a7">清单5</font></a>：</p>
		<p>
				<br />
				<a name="code5">
						<b>清单5. 删除所有信息</b>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">				
package com;

import bo.People;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
        //级联设置
		Db4o.configure().objectClass("bo.People")
        .cascadeOnDelete(true);
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			ObjectSet&lt;People&gt; result = db.query(new Predicate&lt;People&gt;() {
			    public boolean match(People people) {
			    	//匹配姓名
			        return people.getName().equals("张三");
			    }
			});
			People people = result.next();
			//删除车主以及关联的车辆信息
			db.delete(people);
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>用过 Hibernate 的开发者都知道，它的级联删除让人留下了深刻印象，第一次使用的时候都会为之振奋。db4o 也为开发者提供了级联删除，和场景二的级联更新一样， cascadeOnDelete() 是专门为删除准备的，基本概念和 cascadeOnUpdate() 一致。打开 ObjectManager 我们会发现数据库已经清空了，张三的购车经历到此结束。<br /> </p>
		<p>
				<a name="N1017F">
						<span class="atitle">
								<font size="4">
										<strong>结论</strong>
								</font>
						</span>
				</a>
		</p>
		<p>通过本系列文章，db4o 的优势已经体现得淋漓尽致，它的添加、更新、删除是如此的简单，正如 db4o 的口号那样——“仅需一行代码就能存储复杂结构对象，极大的降低了开发时间和成本，提供高效的性能，无需 DBA 干预”。</p>
		<p>如本文有不详尽之处，大家可以参考官方的《用户指南》或访问 <a href="http://developer.db4o.com/forums/10/ShowForum.aspx"><font color="#5c81a7">db4o 官方中文论坛</font></a>，db4o 中文社区正在火热成长！<br /> </p>
		<p>
				<a name="resources">
						<span class="atitle">
								<font size="4">
										<strong>参考资料</strong>
								</font>
						</span>
				</a>
		</p>
		<p>
				<b>学习</b>
				<br />
		</p>
		<ul>
				<li>db4o <a href="http://www.db4o.com/"><font color="#996699">官方网站</font></a> 。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/java/j-db4o/">
								<i>
										<font color="#996699">面向对象数据库 db4o 之旅系列</font>
								</i>
						</a>：查看此系列文章完整列表。<br /><br /></li>
				<li>
						<a href="http://www.odmg.org/">
								<font color="#5c81a7">ODMG 官方网站</font>
						</a>：了解 ODMG 技术。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/java/">
								<font color="#5c81a7">developerWorks Java 技术专区</font>
						</a>：数百篇关于 Java 编程各个方面的文章。 <br /></li>
		</ul>
		<p>
				<br />
				<b>获得产品和技术</b>
				<br />
		</p>
		<ul>
				<li>
						<a href="http://www.db4o.com/china?src=cn">
								<font color="#5c81a7">下载 db4o 免费版</font>
						</a>。<br /></li>
		</ul>
		<p>
				<br />
				<b>讨论</b>
				<br />
		</p>
		<ul>
				<li>db4o <a href="http://developer.db4o.com/forums/"><font color="#5c81a7">开发者论坛</font></a>：讨论 db4o 技术。<br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=181&amp;cat=10">
								<font color="#5c81a7">developerWorks Java 论坛</font>
						</a>：学习 Java 技术。 <br />  </li>
		</ul>
		<p>
				<a name="author">
						<span class="atitle">
								<strong>
										<font size="4">作者简介</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3"> </td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>Rosen Jiang 来自成都，是 db4o 和 OO 的忠实 fans，是 2005 年 db4o 的 dvp 获得者之一。他正在 J2me 应用中使用 db4o，你可以通过 <a href="mailto:rosener_722@hotmail.com?cc="><font color="#5c81a7">rosener_722@hotmail.com</font></a> 和他联系。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>Chris 来自香港，热爱开源和 db4o。他创办了中国最火热的 Java 和开源社区 Matrix（http://www.Matrix.org.cn）， 你可以通过 <a href="mailto:chris@Matrix.org.cn?cc="><font color="#5c81a7">chris@Matrix.org.cn</font></a> 和他联系。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>张黄瞩，热爱开源软件，熟悉 Java/C/C++ 编程语言，对数据库技术网络技术均感兴趣。你可以通过 <a href="mailto:zhanghuangzhu@gmail.com?cc="><font color="#5c81a7">zhanghuangzhu@gmail.com</font></a> 联系他。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<strong>
				<font face="Arial" color="#ff0000">IBM DeveloperWorks(IBM DW) 版权所有！引用、转贴本文应注明本文来自 IBM DW。</font>
		</strong>
<img src ="http://www.blogjava.net/rosen/aggbug/91052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-12-30 19:11 <a href="http://www.blogjava.net/rosen/archive/2006/12/30/91052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源面向对象数据库 db4o 之旅: db4o 查询方式“db4o 之旅（二）” </title><link>http://www.blogjava.net/rosen/archive/2006/11/21/82529.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 21 Nov 2006 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/11/21/82529.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/82529.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/11/21/82529.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/82529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/82529.html</trackback:ping><description><![CDATA[
		<p>
				<a name="N1007D">
						<span class="atitle">
								<font size="5">
										<strong>
												<font size="4">前言</font>
										</strong>
								</font>
						</span>
				</a>
		</p>
		<p>在 <i>开源面向对象数据库 db4o 之旅</i> 系列文章的第一部分：<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o1/"><font color="#996699">初识 db4o</font></a> 中，作者介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较。在这篇文章中，作者将会介绍 db4o 的安装、启动以及三种不同的查询方式：QBE（Query by Example）、SODA（Simple Object Database Access） 以及 NQ（Native Queries），并分别通过这三种不同的途径实现了两个关联对象的查询。本文还示范了开发中最经常用到的几个典型功能的 db4o 实现。</p>
		<br />
		<p>
				<a name="N1008E">
						<span class="atitle">
								<font color="#000000" size="5">
										<strong>
												<font size="4">下载和安装 db4o</font>
										</strong>
								</font>
						</span>
				</a>
		</p>
		<p>db4o 所有最新的版本都可以直接在官方网站上下载，进入 db4o 的<a href="http://www.db4o.com/community" target="_blank"><font color="#996699">下载页面</font></a>，我们可以看到最新的 for Java 稳定版本是 5.5，包括 JAR、源代码、入门文档、API 等内容的完整的打包文件只有 6 MB，db4o 还有一个对象数据库管理工具 ObjectManager，目前版本是 1.8（请在参考资源中<a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o2/index.html#resources"><font color="#996699">下载</font></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>
		<br />
		<p>
				<a name="N100A4">
						<span class="atitle">
								<font size="5">
										<strong>
												<font size="4">开启数据库</font>
										</strong>
								</font>
						</span>
				</a>
		</p>
		<p>db4o 怎样进行对象持久化呢？通过浏览目录可以发现，与传统的 RDBMS 一样，db4o 也有自己的数据库文件, 在 db4o 中数据库文件的后缀名是“*.yap”。让我们先来了解一下 db4o 对象数据库引擎的主要包结构：</p>
		<ul>
				<li>
						<b>com.db4o</b>
						<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>
						<b>com.db4o.ext</b>
						<br />你也许想知道为什么在 ObjectContainer 中只能看见很少的方法，原因如下：db4o 接口提供了两个途径，分别在 com.db4o 和 com.db4o.ext 包中。这样做首先是为了让开发者能快速上手；其次为了让其他产品能更容易的复制基本的 db4o 接口；开发者从这一点上也能看出 db4o 是相当轻量级的。每个 com.db4o.ObjectContainer 对象也是 com.db4o.ext.ExtObjectContainer 对象。可以转换成 ExtObjectContainer 获得更多高级特性。 
</li>
				<li>
						<b>com.db4o.config</b>
						<br />com.db4o.config 包含了所有配置 db4o 所需的类。 
</li>
				<li>
						<b>com.db4o.query</b>
						<br />com.db4o.query 包包含了构造“原生查询, NQ（Native Queries）”所需的 Predicate 类。NQ 是 db4o 最主要的查询接口。 </li>
		</ul>
		<p>db4o 提供两种运行模式，分别是本地模式和服务器模式。本地模式是指直接在程序里打开 db4o 数据库文件进行操作：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">ObjectContainer db = Db4o.openFile("auto.yap");
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>而服务器模式则是客户端通过 IP 地址、端口以及授权口令来访问服务器：</p>服务器端： 
<table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">ObjectServer server=Db4o.openServer("auto.yap",1212);
server.grantAccess("admin","123456");
</pre></td></tr></tbody></table><br />客户端： 
<table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">ObjectContainer db=Db4o.openClient("192.168.0.10",1212,"admin","123456");
</pre></td></tr></tbody></table><br /><p>两种方式都可以得到 ObjectContainer 实例，就目前 Java EE 应用环境来看，服务器模式更有现实意义；而本地模式更适合于嵌入式应用。为了简化演示，本文在下面的例子都将采用本地模式。</p><p>在下面的例子里，我们都会用到下面两个对象： People 和 AutoInfo 对象。</p><p>People 对象：</p><br /><a name="code1"><b>清单1. People 对象</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package bo;

public class People {

	private java.lang.Integer _id;
	private java.lang.String _name;
	private java.lang.String _address;
	private java.util.List&lt;AutoInfo&gt; _autoInfoList;

	public java.lang.Integer getId() {
		return _id;
	}

	public void setId(java.lang.Integer _id) {
		this._id = _id;
	}

	public java.lang.String getName() {
		return _name;
	}

	public void setName(java.lang.String _name) {
		this._name = _name;
	}

	public java.lang.String getAddress() {
		return _address;
	}

	public void setAddress(java.lang.String _address) {
		this._address = _address;
	}

	public java.util.List&lt;AutoInfo&gt; getAutoInfoList() {
		return this._autoInfoList;
	}

	public void addAutoInfo(AutoInfo _autoInfoList) {
		if (null == this._autoInfoList)
			this._autoInfoList = new java.util.ArrayList&lt;AutoInfo&gt;();
		this._autoInfoList.add(_autoInfoList);
	}

}
</pre></td></tr></tbody></table><br /><p>AutoInfo 对象：</p><br /><a name="code2"><b>清单2. AutoInfo 对象</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package bo;

public class AutoInfo{

	private java.lang.Integer _id;
	private java.lang.String _licensePlate;
	private bo.People _ownerNo;

	public java.lang.Integer getId () {
		return _id;
	}

	public void setId (java.lang.Integer _id) {
		this._id = _id;
	}

	public java.lang.String getLicensePlate () {
		return _licensePlate;
	}

	public void setLicensePlate (java.lang.String _licensePlate) {
		this._licensePlate = _licensePlate;
	}

	public bo.People getOwnerNo () {
		return this._ownerNo;
	}

	public void setOwnerNo (bo.People _ownerNo) {
		this._ownerNo = _ownerNo;
	}

}
</pre></td></tr></tbody></table><br /><p>利用 set 方法把新对象存入 ObjectContainer，而对 ObjectContainer 中已有对象进行 set 操作则是更新该对象。db4o 保存数据库很简单，下面就是一个段完整的保存对象的代码：</p><p>AutoInfo 对象：</p><br /><a name="code3"><b>清单3</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package com;

import bo.AutoInfo;
import bo.People;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			//构造 People 对象
			People peo = new People(); 
			peo.setId(1);
			peo.setAddress("成都市");
			peo.setName("张三");
			//构造 AutoInfo 对象
			AutoInfo ai = new AutoInfo();
			ai.setId(1);
			ai.setLicensePlate("川A00000");
			//设置 People 和 AutoInfo 的关系
			ai.setOwnerNo(peo);
			peo.addAutoInfo(ai);
			//保存对象
			db.set(peo);
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre></td></tr></tbody></table><br /><p>当我们运行上述代码，db4o 会自动创建“auto.yap”文件。让我们来看看到底保存成功没有，打开 ObjectManager 工具，<font color="#996699"></font>图 1 所示。</p><br /><a name="fig1"><b>图1. 对象数据库管理工具</b></a><br /><img alt="图1. 对象数据库管理工具" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o2/figures/1.jpg" /><br /><p>“File”－&gt;“Open File”－&gt;选择刚才我们保存的“auto.yap”文件（“auto.yap”文件可在项目的根目录下找到），最新的 ObjectManager 1.8 版本为我们提供了“Read Only”方式读取数据库文件，避免 ObjectManager 占用数据库文件所导致的程序异常。</p><p>打开之后，图 2 所示，刚才存贮的 People 对象已经在数据库中了，并且还可以很直观的看到 AutoInfo 对象也放入了 ArrayList 中。这种可视化的对象关系有利于我们对数据的理解，是传统 RDBMS 无法比拟的。有些开发者会说 ObjectManager 工具略显简单，这点我想随着 db4o 的不断发展会加入更多的特性。在这个工具中，我们意外的发现了 Java 集合对象的踪影，db4o 把与 ArrayList 有直接关系的所有接口和父类都保存了，这样显得更直观。</p><p>在此，我保留了 _id 属性，这是因为通常在 Java EE 环境中，DAO 第一次不是把整个对象都返回到表现层，而是只返回了“标题”、“发布时间”这些信息（并隐式的返回id），接着 DAO 与数据库断开；要查看详情（比如文章内容）就需要进行 findById 操作，这时 DAO 要再次与数据库交互，只有唯一标识符才能正确地找到对象。这种<i>懒加载</i>方式也是很多书籍所推荐的。</p><p>回到本文的范例程序中，这个 _id 属性可由人工编码实现的“序列”进行赋值，当然 db4o 也提供了内部标识符 Internal IDs，图 2 中的 id=1669；以及 UUIDs。</p><br /><a name="fig2"><b>图2. 对象结构</b></a><br /><img alt="图2. 对象结构" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o2/figures/2.jpg" /> <br /><br /><br /><p><a name="N10157"><span class="atitle"><strong><font size="4">查询数据库</font></strong></span></a></p><p>和 RDBMS 一样，db4o 也有自己的查询语言，分别是 QBE（Query by Example）、NQ（Native Queries）、SODA（Simple Object Database Access），db4o 更推荐使用 NQ 进行查询。NQ 方式提供了非常强大的查询功能，支持原生语言，也就意味着你可以使用 Java 来判断该对象是否符合条件，这是其他数据库查询语言无法比拟的。在某些情况下， db4o 核心会将 NQ 翻译成 SODA 以获得更高的性能。下面详细介绍一下这三种查询语言。</p><br /><p><a name="N10161"><span class="atitle"><strong><font size="4">QBE（Query by Example）</font></strong></span></a></p><p>QBE 规范可在<a href="http://www.cs.wisc.edu/~dbbook/openAccess/thirdEdition/qbe.pdf"><font color="#5c81a7">这里下载</font></a>。QBE 最初由 IBM 提出，同时业界也有许多和 QBE 兼容的接口，包括著名的 Paradox。有些系统，比如微软的 Access，它的基于表单的查询也是受到了部分 QBE 思想的启发。在 db4o 中，用户可借用 QBE 快速上手，可以很容易适应 db4o 存取数据的方式。</p><p>当利用 QBE 为 db4o 提供模板（example）对象时，db4o 将返回所有和非默认值字段匹配的全部对象。内部是通过反射所有的字段和构造查询表达式（所有非默认值字段结合”AND”表达式）来实现。</p><p>例如，利用 QBE 查找到车牌号为“川A00000”的车主姓名，这是一个级联查询。</p><br /><a name="code4"><b>清单4</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package com;

import java.util.List;

import bo.AutoInfo;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			//构造模板对象
			AutoInfo ai = new AutoInfo();
			ai.setLicensePlate("川A00000");
			//查询对象
			List&lt;AutoInfo&gt; list = db.get(ai);
	    	for(int x = 0; x &lt; list.size(); x++){
	    		System.out.println("车主姓名："+list.get(x).getOwnerNo().getName());
			}
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre></td></tr></tbody></table><br /><p>但是 QBE 也有明显的限制：db4o 必须反射模板（example）对象的所有成员；无法执行更进一步的查询表达式（例如 AND、OR、NOT 等等）；不能约束 0（整型）、””（空字符串）或者 null（对象），因为这些都被认为是不受约束的。要绕过这些限制，db4o 提供了 NQ（Native Queries）。</p><br /><p><a name="N10186"><span class="atitle"><strong><font size="4">SODA（Simple Object Database Access）</font></strong></span></a></p><p>SODA ，简单对象数据库访问，请查看<a href="http://sodaquery.sourceforge.net/"><font color="#5c81a7">官方站点</font></a>，其中一位主要维护者是 Carl Rosenberger，Carl 正是 db4o 首席架构师。</p><p>SODA 就是一种与数据库通讯的对象 API。最终的目标是实现类型安全、对象复用、最小的字符串使用、与编程语言无关等特性。SODA 是 db4o 最底层的查询 API，目前 SODA 中使用字符串来定义字段，这样将不能实现类型安全也无法在编译时检查代码，而且写起来较麻烦，当然要达到设计目标这个阶段是必须的。大部分情况下 NQ（Native Queries）是很好的查询接口，不过遇到动态生成查询的时候 SODA 就大有作为了。</p><p>通过 SODA 查找到车牌号为“川A00000”的车主姓名：</p><br /><a name="code5"><b>清单5</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package com;

import java.util.List;

import bo.AutoInfo;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.query.Query;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			//构造查询对象
			Query query=db.query();
			//设置被约束实例
			query.constrain(AutoInfo.class);
			//设置被约束实例的字段和约束条件
			query.descend("_licensePlate").constrain("川A00000");
			//查询对象
			List&lt;AutoInfo&gt; list = query.execute();
	    	for(int x = 0; x &lt; list.size(); x++){
	    		System.out.println("车主姓名："+list.get(x).getOwnerNo().getName());
			}
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre></td></tr></tbody></table><br /><p>通过 API，发现 Query 实例增加了 sortBy 按字段排序方法和 orderAscending正序、orderDescending 倒序排列方法，SODA 比 QBE 更进了一步。</p><br /><p><a name="N101AB"><span class="atitle"><strong><font size="4">NQ（Native Queries）</font></strong></span></a></p><p>精彩总是在最后出场，NQ 才是 db4o 查询方式中最精彩的地方！有没有想过用你熟悉的的编程语言进行数据库查询呢？要是这样，你的查询代码将是 100% 的类型安全、100% 的编译时检查以及 100% 的可重构，很奇妙吧？NQ 可以做到这些。</p><p>有两篇论文专门讲解了 NQ 的基本概念和设计思路，分别是 <a href="http://www.db4o.com/china/Native%20Queries%20Whitepaper(Chinese).pdf"><font color="#5c81a7">《Cook/Rosenberger，持久对象原生数据库查询语言》</font></a> 和 《Cook/Rai，Safe Query Objects: Statically Typed Objects as Remotely Executable Queries》。作为结果集的一部分，NQ 表达式必须返回 true 值来标记特定实例。如果可能的话 db4o 将尝试优化 NQ 表达式，并依赖索引来运行表达式。</p><p>通过 NQ 查找到车牌号为“川A00000”的车主姓名：</p><br /><a name="code6"><b>清单6</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package com;

import java.util.List;

import bo.AutoInfo;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			List &lt;AutoInfo&gt; list = db.query(new Predicate&lt;AutoInfo&gt;() {
				public boolean match(AutoInfo ai) {
			    	//这样才是类型安全的
			        return ai.getLicensePlate().equals("川A00000");
			    }
			});
	    	for(int x = 0; x &lt; list.size(); x++){
	    		System.out.println(list.get(x).getOwnerNo().getName());
			}
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre></td></tr></tbody></table><br /><p>必须指出 NQ 的一个的问题是：在内部，db4o 设法把 NQ 转换成 SODA。但并不是所有的查询表达式都可以成功转换。有些查询表达式的流向图（flowgraph）非常难于分析。这种情况下，db4o 将不得不实例化一些持久对象来真实地运行 NQ 表达式。</p><p>正在开发中的 NQ 查询优化器就可以化解这个障碍，它将分析 NQ 表达式的每个部分，以确保最少量的实例化对象，以此提高性能。当然，优化器的不是灵丹妙药，关键还需要自己多优化代码。</p><p>开发 Java EE 项目经常会用到分页，怎样用 NQ 实现呢？向数据库写入六条记录：</p><br /><a name="code7"><b>清单7</b></a><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">				
package com;

import java.util.List;

import bo.AutoInfo;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.query.Predicate;

public class DB4OTest{
	
	public static void main(String[] args){
		//打开数据库
		ObjectContainer db = Db4o.openFile("auto.yap");
		try{
			List&lt;AutoInfo&gt; list = db.query(new Predicate&lt;AutoInfo&gt;() {
				public boolean match(AutoInfo ai) {
			        return true;
			    }
			});
			//记录总数
			Integer count = list.size();
			//每页两条，分三页
	    	for(int x = 0; x &lt; 3; x++){
	    		System.out.println("第"+x+"页："+list.get(x*2).getLicensePlate());
	    		System.out.println("第"+x+"页："+list.get(x*2+1).getLicensePlate());
			}
		}finally{
			//关闭连接
			db.close();
		}
	}
}
</pre></td></tr></tbody></table><br /><p>我们发现，在进行 NQ 查询时并没有加入任何条件（无条件返回 true），是不是相当于遍历了整个数据库？db4o 的设计者早就想到了这个问题，当 db.query() 执行完毕返回 list 实例的时候，db4o 只是与数据库同步取出内部 IDs 而已，并没有把所有的 AutoInfo 对象全部取出，只有在 list.get(x*2).getLicensePlate() 之后才会去根据 IDs 取出记录。所以不必担心性能问题。</p><br /><p><a name="N101E7"><span class="atitle"><strong><font size="4">结论</font></strong></span></a></p><p>db4o 为开发者提供了多种查询方式，这些方式都很灵活。要引起大家注意的是：灵活在带来便利的同时也对开发者自身素质提出了更高的要求，（比如排序，既可以用 SODA 也可以用 Java 集合对象实现）在开发过程中一定要形成某种统一的开发模式，这样 db4o 才能最高效能地为我所用。</p><br /><br /><p><a name="resources"><span class="atitle"><strong><font size="4">参考资料</font></strong></span></a></p><b>学习</b><br /><ul><li><a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-db4o1/"><font color="#996699">“面向对象数据库 db4o 之旅，第 1 部分：初识 db4o”</font></a>：（developerWorks Java ，2006 年 10月）：介绍了 db4o 的历史和现状，应用领域，以及和 ORM 等的比较。<br /></li><li><a href="http://developer.db4o.com/forums/"><font color="#5c81a7">db4o 开发者论坛</font></a>：讨论 db4o 技术。<br /></li><li><a href="http://developer.db4o.com/forums/10/ShowForum.aspx"><font color="#5c81a7">db4o 中国开发者论坛</font></a>：讨论 db4o 技术的中文论坛。<br /></li><li><a href="http://www.odmg.org/"><font color="#5c81a7">ODMG 官方网站</font></a>：了解 ODMG 技术。<br /></li><li><a href="http://sodaquery.sourceforge.net/"><font color="#5c81a7">SODA 官方网站</font></a>：了解简单对象数据库访问技术。<br /></li><li><a href="http://www.ibm.com/developerworks/cn/java/"><font color="#5c81a7">Java 技术专区</font></a>：这里有数百篇有关 Java 编程各方面的文章。<br /></li><li><a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=181&amp;cat=10"><font color="#5c81a7">developerWorks Java 论坛</font></a>：学习 Java 技术</li></ul><br /><b>获得产品和技术</b><br /><ul><li><a href="http://www.db4o.com/"><font color="#996699">db4o 官方网站</font></a>：db4o 最新信息以及 db4o 下载。<br /></li><li><a href="http://developer.db4o.com/files/10/objectmanager_18/entry24827.aspx"><font color="#5c81a7">下载</font></a> db4o 对象数据库管理工具 ObjectManager 1.8 for Windows。</li></ul><p>作者简介</p><p><br />  Rosen Jiang 来自成都，是 db4o 和 OO 的忠实 fans，是 2005 年 db4o 的 dvp 获得者之一。他正在 J2me 应用中使用 db4o，你可以通过 <a href="mailto:rosener_722@hotmail.com">rosener_722@hotmail.com</a> 和他联系。 </p><p>  Chris 来自香港，热爱开源和 db4o。他创办了中国最火热的 Java 和开源社区 Matrix（<a href="http://www.Matrix.org.cn">http://www.Matrix.org.cn</a>）， 你可以通过 <a href="mailto:chris@Matrix.org.cn">chris@Matrix.org.cn</a> 和他联系。<br /> <br />  张黄瞩，热爱开源软件，熟悉 Java/C/C++ 编程语言，对数据库技术网络技术均感兴趣。你可以通过 <a href="mailto:zhanghuangzhu@gmail.com">zhanghuangzhu@gmail.com</a> 联系他。<br /><br /><strong><font face="Arial" color="#ff0000">IBM DeveloperWorks(IBM DW) 版权所有！引用、转贴本文应注明本文来自 IBM DW。</font></strong></p><img src ="http://www.blogjava.net/rosen/aggbug/82529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-11-21 14:21 <a href="http://www.blogjava.net/rosen/archive/2006/11/21/82529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db4o 连接池</title><link>http://www.blogjava.net/rosen/archive/2006/09/27/72314.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Wed, 27 Sep 2006 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/09/27/72314.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/72314.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/09/27/72314.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/72314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/72314.html</trackback:ping><description><![CDATA[
		<p>这几天花了点时间弄了个 db4o 连接池，比较简单，连接池原型是论坛上面的一篇文章。很简单，欢迎拍砖。<br /><br />从 servlet 开始，在这里初始化连接池：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> com;<br /><br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.File;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.Enumeration;<br /><br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletConfig;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletException;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.http.HttpServlet;<br /><br /><br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> ConnectionPollServlet </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> HttpServlet {<br />    <br />    </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">final</span>
				<span style="COLOR: #000000"> String XML_FILE_PROPERTY </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">xmlFile</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br />    <br />    </span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />     * servlet init<br />     </span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />    </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> init(ServletConfig servletConfig) </span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000"> ServletException{<br />        </span>
				<span style="COLOR: #0000ff">super</span>
				<span style="COLOR: #000000">.init(servletConfig);<br />        String appDir </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> servletConfig.getServletContext().getRealPath(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br />        Enumeration names </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> servletConfig.getInitParameterNames();<br />        </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000">(names.hasMoreElements()){<br />            String name </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> (String) names.nextElement();<br />            String value </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> servletConfig.getInitParameter(name);<br />            </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (name.equals(XML_FILE_PROPERTY)) {<br />                File file </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> File(value);<br />                </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (file.isAbsolute()) {<br />                    XMLReader.configure(value);<br />                } </span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000"> {<br />                    XMLReader.configure(appDir </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> File.separator </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> value);<br />                }<br />            }<br />        }<br />    }<br /><br />    </span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />     * servlet destroy<br />     </span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />    </span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> destroy() {<br />        </span>
				<span style="COLOR: #0000ff">super</span>
				<span style="COLOR: #000000">.destroy();<br />        ConnectionPoll.destroy();<br />    }<br />}</span>
		</div>
		<br />然后是 XML 解析类：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com;<br /><br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.io.File;<br /><br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.dom4j.Document;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.dom4j.DocumentException;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.dom4j.Element;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.dom4j.io.SAXReader;<br /><br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> XMLReader {<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * parse XML file<br />     * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> xmlFileName<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> configure(String xmlFileName) {<br />        </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br />            File file </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(xmlFileName);<br />            SAXReader reader </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> SAXReader();<br />            Document doc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> reader.read(file);<br />            Element root </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> doc.getRootElement();<br /><br />            String fileName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> file.getParent()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br />                </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">root.elementText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">fileName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            String sport </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> root.elementText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">port</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            String sminConn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> root.elementText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">minConn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            String sidelTime </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> root.elementText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">idelTime</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> port </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Integer.parseInt(sport);<br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> minConn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Integer.parseInt(sminConn);<br />            </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> idelTime </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Integer.parseInt(sidelTime);<br /><br />            ConnectionPoll.init(fileName,port,minConn,idelTime);<br />        } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (DocumentException e) {<br />            e.printStackTrace();<br />        }<br />    }<br />}</span></div><br /><br />连接池类：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com;<br /><br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.concurrent.ConcurrentLinkedQueue;<br /><br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.db4o.Db4o;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.db4o.ObjectContainer;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.db4o.ObjectServer;<br /><br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ConnectionPoll {<br /><br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> idelTime;<br />    <br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> ConcurrentLinkedQueue</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ObjectContainer</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> connectionQueue;<br />    <br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> ConnectionPoll(){<br />    }<br />    <br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * init pool<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init(String fileName,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> port,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> minConn,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> it) {<br />        idelTime</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">it;<br />        ObjectServer objectServer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Db4o.openServer(fileName,port);<br />        connectionQueue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ConcurrentLinkedQueue</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ObjectContainer</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">minConn; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br />            connectionQueue.offer(objectServer.openClient());<br />        }<br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * get connection<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"> ObjectContainer<br />     * </span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000"> ConnectionTimeoutException <br />     * </span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000"> InterruptedException<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> ObjectContainer getConnection() </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> ConnectionTimeoutException{<br />        </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> expiration </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> System.currentTimeMillis() </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> idelTime;<br />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (connectionQueue.isEmpty())<br />        {<br />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (expiration </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> System.currentTimeMillis())<br />            {<br />                </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ConnectionTimeoutException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">connection timeout!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            }<br />        }<br />        ObjectContainer objectContainer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> connectionQueue.poll();<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> objectContainer;<br />        }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * release connection<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"> ObjectContainer<br />     * </span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000"> InterruptedException<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> releaseConnection(ObjectContainer objectContainer) {<br />        connectionQueue.offer(objectContainer);<br />    }<br />    <br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * destroy connection<br />     *<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> destroy() {<br />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (connectionQueue.iterator().hasNext()){<br />            ObjectContainer objectContainer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> connectionQueue.poll();<br />            objectContainer.close();<br />        }<br />    }<br />}</span></div><br />超时异常类：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com;<br /><br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ConnectionTimeoutException </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> Exception{<br /><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ConnectionTimeoutException()<br />    {<br />    }<br /><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ConnectionTimeoutException(String s)<br />    {<br />        </span><span style="COLOR: #0000ff">super</span><span style="COLOR: #000000">(s);<br />    }<br />}</span></div><br />XML 配置文件，从上到下依次是，数据库文件名、端口、初始连接数、等待时间：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="utf-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">config</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">fileName</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">auto.yap</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">fileName</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">port</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1010</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">port</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">minConn</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">minConn</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">idelTime</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">idelTime</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">config</span><span style="COLOR: #0000ff">&gt;</span></div><br />web.xml 用于初始化的时候加载：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />  </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">ConnectionPoll</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">com.ConnectionPollServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">xmlFile</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">WEB-INF/poolConfig.xml</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />      </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />  </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span></div><br /><br />数据库文件和参数配置文件都放在 WEB-INF 文件夹下。这个连接池还未实现 maxConn（最大连接数）和对多数据库文件的支持以及日志等。<br /><br /><br /><strong><font face="Arial" color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a><img src ="http://www.blogjava.net/rosen/aggbug/72314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-09-27 15:26 <a href="http://www.blogjava.net/rosen/archive/2006/09/27/72314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dRS 产品信息 V1.0（中文版）</title><link>http://www.blogjava.net/rosen/archive/2006/08/09/62669.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Wed, 09 Aug 2006 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/08/09/62669.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/62669.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/08/09/62669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/62669.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/62669.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: "dRS Product Information V1.0" 中文版发布了，请在这里下载：																								dRS 产品信息 V1.0 中文版																				。						-------------------------------------------1.0 版本																...&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2006/08/09/62669.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/62669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-08-09 23:14 <a href="http://www.blogjava.net/rosen/archive/2006/08/09/62669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源面向对象数据库 db4o 之旅: 初识 db4o“db4o 之旅（一）”</title><link>http://www.blogjava.net/rosen/archive/2006/06/15/53094.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Thu, 15 Jun 2006 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/06/15/53094.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/53094.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/06/15/53094.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/53094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/53094.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很多开发者对 hibernate 性能表示置疑，下一次技术革新会是什么呢？——对象数据库<br>本文为 db4o 之旅系列文章的第一篇，介绍了面向对象数据库 db4o 的基本特性，并且与传统关系型数据库以及 OR 映射技术做了比较分析，读者可以体验到 db4o 的全新的面向对象存储的理念，并且给出了性能测试数据。&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2006/06/15/53094.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/53094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-06-15 21:39 <a href="http://www.blogjava.net/rosen/archive/2006/06/15/53094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>持久对象原生数据库查询语言（中文版）</title><link>http://www.blogjava.net/rosen/archive/2006/02/26/32519.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sun, 26 Feb 2006 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/02/26/32519.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/32519.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/02/26/32519.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/32519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/32519.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 持久对象原生数据库查询语言																																																														设计白皮书																																																						 											...&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2006/02/26/32519.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/32519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-02-26 20:21 <a href="http://www.blogjava.net/rosen/archive/2006/02/26/32519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>