快速业务通道

Java理论与实践:在没有数据库的情况下进行数据库查询 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

Java理论与实践:在没有数据库的情况下进行数据库查询

时间:2010-12-20 IBM Brian Goetz

我最近仔细考察了一个项目,该项目涉及相当多的 Web 快速搜索。当爬虫程 序爬过不同的 Web 站点时,它将建立一个数据库,该数据库中包括它所爬过的 站点和网页、每一页所包含的链接、每一页的分析结果等数据。最终结果是一组 报告,详细说明经过了哪些站点和页面、哪些是一直链接的、哪些链接已经断开 、哪些页面有错误、计算出的页面规格,等等。开始的时候,没人确切知道需要 什么样的报告,或者应当采用什么样的格式 —— 只知道有一些内容要报告。这 表明报告开发阶段会是一个反复的阶段,要经过多次反馈、修改,并且可能尝试 使用不同的结构。惟一确定的报告要求是,报告应当以 XML 形式展示,也可能 以 HTML 形式展示。因此,开发和修改报告的过程必须是轻量级的,因为报告要 求是“动态发现”的,而不是预先指定的。

不需要数据库

对这个问题的“最显而易见的”解决方法是将所有东西都放入 SQL 数据库中 —— 页面、链接、度量标准、HTTP 结果代码、计时结果和其他元数据。这个问 题可以借助关系表示来很好地解决,特别是因为这种方法不需要存储已访问页面 的内容,只需要存储它们的结构和元数据。

到目前为止,这个项目看起来像是一个典型的数据库应用程序,并且它并不 缺少可供选择的持久性策略。但是,或许可以避免使用数据库持久存储数据的复 杂性 —— 这个快速搜索工具(crawler)只访问数万个页面。这个数字不是很 大,因此可以将整个数据库放在内存中,当需要持久存储数据时,可以通过序列 化来实现它。(是的,加载和保存操作要花费较长的时间,但是这些操作并不经 常执行。)懒惰反而带来了一个好处 —— 不需要处理持久性极大地缩短了开发 应用程序的时间,因而显著地减少了开发工作量。构建和操纵内存中的数据结构 要比每次添加、提取或者分析数据时都使用数据库容易得多。不管选择了哪种持 久存储模型,都会限制任何触及到数据的代码的构造。

内存中的数据结构是一种树型结构,如清单 1 所示,它的根是快速搜索过的 各个网站的主页,因此 Visitor 模式是搜索这些主页或者从中提取数据的理想 模式。(构建一个防止陷入链接循环 —— A 链接到 B、B 链接到 C、C 链接到 A —— 的基本 Visitor 类并不是很难。)

清单 1. Web 爬行器的一个简化方案

public class Site {    Page homepage;    Collection<Page> pages;    Collection<Link> links; } public class Page {    String url;    Site site;    PageMetrics metrics; } public class Link {    Page linkFrom;    Page linkTo;    String anchorText; }

这个快速搜索工具的应用程序中有十多个 Visitor,它们所做的事情类似于 选择页面做进一步分析、选择不带链接的页面、列出“被链接最多”的页面,等 等。因为所有这些操作都很简单,所以 Visitor 模式(如清单 2 所示)可以工 作得很好,由于数据结构可以放到内存中,因此就算进行彻底搜索,花费也不是 很大:

清单 2. 用于 Web 快速搜索工具数据库的 Visitor 模式

public interface Visitor {    public void visitSite(Site site);    public void visitLink(Link link); }

噢,忘记报告了

如果不运行报告的话,Visitor 策略在访问数据方面会做得非常好。使用数 据库进行持久存储的一个好处是:在生成报告时,SQL 的能力就会大放光彩 — — 几乎可以让数据库做任何事情。甚至用 SQL 生成报告原型也很容易 —— 运 行原型报告,如果结果不

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号