本系列的第 1 部分引入了订阅特性,让用户能够订阅感兴趣的主题。当订阅的主题出现更新时,用户会收到电子邮件通知。多么古老的方式,似乎还停留在 20 世纪。在这个 Web 2.0 时代,一些用户可能希望在阅读器中以 RSS 或 Atom 提要形式接收这些通知。
可以使用 DB2 9 pureXML 生成这样的提要,用户可以在提要阅读器中方便地查看这些。我们使用 SQL/XML XML 发布函数来实现这个特性。XML 发布函数用来构造 XML 节点和文档。关系数据和 XML 数据都是可以使用的。
注:发布函数有时候也称为构造器函数。
DB2 9 中的 XML 发布函数包括:
我们来提供一个 Atom 提要,当订阅的主题发生更新时,它会通知用户。尽管我们选用 Atom 提要,但是 DB2 同样能够生成 RSS 提要。这仅仅是选用哪种提要 XML 模式来构造提要的问题。
清单 22. Atom 提要存储过程
| CREATE PROCEDURE GET_ATOM_FEED ( ) DYNAMIC RESULT SETS 1 ------------------------------------------------------------------------ -- SQL Stored Procedure ------------------------------------------------------------------------ P1: BEGIN -- Declare cursor DECLARE cursor1 CURSOR WITH RETURN FOR SELECT XMLSERIALIZE( XMLDOCUMENT( XMLELEMENT (NAME "feed", XMLNAMESPACES(DEFAULT 'http://www.w3.org/2005/Atom'), XMLCONCAT ( XMLELEMENT (NAME "id", 'http://localhost:3000/documents'), XMLELEMENT (NAME "title", 'Teamroom Documents'), XMLELEMENT (NAME "updated", CURRENT TIMESTAMP), XMLELEMENT (NAME "link", XMLATTRIBUTES('http://localhost:3000/documents/atom_feed' as "href", 'self' as "rel")), XMLELEMENT (NAME "author", XMLCONCAT( XMLELEMENT (NAME "name", 'TeamRoom'), XMLELEMENT (NAME "email", 'teamroom@developerWorks.ibm.com') ) ), XMLAGG ( XMLELEMENT (NAME "entry", XMLCONCAT ( XMLELEMENT (NAME "title", name), XMLELEMENT (NAME "id", 'http://localhost:3000/documents/show/' || CHAR(id)), XMLELEMENT (NAME "updated", updated_at), XMLELEMENT (NAME "link", 'http://localhost:3000/documents/show/' || CHAR(id)), XMLELEMENT (NAME "category", category), XMLELEMENT (NAME "summary", content_type), XMLELEMENT (NAME "content", XMLATTRIBUTES('text' as "type"), content) ) ) ) ) ) ) AS CLOB INCLUDING XMLDECLARATION ) FROM (SELECT d.id as id, d.name as name, d.content_type as content_type, d.updated_at as updated_at, s.name as category, s.description as content FROM DOCUMENTS d, SUBJECTS s WHERE d.subject_id = s.id ORDER BY d.updated_at DESC FETCH FIRST 10 ROWS ONLY) AS doc_list; -- Cursor left open for client application OPEN cursor1; END P1 |
我们选择以存储过程的形式提供这个功能,这样 Rails 开发人员就不需要为生成 Atom 提要的细节操心。开发人员只需调用这个存储过程即可。
清单 23. 调用 Atom 提要存储过程
| class Document < ActiveRecord::Base [...] def atom_feed feed = Document.find_by_sql("call teamroom.get_atom_feed()") content = feed[0].attributes["1"] send_data(content, :filename => 'TeamRoomFeed.atom', :type => 'text/xml', :disposition => "inline") end [...] end |
对 DB2 XML 发布函数和 Atom Syndication Format Protocol 的全面讨论超出了本文的范围。更多的信息请参考 参考资料 一节中的链接。另外,本文提供的应用程序下载包包含 Atom 提要的完整实现,包括用来生成 feed 的存储过程和应用程序代码。
结束语
DB2 的 pureXML 功能可以将 XML 数据存储为其固有的层次化格式,这使应用程序能够轻松地使用 XML 语言,同时保持 DB2 关系数据库管理系统提供的性能、可伸缩性、可靠性和可用性优势。再加上 Ruby on Rails 框架的简单性和灵活性,开发人员就可以快速轻松地构建、部署和维护高质量的 Web 2.0 应用程序。这两种技术的组合非常灵活,可以根据业务的需要将信息从关系格式转换为层次化格式。在转换数据格式的同时,仍然能够保持出色的性能(因为使用了同样的优化技术),而且可以应用 DB2 提供的所有其他可靠性和可用性特性:比如备份、恢复和可伸缩性。
DB2 pureXML 不仅支持基本的本地 XML 支持,还可以以节点级粒度在硬盘上存储解析后的数据,从而支持通过编制索引(实际文档节点位置)来提高查询性能,以及使用 DB2 查询引擎中内置的 XQuery 和 XPath 原语。这使它非常适合在 Ruby on Rails 运行时中使用,因为 Ruby on Rails 提供了一组非常出色的 XML 库(例如 REXML 和 ROXML),可以快速地将 XML 数据存储与 Web 应用程序集成起来。