﻿<?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-maxchen's blog-随笔分类-JAVA技术</title><link>http://www.blogjava.net/kelly859/category/51503.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 24 May 2013 20:14:34 GMT</lastBuildDate><pubDate>Fri, 24 May 2013 20:14:34 GMT</pubDate><ttl>60</ttl><item><title>怎样算平均寻道时间</title><link>http://www.blogjava.net/kelly859/archive/2013/05/22/399615.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 22 May 2013 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2013/05/22/399615.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/399615.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2013/05/22/399615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/399615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/399615.html</trackback:ping><description><![CDATA[<div><div></div></div><div><div><div><div><div><div><div><div><pre mt-10=""  q-content"="">一个单片磁盘的旋转速率为7200rpm,一面上的磁道数是30000,每道扇区数是600,寻道时间是每横越百磁道用1ms.假定开始时磁头位于磁道0,收到一个存取随机磁道上随机扇区的请求.<br />1,平均寻道时间为多少?<br />2,平均旋转延迟是多少？<br />3，一扇区的传送时间是多少？<br />4，满足此请求的总的平均时间是多少？<br /><br /></pre></div></div></div></div></div></div></div></div><pre id="answer-content-1031491560"  mb-10"="">1、平均寻道时间应为全部寻道时间的一半，150ms<br />2、平均旋转延迟应为转一周时间的一半，约4.17ms<br />3、T=b/rN，其中b/N即1/600，T为0.0014ms<br />4、总的平均时间是前三者的算术和，154.1714ms</pre><img src ="http://www.blogjava.net/kelly859/aggbug/399615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2013-05-22 14:45 <a href="http://www.blogjava.net/kelly859/archive/2013/05/22/399615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>欢迎访问 Nginx 的中文维基</title><link>http://www.blogjava.net/kelly859/archive/2012/09/28/388788.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Fri, 28 Sep 2012 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/09/28/388788.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/388788.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/09/28/388788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/388788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/388788.html</trackback:ping><description><![CDATA[转载:<a href="http://www.ostools.net/apidocs/apidoc?api=nginx-zh">http://www.ostools.net/apidocs/apidoc?api=nginx-zh</a><br /><p style="margin-left: 1em; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><strong><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.net/" style="color: #dc0303; ">Nginx</a>&nbsp;</strong>("engine x") 是一个高性能的 HTTP 和&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://en.wikipedia.org/wiki/Reverse_proxy" style="color: #dc0303; ">反向代理</a>&nbsp;服务器，也是一个 IMAP/POP3/SMTP&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://en.wikipedia.org/wiki/Proxy_server" style="color: #dc0303; ">代理服务器</a>&nbsp;。 Nginx 是由&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://sysoev.ru/en/" style="color: #dc0303; ">Igor Sysoev</a>&nbsp;为俄罗斯访问量第二的<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://rambler.ru/" style="color: #dc0303; ">Rambler.ru</a>&nbsp;站点开发的，它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来，Nginx 已经因为它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx，如新浪、网易、腾讯等；国内几个重要的视频分享网站也部署了Nginx，如六房间、酷6等。 新近发现Nginx 技术在国内日趋火热，越来越多的网站开始部署Nginx。</p><p style="margin-left: 1em; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; ">因为 Nginx 的文档大部分是英文的，本维基的目的是帮助使用中文世界的用户安装、配置和交换有关 Nginx 的使用经验。大部分文档源自(al-nginx AT none.at,Aleksandar Lazic) 的工作，有关本维基本身的问题请直接询问Cliff Wells<a rel="nofollow"  autonumber"="" href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#108;&#105;&#102;&#102;&#64;&#100;&#101;&#118;&#101;&#108;&#105;&#120;&#46;&#99;&#111;&#109;" style="color: #dc0303; ">[1]</a>&nbsp;，其他翻译请<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/Main.htm" tppabs="http://wiki.nginx.org/Main" style="color: #dc0303; ">点击</a>&nbsp;。</p><h2><span id="Nginx_.E5.8F.91.E5.B8.83" style="font-size: 13pt; ">Nginx 发布</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; ">当前开发版:&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-1.3.1.tar.gz" style="color: #dc0303; ">Nginx 1.3.1</a>&nbsp;|&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-1.3.1.zip" style="color: #dc0303; ">Nginx/windows 1.3.1</a>&nbsp;(<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/en/CHANGES" style="color: #dc0303; ">更新记录</a>)&nbsp;<em>(2012年6月6日)</em></li><li style="margin-left: 10px; ">当前稳定版:&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-1.2.1.tar.gz" style="color: #dc0303; ">Nginx 1.2.1</a>&nbsp;|&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-1.2.1.zip" style="color: #dc0303; ">Nginx/windows 1.2.1</a>&nbsp;(<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/en/CHANGES-1.2" style="color: #dc0303; ">更新记录</a>)&nbsp;<em>(2012年6月6日)</em></li><li style="margin-left: 10px; ">历史稳定版:&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-1.0.15.tar.gz" style="color: #dc0303; ">Nginx 1.0.15</a>&nbsp;|&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-1.0.15.zip" style="color: #dc0303; ">Nginx/windows 1.0.15</a>&nbsp;(<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/en/CHANGES-1.0" style="color: #dc0303; ">更新记录</a>)&nbsp;<em>(2012年4月12日)</em></li><li style="margin-left: 10px; ">历史稳定版:&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-0.8.55.tar.gz" style="color: #dc0303; ">Nginx 0.8.54</a>&nbsp;|&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-0.8.55.zip" style="color: #dc0303; ">Nginx/windows 0.8.55</a>&nbsp;(<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/en/CHANGES-0.8" style="color: #dc0303; ">更新记录</a>)&nbsp;<em>(2011年7月19日)</em></li><li style="margin-left: 10px; ">历史稳定版:&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-0.7.68.tar.gz" style="color: #dc0303; ">Nginx 0.7.69</a>&nbsp;|&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/download/nginx-0.7.69.zip" style="color: #dc0303; ">Nginx/windows 0.7.69</a>&nbsp;(<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/en/CHANGES-0.7" style="color: #dc0303; ">更新记录</a>)&nbsp;<em>(2011年7月19日)</em></li></ul><h2><span id="Nginx_.E6.96.B0.E9.97.BB" style="font-size: 13pt; ">Nginx 新闻</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/" style="color: #dc0303; ">nginx成立公司继续发展,将保持开源/免费/BSD授权</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/" style="color: #dc0303; ">nginx-1.0.0稳定版发布 1.0.x现在为稳定版分支</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://news.netcraft.com/archives/2010/12/01/december-2010-web-server-survey.html" style="color: #dc0303; ">2010年12月份调查 - 部署Nginx 的主机比例以达到6.62% (1691万)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/" style="color: #dc0303; ">nginx-0.8.51稳定版发布 0.8.x现在为稳定版分支</a></li><li style="margin-left: 10px; ">Evan Miller 的&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://evanmiller.org/nginx-modules-guide.html" style="color: #dc0303; ">Emiller的Nginx模块开发指南</a>&nbsp;草稿发布<em>(2009年8月13日)</em>，<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://yaoweibin.cn/maindoc/nginx-modules-guide-cn.pdf" style="color: #dc0303; ">中文草稿(2009年9月21日)</a>。</li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://torrentreactor.net/" style="color: #dc0303; ">TorrentReactor</a>&nbsp;使用 Nginx。</li><li style="margin-left: 10px; ">万一你没有立刻注意到，提醒下，维基使用了新主题。</li><li style="margin-left: 10px; ">因为最近的一些垃圾信息，现在必须注册一个帐户才能编辑该维基。不便之处，多多包涵。不过，这对于将这些垃圾信息抑制在萌芽状态的最好方法。</li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://w3techs.com/technologies/overview/web_server/all" style="color: #dc0303; ">2009年7月份调查 - 全球范围内部署Nginx 的主机或虚拟主机比例以达到5.4%</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://news.netcraft.com/archives/2009/05/27/may_2009_web_server_survey.html" style="color: #dc0303; ">2009年5月份调查 - 全球范围内部署Nginx 的主机或虚拟主机比例以达到3.25%</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://news.netcraft.com/archives/2009/03/15/march_2009_web_server_survey.html" style="color: #dc0303; ">2009年3月份调查 - 全球范围内部署Nginx 的主机或虚拟主机比例以达到3.06%</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://news.netcraft.com/archives/2008/12/24/december_2008_web_server_survey.html" style="color: #dc0303; ">2008年12月份调查 - 部署Nginx 的主机或虚拟主机总数已达350万，其增长率超过Lighttpd</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://survey.netcraft.com/Reports/200808/" style="color: #dc0303; ">Netcraft 2008年8月份调查 - Nginx数量正在增加</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://irclog.turbogears.org/archive/freenode/nginx" style="color: #dc0303; ">IRC Log</a></li></ul><h2><span id=".E4.B8.BB.E8.A6.81.E6.96.87.E6.A1.A3" style="font-size: 13pt; ">主要文档</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsOverview.htm" tppabs="http://wiki.nginx.org/NginxChsOverview" title="NginxChsOverview" style="color: #dc0303; ">概述</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsWhyUseIt.htm" tppabs="http://wiki.nginx.org/NginxChsWhyUseIt" title="NginxChsWhyUseIt" style="color: #dc0303; ">为什么选择 Nginx ？</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsInstall.htm" tppabs="http://wiki.nginx.org/NginxChsInstall" title="NginxChsInstall" style="color: #dc0303; ">安装 Nginx</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsCommandLine.htm" tppabs="http://wiki.nginx.org/NginxChsCommandLine" title="NginxChsCommandLine" style="color: #dc0303; ">运行和控制 Nginx - 命令行参数和信号</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsConfigNotation.htm" tppabs="http://wiki.nginx.org/NginxChsConfigNotation" title="NginxChsConfigNotation" style="color: #dc0303; ">配置符号参考</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsOptimizations.htm" tppabs="http://wiki.nginx.org/NginxChsOptimizations" title="NginxChsOptimizations" style="color: #dc0303; ">优化 Nginx</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsFaq.htm" tppabs="http://wiki.nginx.org/NginxChsFaq" title="NginxChsFaq" style="color: #dc0303; ">常见问题（FAQ）</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsDebugging.htm" tppabs="http://wiki.nginx.org/NginxChsDebugging" title="NginxChsDebugging" style="color: #dc0303; ">调试 nginx</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsFeatureRequests.htm" tppabs="http://wiki.nginx.org/NginxChsFeatureRequests" title="NginxChsFeatureRequests" style="color: #dc0303; ">特性请求</a></li></ul><h2><span id=".E6.A0.B8.E5.BF.83.E6.A8.A1.E5.9D.97" style="font-size: 13pt; ">核心模块</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpMainModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpMainModule" title="NginxChsHttpMainModule" style="color: #dc0303; ">主模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpEventsModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpEventsModule" title="NginxChsHttpEventsModule" style="color: #dc0303; ">事件模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpCoreModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpCoreModule" title="NginxChsHttpCoreModule" style="color: #dc0303; ">HTTP 模块</a></li></ul><h2><span id=".E5.9F.BA.E6.9C.AC.E6.A8.A1.E5.9D.97" style="font-size: 13pt; ">基本模块</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpAccessModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpAccessModule" title="NginxChsHttpAccessModule" style="color: #dc0303; ">HTTP Access 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpAuthBasicModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpAuthBasicModule" title="NginxChsHttpAuthBasicModule" style="color: #dc0303; ">HTTP Auth Basic 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpAutoindexModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpAutoindexModule" title="NginxChsHttpAutoindexModule" style="color: #dc0303; ">HTTP AutoIndex 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpDavModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpDavModule" title="NginxChsHttpDavModule" style="color: #dc0303; ">HTTP DAV 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpFcgiModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpFcgiModule" title="NginxChsHttpFcgiModule" style="color: #dc0303; ">HTTP FastCGI 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpGzipModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpGzipModule" title="NginxChsHttpGzipModule" style="color: #dc0303; ">HTTP Gzip Compression 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpHeadersModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpHeadersModule" title="NginxChsHttpHeadersModule" style="color: #dc0303; ">HTTP Headers 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpIndexModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpIndexModule" title="NginxChsHttpIndexModule" style="color: #dc0303; ">HTTP Index 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpLogModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpLogModule" title="NginxChsHttpLogModule" style="color: #dc0303; ">HTTP Log 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpProxyModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpProxyModule" title="NginxChsHttpProxyModule" style="color: #dc0303; ">HTTP Proxy 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpRewriteModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpRewriteModule" title="NginxChsHttpRewriteModule" style="color: #dc0303; ">HTTP Rewrite 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpUpstreamModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpUpstreamModule" title="NginxChsHttpUpstreamModule" style="color: #dc0303; ">HTTP Upstream 模块</a></li></ul><h2><span id=".E5.85.B6.E4.BB.96.E6.A8.A1.E5.9D.97" style="font-size: 13pt; ">其他模块</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpEmptyGifModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpEmptyGifModule" title="NginxChsHttpEmptyGifModule" style="color: #dc0303; ">HTTP Empty GIF 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpGeoModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpGeoModule" title="NginxChsHttpGeoModule" style="color: #dc0303; ">HTTP GEO 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpRealIpModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpRealIpModule" title="NginxChsHttpRealIpModule" style="color: #dc0303; ">HTTP Real IP 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpSsiModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpSsiModule" title="NginxChsHttpSsiModule" style="color: #dc0303; ">HTTP SSI 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsStubStatusModule.htm" tppabs="http://wiki.nginx.org/NginxChsStubStatusModule" title="NginxChsStubStatusModule" style="color: #dc0303; ">HTTP Stub Status 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsMemcachedModule.htm" tppabs="http://wiki.nginx.org/NginxChsMemcachedModule" title="NginxChsMemcachedModule" style="color: #dc0303; ">HTTP Memcached 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpLimit_zoneModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpLimit_zoneModule" title="NginxChsHttpLimit zoneModule" style="color: #dc0303; ">HTTP limit_zone 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpSecureLinkModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpSecureLinkModule" title="NginxChsHttpSecureLinkModule" style="color: #dc0303; ">HTTP Secure Link 模块</a></li></ul><h2><span id=".E7.AC.AC.E4.B8.89.E6.96.B9.E6.A8.A1.E5.9D.97" style="font-size: 13pt; ">第三方模块</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpUpstreamRequestHashModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpUpstreamRequestHashModule" title="NginxChsHttpUpstreamRequestHashModule" style="color: #dc0303; ">HTTP Upstream Request Hash 模块</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://xph.us/software/nginx-notice/" style="color: #dc0303; ">Notice 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxHttpSubsModule.htm" tppabs="http://wiki.nginx.org/NginxHttpSubsModule" title="NginxHttpSubsModule" style="color: #dc0303; ">nginx_substitutions_filter 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsHttpAccessKeyModule.htm" tppabs="http://wiki.nginx.org/NginxChsHttpAccessKeyModule" title="NginxChsHttpAccessKeyModule" style="color: #dc0303; ">Http Access Key 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsCachePurge.htm" tppabs="http://wiki.nginx.org/NginxChsCachePurge" title="NginxChsCachePurge" style="color: #dc0303; ">ngx_cache_purge 模块</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/HttpOwnerMatchModule.htm" tppabs="http://wiki.nginx.org/HttpOwnerMatchModule" title="HttpOwnerMatchModule" style="color: #dc0303; ">NginxHttpOwnerMatch 模块（解决链接型文件跨站访问）</a></li></ul><h2><span id=".E9.85.8D.E7.BD.AE.E7.A4.BA.E4.BE.8B.E5.92.8C.E6.96.B9.E6.B3.95" style="font-size: 13pt; ">配置示例和方法</span></h2><ul style="margin: 10px; padding-left: 15px; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsFullExample.htm" tppabs="http://wiki.nginx.org/NginxChsFullExample" title="NginxChsFullExample" style="color: #dc0303; ">完整示例</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsFullExample2.htm" tppabs="http://wiki.nginx.org/NginxChsFullExample2" title="NginxChsFullExample2" style="color: #dc0303; ">完整示例（来自 Nginx 站点）</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsVirtualHostExample.htm" tppabs="http://wiki.nginx.org/NginxChsVirtualHostExample" title="NginxChsVirtualHostExample" style="color: #dc0303; ">虚拟主机</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsLoadBalanceExample.htm" tppabs="http://wiki.nginx.org/NginxChsLoadBalanceExample" title="NginxChsLoadBalanceExample" style="color: #dc0303; ">负载均衡示例</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsFcgiExample.htm" tppabs="http://wiki.nginx.org/NginxChsFcgiExample" title="NginxChsFcgiExample" style="color: #dc0303; ">PHP/FastCGI 示例</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsRubyonRailsMongrel.htm" tppabs="http://wiki.nginx.org/NginxChsRubyonRailsMongrel" title="NginxChsRubyonRailsMongrel" style="color: #dc0303; ">Ruby on Rails / Mongrel</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/NginxChsXSendfile.htm" tppabs="http://wiki.nginx.org/NginxChsXSendfile" title="NginxChsXSendfile" style="color: #dc0303; ">X-Sendfile (=&gt; X-Accel-Redirect) in Nginx</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/HWLoadbalancerCheckErrors.htm" tppabs="http://wiki.nginx.org/HWLoadbalancerCheckErrors" title="HWLoadbalancerCheckErrors" style="color: #dc0303; ">Disable the errorlog entries caused by the HW-Loadbalancer</a></li><li style="margin-left: 10px; "><a href="http://www.ostools.net/uploads/apidocs/nginx-zh/RHEL_5.4_+_Nginx_+_Mediawiki.htm" tppabs="http://wiki.nginx.org/RHEL_5.4_%2B_Nginx_%2B_Mediawiki" title="RHEL 5.4 + Nginx + Mediawiki" style="color: #dc0303; ">RHEL 5.4 + Nginx + Mediawiki With HTTPS</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="https://heiher.info/1758.html" style="color: #dc0303; ">LNMP 多用户虚拟主机方案</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="https://heiher.info/2069.html" style="color: #dc0303; ">LNMP 多用户动态进程管理虚拟主机方案</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://sunny-play.com/2012/05/debian-awstats-static-statistics/" style="color: #dc0303; ">启用AWstats对Nginx作静态访问统计</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="https://wangyan.org/blog/nginx-subdomain.html" style="color: #dc0303; ">Nginx 二级子域名完美方案</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="https://wangyan.org/blog/howto-setup-awstats-and-jawstats.html" style="color: #dc0303; ">Nginx 日志分析AWStats+JAWStats安装配置</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.nginx.name/?p=400" style="color: #dc0303; ">Nginx常用Rewrite规则</a></li></ul><h2><span id=".E7.A4.BE.E5.9B.A2" style="font-size: 13pt; ">社团</span></h2><ol style="color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; ">IRC: #nginx on irc.freenode.net (<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://irclog.turbogears.org/archive/freenode/nginx" style="color: #dc0303; ">log archives</a>&nbsp;)</li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/mailman/%7C" style="color: #dc0303; ">Subscribe to the English Mailing List</a></li></ol><h2><span id=".E5.A4.96.E9.83.A8.E8.B5.84.E6.BA.90" style="font-size: 13pt; ">外部资源</span></h2><ol style="color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; "><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://nginx.org/" style="color: #dc0303; ">Nginx 官方首页(English)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.nginxcn.com/" style="color: #dc0303; ">Nginx中文网</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.nginxcn.com/doc" style="color: #dc0303; ">Nginx中文文档</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.howtocn.org/nginx:Nginx模块参考手册中文版" style="color: #dc0303; ">Nginx模块参考手册中文版</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://sysoev.ru/nginx/download.html" style="color: #dc0303; ">Nginx 各版本源代码和Win32 Binaries</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.s135.com/nginx_php_v6/" style="color: #dc0303; ">Nginx 0.8.x + PHP 5.2.13（FastCGI）搭建胜过Apache十倍的Web服务器（第6版）</a></li><li style="margin-left: 10px; ">Evan Miller's&nbsp;<a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://evanmiller.org/nginx-modules-guide.html" style="color: #dc0303; ">Guide to Nginx Module Development</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.dup2.org/files/nginx_module_development.html" style="color: #dc0303; ">Nginx模块开发备忘</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://hi.baidu.com/usen68/blog/item/214428ecff646d2163d09f7d.html" style="color: #dc0303; ">Nginx/windows 0.7.59 与PHP FastCGI 协同工作配置</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://lxr.evanmiller.org/" style="color: #dc0303; ">Nginx source code cross-reference</a></li><li style="margin-left: 10px; ">Nginx (draft English docs by Aleksandar Lazic) is now integrated into this wiki&nbsp;;-)</li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.rkblog.rk.edu.pl/w/p/pylons-benchmark-various-servers/" style="color: #dc0303; ">Cherokee vs Nginx benchmark</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.twisty-industries.com/users/cliff/tag/nginx" style="color: #dc0303; ">Nginx and TurboGears</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.kovyrin.net/category/web-tech/nginx" style="color: #dc0303; ">Lots of Nginx examples</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/" style="color: #dc0303; ">Nginx With PHP As FastCGI Howto (with fcgi-start script)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.codefront.net/2007/06/11/nginx-php-and-a-php-fastcgi-daemon-init-script/" style="color: #dc0303; ">Nginx, PHP and a PHP FastCGI daemon init script (with init script for PHP FastCGI)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://brainspl.at/articles/2006/08/23/nginx-my-new-favorite-front-end-for-mongrel-cluster" style="color: #dc0303; ">Nginx and Mongrel</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://zh.stikipad.com/notes/show/nginx" style="color: #dc0303; ">Short Nginx examples</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.feldpost.com/blogs/archives/000022.html" style="color: #dc0303; ">Init.d boot-up script for Linux</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.labratz.net/articles/2006/10/03/rails-deployment-apache-lighttpd-nginx-mongrel-cluster" style="color: #dc0303; ">Nginx &amp; Mongrel Cluster (with a possible start-stop script)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://wiki.splitbrain.org/wiki:rewrite#nginx" style="color: #dc0303; ">DokuWiki &amp; nginx</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.craz8.com/articles/2006/11/13/rails-action_cache-now-supports-nginx-and-x-accel-redirect" style="color: #dc0303; ">Rails caching with Nginx's X-Accel-Redirect</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://bob.pythonmac.org/archives/2006/09/13/nginx-reverse-proxy-panacea/" style="color: #dc0303; ">Several Python::NginxChs blog entries</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.vim.org/scripts/script.php?script_id=1886" style="color: #dc0303; ">nginx.vim (config syntax highlighting for Vim)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://drupal.org/node/110224" style="color: #dc0303; ">Nginx, Fastcgi, PHP, rewrite config for Drupal</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.sagework.com/2007/6/4/rails-hosting-simplified" style="color: #dc0303; ">Rails hosting simplified (Using Nginx)</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.rkblog.rk.edu.pl/w/p/django-nginx/" style="color: #dc0303; ">Django on Nginx</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.rkblog.rk.edu.pl/w/p/pylons-and-nginx/" style="color: #dc0303; ">Pylons on Nginx</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://blog.imperialdune.com/2007/3/31/setting-up-godaddy-turbo-ssl-on-nginx" style="color: #dc0303; ">Godaddy Turbo SSL on Nginx</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.howtocn.org/nginx:%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%AA%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84nginx_fastcgi%E6%9C%8D%E5%8A%A1%E5%99%A8" style="color: #dc0303; ">关于Nginx的一些优化（突破10W并发）</a></li><li style="margin-left: 10px; "><a rel="nofollow"  text"="" href="http://www.ostools.net/uploads/apidocs/nginx-zh/" tppabs="http://www.nginx.name/?p=1/" style="color: #dc0303; ">Linux下Nginx+PHP+MySQL配置</a></li></ol><h2><span id=".E6.94.AF.E6.8C.81_Nginx.EF.BC.81" style="font-size: 13pt; ">支持 Nginx！</span></h2><p style="margin-left: 1em; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; ">Nginx是一个开源的免费项目，需要大量的投资来支持我们的开发，比如购置服务器设备以支持Nginx官方网站、维基，或者是购买设备来测试开发。你可以通过捐赠的方式来帮助和支持本项目。我们衷心地希望使用Nginx而得益的企业或运营商、个人能拿出部分所得利来捐助Nginx，一方面为了Nginx更好，一方面也为了您能得到更完美的服务器程序。</p><p style="margin-left: 1em; color: #555555; font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Arial, Verdana, sans-serif; line-height: 17.266666412353516px; background-color: #d5d5d5; ">PayPal: paypal@nginx.net</p><img src ="http://www.blogjava.net/kelly859/aggbug/388788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-09-28 17:08 <a href="http://www.blogjava.net/kelly859/archive/2012/09/28/388788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google_三大论文中文版(Bigtable、 GFS、 Google MapReduce)</title><link>http://www.blogjava.net/kelly859/archive/2012/09/26/388560.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 26 Sep 2012 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/09/26/388560.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/388560.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/09/26/388560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/388560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/388560.html</trackback:ping><description><![CDATA[<br /><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">做个中文版下载源：</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">http://dl.iteye.com/topics/download/38db9a29-3e17-3dce-bc93-df9286081126</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">做个原版地址链接：</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">http://labs.google.com/papers/gfs.html</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">http://labs.google.com/papers/bigtable.html</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">http://labs.google.com/papers/mapreduce.html<br /><br /><a href="/Files/kelly859/Google_三大论文中文版.pdf">/Files/kelly859/Google_三大论文中文版.pdf</a><br /></p><img src ="http://www.blogjava.net/kelly859/aggbug/388560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-09-26 10:01 <a href="http://www.blogjava.net/kelly859/archive/2012/09/26/388560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web性能压力测试工具之ApacheBench（ab）详解</title><link>http://www.blogjava.net/kelly859/archive/2012/09/24/388425.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 24 Sep 2012 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/09/24/388425.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/388425.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/09/24/388425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/388425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/388425.html</trackback:ping><description><![CDATA[原文：<a href="http://www.ha97.com/4617.html">http://www.ha97.com/4617.html</a>&nbsp;<br /><strong style="line-height: 1.5em; color: #002200; font-family: georgia; font-size: 15px; padding: 0px; margin: 0px; "><br />PS：网站性能压力测试是性能调优过程中必不可少的一环。只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题。<a title="Apache" href="http://www.ha97.com/category/web-server/apache" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">Apache</a>中有个自带的，名为ab的程序，可以对<a title="Apache" href="http://www.ha97.com/tag/apache" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">Apache</a>或其它类型的服务器进行网站访问压力测试。</strong><br /><div clearfix"="" style="margin: 25px auto 30px; color: #002200; font-family: georgia; font-size: 15px; line-height: normal; "><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><strong style="padding: 0px; margin: 0px; "><a title="ApacheBench" href="http://www.ha97.com/tag/apachebench" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">ApacheBench</a>命令原理：</strong></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">ab命令会创建很多的并发访问线程，模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的，因此，既可以用来测试Apache的负载压力，也可以测试<a title="nginx" href="http://www.ha97.com/category/web-server/nginx" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">nginx</a>、lighthttp、<a title="tomcat" href="http://www.ha97.com/category/web-server/tomcat" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">tomcat</a>、IIS等其它Web服务器的压力。</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">ab命令对发出负载的计算机要求很低，既不会占用很高CPU，也不会占用很多内存，但却会给目标服务器造成巨大的负载，其原理类似CC攻击。自己测试使用也须注意，否则一次上太多的负载，可能造成目标服务器因资源耗完，严重时甚至导致死机。</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><strong style="padding: 0px; margin: 0px; ">ApacheBench参数说明</strong><br style="padding: 0px; margin: 0px; " /></p><blockquote style="padding: 0px 20px; margin: 0px 20px; border-left-width: 4px; border-left-color: #e8e7d0; font-size: 1em; "><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">格式：ab [options] [http://]hostname[:port]/path<br style="padding: 0px; margin: 0px; " />参数说明：<br style="padding: 0px; margin: 0px; " />-n requests Number of requests to perform<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//在测试会话中所执行的请求个数（本次测试总共要访问页面的次数）。默认时，仅执行一个请求。</span><br style="padding: 0px; margin: 0px; " />-c concurrency Number of multiple requests to make<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//一次产生的请求个数（并发数）。默认是一次一个。</span><br style="padding: 0px; margin: 0px; " />-t timelimit Seconds to max. wait for responses<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时，没有时间限制。</span><br style="padding: 0px; margin: 0px; " />-p postfile File containing data to POST<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//包含了需要POST的数据的文件，文件格式如&#8220;p1=1&amp;p2=2&#8221;.使用方法是 -p 111.txt 。 （配合-T）</span><br style="padding: 0px; margin: 0px; " />-T content-type Content-type header for POSTing<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//POST数据所使用的Content-type头信息，如 -T &#8220;application/x-www-form-urlencoded&#8221; 。 （配合-p）</span><br style="padding: 0px; margin: 0px; " />-v verbosity How much troubleshooting info to print<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//设置显示信息的详细程度 &#8211; 4或更大值会显示头信息， 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。</span><br style="padding: 0px; margin: 0px; " />-w Print out results in HTML&nbsp;<a title="tables" href="http://www.ha97.com/tag/tables" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">tables</a><br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//以HTML表的格式输出结果。默认时，它是白色背景的两列宽度的一张表。</span><br style="padding: 0px; margin: 0px; " />-i Use HEAD instead of GET<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">// 执行HEAD请求，而不是GET。</span><br style="padding: 0px; margin: 0px; " />-x attributes String to insert as table attributes<br style="padding: 0px; margin: 0px; " />-y attributes String to insert as tr attributes<br style="padding: 0px; margin: 0px; " />-z attributes String to insert as td or th attributes<br style="padding: 0px; margin: 0px; " />-C attribute Add cookie, eg. -C &#8220;c1=1234,c2=2,c3=3&#8243; (repeatable)<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复，用逗号分割。</span><br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">提示：可以借助session实现原理传递 JSESSIONID参数， 实现保持会话的功能，如</span><br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">-C &#8221; c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8&#8243; 。</span><br style="padding: 0px; margin: 0px; " />-H attribute Add Arbitrary header line, eg. &#8216;Accept-Encoding: gzip&#8217; Inserted after all normal header lines. (repeatable)<br style="padding: 0px; margin: 0px; " />-A attribute Add Basic WWW Authentication, the attributes<br style="padding: 0px; margin: 0px; " />are a colon separated username and password.<br style="padding: 0px; margin: 0px; " />-P attribute Add Basic Proxy Authentication, the attributes<br style="padding: 0px; margin: 0px; " />are a colon separated username and password.<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开，并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码)，此字符串都会被发送。</span><br style="padding: 0px; margin: 0px; " />-X proxy:port Proxyserver and port number to use<br style="padding: 0px; margin: 0px; " />-V Print version number and exit<br style="padding: 0px; margin: 0px; " />-k Use HTTP KeepAlive feature<br style="padding: 0px; margin: 0px; " />-d Do not show percentiles served table.<br style="padding: 0px; margin: 0px; " />-S Do not show confidence estimators and warnings.<br style="padding: 0px; margin: 0px; " />-g filename Output collected data to gnuplot format file.<br style="padding: 0px; margin: 0px; " />-e filename Output CSV file with percentages served<br style="padding: 0px; margin: 0px; " />-h Display usage information (this message)<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">//-attributes 设置属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外，对命令行参数、服务器的响应头和其他外部输入的解析也很简单，这可能会有不良后果。它没有完整地实现 HTTP/1.x; 仅接受某些&#8217;预想&#8217;的响应格式。 strstr(3)的频繁使用可能会带来性能问题，即你可能是在测试ab而不是服务器的性能。</span></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><strong style="padding: 0px; margin: 0px; ">参数很多，一般我们用 -c 和 -n 参数就可以了。</strong>例如:</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "># ab -c 5000 -n 600 http://127.0.0.1/index.php</p></blockquote><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><strong style="padding: 0px; margin: 0px; ">ApacheBench用法详解：</strong></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">在<a title="Linux" href="http://www.ha97.com/category/linux" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">Linux</a>系统，一般安装好Apache后可以直接执行；<br style="padding: 0px; margin: 0px; " /><code style="padding: 0px; margin: 0px; font-size: 12px; background-color: #eeeeee; "># ab -n 4000 -c 1000 http://www.ha97.com/</code></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">如果是Win系统下，打开cmd命令行窗口，cd到apache安装目录的bin目录下；</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><strong style="padding: 0px; margin: 0px; ">-n后面的4000代表总共发出4000个请求；-c后面的1000表示采用1000个并发（模拟1000个人同时访问），后面的网址表示测试的目标URL。</strong></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">稍等一会得到类似如下显示结果：<br style="padding: 0px; margin: 0px; " /><a href="http://www.ha97.com/wp-content/uploads/2012/05/ab.jpg" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; "><img size-full=""  wp-image-4621"="" title="ab" src="http://www.ha97.com/wp-content/uploads/2012/05/ab.jpg" alt="" width="814" height="626" style="padding: 3px; margin: 5px 0px; border: 1px solid #ced4ca; " /></a></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">结果分析：</p><blockquote style="padding: 0px 20px; margin: 0px 20px; border-left-width: 4px; border-left-color: #e8e7d0; font-size: 1em; "><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">This is ApacheBench, Version 2.3<br style="padding: 0px; margin: 0px; " />Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech<a title=".net" href="http://www.ha97.com/category/%e7%bc%96%e7%a8%8b%e5%bc%80%e5%8f%91/net" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">.net</a>/<br style="padding: 0px; margin: 0px; " />Licensed to The Apache Software Foundation, http://www.apache.org/</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">Benchmarking 192.168.80.157 (be patient)<br style="padding: 0px; margin: 0px; " />Completed 400 requests<br style="padding: 0px; margin: 0px; " />Completed 800 requests<br style="padding: 0px; margin: 0px; " />Completed 1200 requests<br style="padding: 0px; margin: 0px; " />Completed 1600 requests<br style="padding: 0px; margin: 0px; " />Completed 2000 requests<br style="padding: 0px; margin: 0px; " />Completed 2400 requests<br style="padding: 0px; margin: 0px; " />Completed 2800 requests<br style="padding: 0px; margin: 0px; " />Completed 3200 requests<br style="padding: 0px; margin: 0px; " />Completed 3600 requests<br style="padding: 0px; margin: 0px; " />Completed 4000 requests<br style="padding: 0px; margin: 0px; " />Finished 4000 requests</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><a title="Server" href="http://www.ha97.com/tag/server" style="padding: 0px; margin: 0px; color: #006600; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #006600; ">Server</a>&nbsp;Software: Apache/2.2.15<br style="padding: 0px; margin: 0px; " />Server Hostname: 192.168.80.157<br style="padding: 0px; margin: 0px; " />Server Port: 80</p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">Document Path: /phpinfo.php<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#测试的页面</span><br style="padding: 0px; margin: 0px; " />Document Length: 50797 bytes<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#页面大小</span></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">Concurrency Level: 1000<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#测试的并发数</span><br style="padding: 0px; margin: 0px; " />Time taken for tests: 11.846 seconds<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#整个测试持续的时间</span><br style="padding: 0px; margin: 0px; " />Complete requests: 4000<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#完成的请求数量</span><br style="padding: 0px; margin: 0px; " />Failed requests: 0<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#失败的请求数量</span><br style="padding: 0px; margin: 0px; " />Write errors: 0<br style="padding: 0px; margin: 0px; " />Total transferred: 204586997 bytes<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#整个过程中的网络传输量</span><br style="padding: 0px; margin: 0px; " />HTML transferred: 203479961 bytes<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#整个过程中的HTML内容传输量</span><br style="padding: 0px; margin: 0px; " />Requests per second: 337.67 [#/sec] (mean)<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#最重要的指标之一，相当于LR中的每秒事务数，后面括号中的mean表示这是一个平均值</span><br style="padding: 0px; margin: 0px; " />Time per request: 2961.449 [ms] (mean)<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#最重要的指标之二，相当于LR中的平均事务响应时间，后面括号中的mean表示这是一个平均值</span><br style="padding: 0px; margin: 0px; " />Time per request: 2.961 [ms] (mean, across all concurrent requests)<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#每个连接请求实际运行时间的平均值</span><br style="padding: 0px; margin: 0px; " />Transfer rate: 16866.07 [Kbytes/sec] received<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#平均每秒网络上的流量，可以帮助排除是否存在网络流量过大导致响应时间延长的问题</span><br style="padding: 0px; margin: 0px; " />Connection Times (ms)<br style="padding: 0px; margin: 0px; " />min mean[+/-sd] median max<br style="padding: 0px; margin: 0px; " />Connect: 0 483 1773.5 11 9052<br style="padding: 0px; margin: 0px; " />Processing: 2 556 1459.1 255 11763<br style="padding: 0px; margin: 0px; " />Waiting: 1 515 1459.8 220 11756<br style="padding: 0px; margin: 0px; " />Total: 139 1039 2296.6 275 11843<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#网络上消耗的时间的分解，各项数据的具体算法还不是很清楚</span></p><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; ">Percentage of the requests served within a certain time (ms)<br style="padding: 0px; margin: 0px; " />50% 275<br style="padding: 0px; margin: 0px; " />66% 298<br style="padding: 0px; margin: 0px; " />75% 328<br style="padding: 0px; margin: 0px; " />80% 373<br style="padding: 0px; margin: 0px; " />90% 3260<br style="padding: 0px; margin: 0px; " />95% 9075<br style="padding: 0px; margin: 0px; " />98% 9267<br style="padding: 0px; margin: 0px; " />99% 11713<br style="padding: 0px; margin: 0px; " />100% 11843 (longest request)<br style="padding: 0px; margin: 0px; " /><span style="padding: 0px; margin: 0px; color: #ff0000; ">#整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间，其中50％的用户响应时间小于275毫秒，66％的用户响应时间小于298毫秒，最大的响应时间小于11843毫秒。对于并发请求，cpu实际上并不是同时处理的，而是按照每个请求获得的时间片逐个轮转处理的，所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数。</span></p></blockquote><p style="padding: 0px; margin: 1.2em 0px; line-height: 1.5em; "><strong style="padding: 0px; margin: 0px; ">总结：在远程对web服务器进行压力测试，往往效果不理想（因为网络延时过大），建议使用内网的另一台或者多台服务器通过内网进行测试，这样得出的数据，准确度会高很多。如果只有单独的一台服务器，可以直接本地测试，比远程测试效果要准确。</strong></p></div><p style="padding: 0px; margin: 0px; line-height: 1.5em; font-size: 12px; font-family: verdana; color: #002200; "><a href="http://www.ha97.com/4617.html" rel="bookmark" title="（总结）Web性能压力测试工具之ApacheBench（ab）详解" style="padding: 0px; margin: 0px; color: #477725; text-decoration: none; ">永久链接</a>&nbsp;: http://www.ha97.com/4617.html</p><img src ="http://www.blogjava.net/kelly859/aggbug/388425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-09-24 11:58 <a href="http://www.blogjava.net/kelly859/archive/2012/09/24/388425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat的四种基于HTTP协议的Connector性能比较</title><link>http://www.blogjava.net/kelly859/archive/2012/09/24/388424.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 24 Sep 2012 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/09/24/388424.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/388424.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/09/24/388424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/388424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/388424.html</trackback:ping><description><![CDATA[原文：<a href="http://bask.iteye.com/blog/224852">http://bask.iteye.com/blog/224852<br /><br /></a><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">Tomcat从5.5版本开始，支持以下四种Connector的配置分别为：</p><hr style="height: 1px; margin: 1.5em 10px; border-bottom-color: black; border-bottom-width: thin; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; " /><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&lt;Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" redirectPort="8443"/&gt;<br /><span style="color: #ff6600; ">&lt;Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443"/&gt;</span>&nbsp;<br />&lt;Connector executor="tomcatThreadPool"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8081" protocol="HTTP/1.1"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" /&gt;<br /><span style="color: #ff6600; ">&lt;Connector executor="tomcatThreadPool"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" /&gt;</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">我们姑且把上面四种Connector按照顺序命名为 NIO, HTTP, POOL, NIOP</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">为了不让其他因素影响测试结果，我们只对一个很简单的jsp页面进行测试，这个页面仅仅是输出一个Hello World。假设地址是 http://tomcat1/test.jsp</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">我们依次对四种Connector进行测试，测试的客户端在另外一台机器上用ab命令来完成，测试命令为：&nbsp;<span style="color: #ff6600; ">ab -c 900 -n 2000 http://tomcat1/test.jsp</span>&nbsp;，最终的测试结果如下表所示(单位:平均每秒处理的请求数)：</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">&nbsp;</p><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">NIO HTTP POOL NIOP</span><table style="color: #000000; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.200000762939453px; text-align: left; background-color: #ffffff; "><tbody><tr></tr><tr><td style="font-size: 1em; ">281</td><td style="font-size: 1em; ">65</td><td style="font-size: 1em; ">208</td><td style="font-size: 1em; ">365</td></tr><tr><td style="font-size: 1em; ">666</td><td style="font-size: 1em; ">66</td><td style="font-size: 1em; ">110</td><td style="font-size: 1em; ">398</td></tr><tr><td style="font-size: 1em; ">692</td><td style="font-size: 1em; ">65</td><td style="font-size: 1em; ">66</td><td style="font-size: 1em; ">263</td></tr><tr><td style="font-size: 1em; ">256</td><td style="font-size: 1em; ">63</td><td style="font-size: 1em; ">94</td><td style="font-size: 1em; ">459</td></tr><tr><td style="font-size: 1em; ">440</td><td style="font-size: 1em; ">67</td><td style="font-size: 1em; ">145</td><td style="font-size: 1em; ">363</td></tr></tbody></table><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">由这五组数据不难看出，HTTP的性能是很稳定，但是也是最差的，而这种方式就是Tomcat的默认配置。NIO方式波动很大，但没有低于280 的，NIOP是在NIO的基础上加入线程池，可能是程序处理更复杂了，因此性能不见得比NIO强；而POOL方式则波动很大，测试期间和HTTP方式一 样，不时有停滞。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">由于linux的内核默认限制了最大打开文件数目是1024，因此此次并发数控制在900。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">尽管这一个结果在实际的网站中因为各方面因素导致，可能差别没这么大，例如受限于数据库的性能等等的问题。但对我们在部署网站应用时还是具有参考价值的。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; ">来自:http://www.javayou.com/diary/143691518</p><img src ="http://www.blogjava.net/kelly859/aggbug/388424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-09-24 11:49 <a href="http://www.blogjava.net/kelly859/archive/2012/09/24/388424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】Lucene近实时检索</title><link>http://www.blogjava.net/kelly859/archive/2012/09/24/388421.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 24 Sep 2012 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/09/24/388421.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/388421.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/09/24/388421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/388421.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/388421.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.TimeUnit;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.analysis.Analyzer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.analysis.standard.StandardAnalyzer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Document;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Field;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Field.Index;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Field.Store;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexWriter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexWriterConfig;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.Term;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.IndexSearcher;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.NRTManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.Query;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.SearcherFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.SearcherManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.TermQuery;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.TopDocs;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.NRTManager.TrackingIndexWriter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.store.Directory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.store.FSDirectory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.util.Version;<br /><br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;NRTTest&nbsp;<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;indexWriter;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SearcherManager&nbsp;searcherManager;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;NRTTest()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory&nbsp;d&nbsp;=&nbsp;FSDirectory.open(<span style="color: #0000FF; ">new</span>&nbsp;File("d:/TMP"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Analyzer&nbsp;analyzer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StandardAnalyzer(Version.LUCENE_36);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriterConfig&nbsp;conf&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IndexWriterConfig(Version.LUCENE_36,&nbsp;analyzer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexWriter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IndexWriter(d,&nbsp;conf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SearcherFactory&nbsp;searcherFactory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearcherFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackingIndexWriter&nbsp;tw&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;NRTManager.TrackingIndexWriter(indexWriter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NRTManager&nbsp;nrtManager&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;NRTManager(tw,&nbsp;searcherFactory,&nbsp;<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NRTManagerReopenThread&nbsp;nrtManagerReopenThread&nbsp;=&nbsp;new&nbsp;NRTManagerReopenThread(nrtManager,&nbsp;0.50,&nbsp;0.05);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrtManagerReopenThread.setName("nrt&nbsp;reopen&nbsp;thread");<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrtManagerReopenThread.setDaemon(true);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrtManagerReopenThread.start();</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcherManager&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearcherManager(d,&nbsp;searcherFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(<span style="color: #0000FF; ">true</span>)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcherManager.maybeRefresh();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.MILLISECONDS.sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;addDoc()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Document();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(<span style="color: #0000FF; ">new</span>&nbsp;Field("f0",&nbsp;"a",&nbsp;Store.YES,&nbsp;Index.NOT_ANALYZED));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(<span style="color: #0000FF; ">new</span>&nbsp;Field("f1",&nbsp;"a",&nbsp;Store.YES,&nbsp;Index.NOT_ANALYZED));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(<span style="color: #0000FF; ">new</span>&nbsp;Field("f2",&nbsp;"a",&nbsp;Store.YES,&nbsp;Index.NOT_ANALYZED));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;time&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexWriter.addDocument(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexWriter.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("addDoc:"&nbsp;+&nbsp;(System.currentTimeMillis()-time)&nbsp;+&nbsp;"ms");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;search()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;indexSearcher&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;time&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexSearcher&nbsp;=&nbsp;searcherManager.acquire();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TermQuery(<span style="color: #0000FF; ">new</span>&nbsp;Term("f0",&nbsp;"a"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TopDocs&nbsp;topdocs&nbsp;=&nbsp;indexSearcher.search(query,&nbsp;100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("search&nbsp;"&nbsp;+&nbsp;topdocs.totalHits&nbsp;+&nbsp;":"&nbsp;+&nbsp;(System.currentTimeMillis()&nbsp;-&nbsp;time)&nbsp;+&nbsp;"ms");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcherManager.release(indexSearcher);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NRTTest&nbsp;nrt&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;NRTTest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;&nbsp;i&lt;10;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;wThread&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread(<span style="color: #0000FF; ">new</span>&nbsp;Write(nrt));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;rThread&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread(<span style="color: #0000FF; ">new</span>&nbsp;Read(nrt));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wThread.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rThread.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Write&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Runnable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;NRTTest&nbsp;nrt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Write(NRTTest&nbsp;nrt)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.nrt&nbsp;=&nbsp;nrt;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(<span style="color: #0000FF; ">true</span>)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrt.addDoc();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.MILLISECONDS.sleep(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Read&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Runnable&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;NRTTest&nbsp;nrt;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Read(NRTTest&nbsp;nrt)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.nrt&nbsp;=&nbsp;nrt;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(<span style="color: #0000FF; ">true</span>)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrt.search();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.MILLISECONDS.sleep(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><font color="#0000ff"><br />参考了下面这篇文章：</font>
<a href="http://www.cnblogs.com/huangfox/archive/2012/08/21/2649055.html">http://www.cnblogs.com/huangfox/archive/2012/08/21/2649055.html<br />&nbsp;</a>参考了该文章通过NRTManager获取IndexSearcher，本文通过SearcherManager获取。<img src ="http://www.blogjava.net/kelly859/aggbug/388421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-09-24 11:09 <a href="http://www.blogjava.net/kelly859/archive/2012/09/24/388421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat访问日志说明</title><link>http://www.blogjava.net/kelly859/archive/2012/09/19/388055.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 19 Sep 2012 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/09/19/388055.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/388055.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/09/19/388055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/388055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/388055.html</trackback:ping><description><![CDATA[<div><h3><span style="color: #0000ff; font-size: 12pt; font-family: Wingdings; ">l&nbsp;</span><span style="color: #0000ff; font-size: 12pt; font-family: 'Times New Roman'; ">Tomcat默认的配置：&nbsp;</span></h3><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr style="height:54.6000pt; "><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; background:#0c0c0c; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; color:#00ff00; font-size:10.5000pt; font-family:'Times New Roman'; color:#ffffff; ">&lt;Valve&nbsp;className="org.apache.catalina.valves.AccessLogValve"&nbsp;directory="logs"&nbsp;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; color:#00ff00; font-size:10.5000pt; font-family:'Times New Roman'; color:#ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prefix="access_log."&nbsp;suffix=".log"&nbsp;pattern="%h&nbsp;%l&nbsp;%u&nbsp;%t&nbsp;%r&nbsp;%s&nbsp;%b&nbsp;%D"&nbsp;resolveHosts="false"/&gt;</span></p></td></tr></tbody></table><p style="margin-bottom:0pt; margin-top:0pt; "></p><h3><span style="color: #0000ff; font-size: 12pt; font-family: Wingdings; ">l&nbsp;</span><span style="color: #0000ff; font-size: 12pt; font-family: 宋体; ">参数说明</span></h3><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:0.7500pt solid #000000; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">className</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:0.7500pt solid #000000; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">实现的Java类名。必须被设置成org.apache.catalina.valves.AccessLogValve。&nbsp;</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">directory</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">存放日志文件的目录，可以是相对路径或者绝对路径。如果使用相对路径，是指相对于&nbsp;$CATALINA_HOME的路径。如果不指定directory属性，缺省值是"logs"（相对于&nbsp;$CATALINA_HOME）&nbsp;</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">pattern</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">需要记录的请求/响应不同信息域的格式布局。如果是"common"或者"combine"，说明选择标准格式。下面会有关于配置这个属性的更多信息。</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">prefix</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">日志文件名的前缀。如果没有指定，缺省值是"access_log."。如果不想使用前缀，使用长度为0的字符串。</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">resolveHosts</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">将远端主机的IP地址通过DNS查询转换成主机名，设为true。如果为false，忽略DNS查询，报告远端的IP地址。&nbsp;</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">suffix</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">日志文件名的后缀。如果没有指定，缺省值是""。如果不想使用后缀，使用长度为0的字符串。&nbsp;</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">rotatable</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">缺省值为true，用来决定日志是否翻转的标志。如果为false，日志文件永远不翻转，并且忽略fileDataFormat。要谨慎使用。&nbsp;</span><span style="font-size:10.5000pt; font-family:'Verdana'; background:#eeeeee; "><br /></span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">condition</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">打开条件日志。如果设置了这个属性，只有在ServletRequest.getAttribute()是null的时候，才会为请求创建日志。比如，如果&nbsp;condition设为junk，则只有在Servlet.getAttribute("junk")==null的时候，才会记录这个请求。使用过滤器，可以很容易设置（或者取消设置）不同请求的属性。&nbsp;</span></p></td></tr><tr><td width="127" valign="top" style="width:95.3000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.7500pt solid #000000; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:10.5000pt; font-family:'Times New Roman'; ">fileDateFormat</span></p></td><td width="441" valign="top" style="width:330.8000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:none; ; ; border-right:0.7500pt solid #000000; border-top:none; ; border-bottom:0.7500pt solid #000000; background:#ffff99; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">允许在日志文件名称中使用定制的日期格式。日志的格式也决定了日志文件翻转的频率。如果想每个小时翻转一次，将这个值设为yyyy-MM-dd.HH</span></p></td></tr></tbody></table><p style="margin-bottom:0pt; margin-top:0pt; "></p><h3><span style="color: #0000ff; font-size: 12pt; font-family: Wingdings; ">l&nbsp;</span><span style="color: #0000ff; font-size: 12pt; font-family: 'Times New Roman'; ">Pattern</span><span style="color: #0000ff; font-size: 12pt; font-family: 宋体; ">属性</span><span style="color: #0000ff; font-size: 12pt; font-family: 宋体; ">说明</span></h3><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%a</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;远端IP地址</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%A</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;本地IP地址</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%b</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;发送的字节数，不包括HTTP头，如果为0，使用"－"</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%B</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;发送的字节数，不包括HTTP头</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%h</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;远端主机名(如果resolveHost=false，远端的IP地址）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%H</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;请求协议</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%l</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;从identd返回的远端逻辑用户名（总是返回&nbsp;'-'）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%m</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;请求的方法（GET，POST，等）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%p</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;收到请求的本地端口号</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%q</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;查询字符串(如果存在，以&nbsp;'?'开始)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%r&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">-&nbsp;请求的第一行，包含了请求的方法和URI</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%s</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;响应的状态码</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%S</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;用户的session&nbsp;ID</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%t&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">-&nbsp;日志和时间，使用通常的Log格式</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%u</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;认证以后的远端用户（如果存在的话，否则为'-'）</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%U</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;请求的URI路径</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%v</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;本地服务器的名称</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%D</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;处理请求的时间，以毫秒为单位</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; ">%T</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">&nbsp;-&nbsp;处理请求的时间，以秒为单位<br /><br /></span></p><p style="margin-bottom:0pt; margin-top:0pt; text-align:justify; "></p><p style="margin-bottom:0pt; margin-top:0pt; text-align:justify; "><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">另外还可以将cookie,&nbsp;客户端请求中带的HTTP头(incoming&nbsp;header),&nbsp;会话(session)或是ServletRequest中的数据都写到Tomcat的访问日志中，你可以用下面的语法来引用。&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; "><br /></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">%{xxx}i&nbsp;&#8211;&nbsp;记录客户端请求中带的HTTP头xxx(incoming&nbsp;headers)&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; "><br /></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">%{xxx}c&nbsp;&#8211;&nbsp;记录特定的cookie&nbsp;xxx&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; "><br /></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">%{xxx}r&nbsp;&#8211;&nbsp;记录ServletRequest中的xxx属性(attribute)&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; "><br /></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">%{xxx}s&nbsp;&#8211;&nbsp;记录HttpSession中的xxx属性(attribute)&nbsp;&nbsp;</span></p><h3><span style="color: #0000ff; font-size: 12pt; font-family: Wingdings; ">l&nbsp;</span><span style="color: #0000ff; font-size: 12pt; font-family: 'Times New Roman'; ">Pattern</span><span style="color: #0000ff; font-size: 12pt; font-family: 宋体; ">配置示例</span></h3><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10.5pt; font-family: 宋体; ">%t&nbsp;%h&nbsp;%l&nbsp;%s&nbsp;%</span><span style="font-size: 10.5pt; font-family: 宋体; ">D</span><span style="font-size: 10.5pt; font-family: 宋体; ">&nbsp;%r&nbsp;%b&nbsp;</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">%{User-Agent}</span><span style="font-size: 10.5pt; font-family: 宋体; ">i</span></p><p style="margin-bottom:0pt; margin-top:0pt; text-align:justify; "></p></div><img src ="http://www.blogjava.net/kelly859/aggbug/388055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-09-19 11:44 <a href="http://www.blogjava.net/kelly859/archive/2012/09/19/388055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ibatis解决sql注入问题</title><link>http://www.blogjava.net/kelly859/archive/2012/08/25/386261.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Sat, 25 Aug 2012 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/08/25/386261.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/386261.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/08/25/386261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/386261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/386261.html</trackback:ping><description><![CDATA[<div><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">原文：</span>
<a href="http://blog.csdn.net/scorpio3k/article/details/7610973">http://blog.csdn.net/scorpio3k/article/details/7610973</a>&nbsp;<br /><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; "><br />对于ibaits参数引用可以使用#和$两种写法，其中#写法会采用预编译方式，将转义交给了数据库，不会出现注入问题；如果采用$写法，则相当于拼接字符串，会出现注入问题。</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">例如，如果属性值为&#8220;</span><span style="color: #ff0000; font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">'&nbsp;or&nbsp;'1'='1&nbsp;</span><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">&#8221;，采用#写法没有问题，采用$写法就会有问题。</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">对于like语句，难免要使用$写法，</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">&nbsp;1.&nbsp;对于Oracle可以通过'%'||'#param#'||'%'避免；</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">&nbsp;2.&nbsp;对于MySQL可以通过CONCAT('%',#param#,'%')避免；</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">&nbsp;3.&nbsp;MSSQL中通过</span><span style="color: #0000ff; font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">'</span><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">%'+#</span><span style="font-weight: bold; font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">param</span><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">#+'%&nbsp;。&nbsp;</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; ">&nbsp;</p><p style="margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="font-size: 10.5pt; font-family: Arial; background-position: initial initial; background-repeat: initial initial; ">如下3种SQL语句：</span></p><p style="text-indent: -1500pt; margin-right: 7.5pt; margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; "><span style="color: #c0c0c0; font-weight: bold; font-size: 6.5pt; font-family: Verdana; background-color: #f8f8f8; background-position: initial initial; background-repeat: initial initial; ">[html]</span>&nbsp;<a href="http://blog.csdn.net/scorpio3k/article/details/7610973#"><span style="color: #0000ff; font-size: 6.5pt; font-family: Verdana; ">view&nbsp;plain</span></a><a href="http://blog.csdn.net/scorpio3k/article/details/7610973#"><span style="color: #0000ff; font-size: 6.5pt; font-family: Verdana; ">copy</span></a></p><p style="margin-bottom: 0pt; margin-top: 0pt; background-color: #f8f8f8; background-position: initial initial; background-repeat: initial initial; "></p><p style="margin-left: 18pt; margin-bottom: 0pt; margin-top: 0pt; border-left-style: none; padding: 0pt; line-height: 13.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="color: #5c5c5c; font-size: 9pt; font-family: Symbol; background-position: initial initial; background-repeat: initial initial; ">1&nbsp;</span><span style="font-size: 9pt; font-family: Consolas; background-position: initial initial; background-repeat: initial initial; ">mysql:&nbsp;select&nbsp;*&nbsp;from&nbsp;t_user&nbsp;where&nbsp;name&nbsp;like&nbsp;concat('%',#name&nbsp;#,'%')&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="margin-left: 18pt; margin-bottom: 0pt; margin-top: 0pt; border-left-style: none; padding: 0pt; line-height: 13.5pt; background-color: #f8f8f8; background-position: initial initial; background-repeat: initial initial; "><span style="color: #5c5c5c; font-size: 9pt; font-family: Symbol; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; ">2&nbsp;</span><span style="font-size: 9pt; font-family: Consolas; background-position: initial initial; background-repeat: initial initial; ">&nbsp;&nbsp;&nbsp;</span></p><p style="margin-left: 18pt; margin-bottom: 0pt; margin-top: 0pt; border-left-style: none; padding: 0pt; line-height: 13.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="color: #5c5c5c; font-size: 9pt; font-family: Symbol; background-position: initial initial; background-repeat: initial initial; ">3&nbsp;</span><span style="font-size: 9pt; font-family: Consolas; background-position: initial initial; background-repeat: initial initial; ">oracle:&nbsp;select&nbsp;*&nbsp;from&nbsp;t_user&nbsp;where&nbsp;name&nbsp;like&nbsp;'%'||#name&nbsp;#||'%'&nbsp;&nbsp;&nbsp;</span></p><p style="margin-left: 18pt; margin-bottom: 0pt; margin-top: 0pt; border-left-style: none; padding: 0pt; line-height: 13.5pt; background-color: #f8f8f8; background-position: initial initial; background-repeat: initial initial; "><span style="color: #5c5c5c; font-size: 9pt; font-family: Symbol; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; ">4&nbsp;</span><span style="font-size: 9pt; font-family: Consolas; background-position: initial initial; background-repeat: initial initial; ">&nbsp;&nbsp;&nbsp;</span></p><p style="margin-left: 18pt; margin-bottom: 0pt; margin-top: 0pt; border-left-style: none; padding: 0pt; line-height: 13.5pt; background-color: #ffffff; background-position: initial initial; background-repeat: initial initial; "><span style="color: #5c5c5c; font-size: 9pt; font-family: Symbol; background-position: initial initial; background-repeat: initial initial; ">5&nbsp;</span><span style="font-size: 9pt; font-family: Consolas; background-position: initial initial; background-repeat: initial initial; ">SQL&nbsp;Server:select&nbsp;*&nbsp;from&nbsp;t_user&nbsp;where&nbsp;name&nbsp;like&nbsp;'%'+#name&nbsp;#+'% &nbsp; &nbsp;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p></div><img src ="http://www.blogjava.net/kelly859/aggbug/386261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-08-25 14:24 <a href="http://www.blogjava.net/kelly859/archive/2012/08/25/386261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hessian序列化不设SerializerFactory性能问题</title><link>http://www.blogjava.net/kelly859/archive/2012/08/14/385480.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Tue, 14 Aug 2012 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/08/14/385480.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/385480.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/08/14/385480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/385480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/385480.html</trackback:ping><description><![CDATA[<p style="font-size: 13px; margin: 0px 0px 10px; padding: 0px; color: #444444; font-family: Arial, Helvetica, sans-serif; line-height: 26.383333206176758px; background-color: #f9f7f5; ">原文：<a href="http://code.alibabatech.com/blog/experience_1089/hessian-set-serializerfactory-performance.html">http://code.alibabatech.com/blog/experience_1089/hessian-set-serializerfactory-performance.html</a>&nbsp;<br /><br />服务框架全面重构后，因换了通讯协议，采用Magic头识别新旧版本，<br />性能测试发现，在兼容旧版本模式下，性能下降10倍，<br />原来一个1ms到2ms的请求，现在需要11ms到12ms，<br />对比新旧版本代码，发现四个不同点：<br />(1)	UnsafeByteArrayOutputStream是不是比ByteArrayOutputStream慢很多？<br />(2)	通过java.nio.ByteBuffer转换到mina的ByteBuffer映射写入慢很多？<br />(3)	重复使用一个ByteArrayOutputStream是不是比多个ByteArrayOutputStream慢很多？<br />(4)	没有设置SerializerFactory会比设置了慢很多？<br />逐个验证，前面三个对性能几乎没有影响，修改第四个，性能立马提升。<br />旧版本代码：</p><blockquote style="margin: 20px 0px 20px 20px; padding: 0px 0px 0px 20px; border-left-width: 3px; border-left-color: #cbcac8; color: #666666; font-style: italic; line-height: 1.5em; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #f9f7f5; "><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">private static final SerializerFactory _serializerFactory = new SerializerFactory();<br />ByteArrayOutputStream bout = new ByteArrayOutputStream();<br />Hessian2Output h2out = new Hessian2Output(bout);<br /><span style="color: red; ">h2out.setSerializerFactory(_serializerFactory);</span><br />h2out.writeObject(msg);<br />h2out.flush();<br />byte[] content = bout.toByteArray();</p></blockquote><p style="font-size: 13px; margin: 0px 0px 10px; padding: 0px; color: #444444; font-family: Arial, Helvetica, sans-serif; line-height: 26.383333206176758px; background-color: #f9f7f5; ">新版本代码：</p><blockquote style="margin: 20px 0px 20px 20px; padding: 0px 0px 0px 20px; border-left-width: 3px; border-left-color: #cbcac8; color: #666666; font-style: italic; line-height: 1.5em; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #f9f7f5; "><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">UnsafeByteArrayOutputStream bos = new UnsafeByteArrayOutputStream(1024);<br />Hessian2Output h2o = new Hessian2Output(bos);<br />h2o.writeObject(connReq);<br />h2o.flush();<br />byte[] content = bos.toByteArray();</p></blockquote><p style="font-size: 13px; margin: 0px 0px 10px; padding: 0px; color: #444444; font-family: Arial, Helvetica, sans-serif; line-height: 26.383333206176758px; background-color: #f9f7f5; ">新代码没有调用h2o.setSerializerFactory(serializerFactory);<br />就因为这一句，性能下降10倍。<br />我们来看一下Hessian3.2.1的源代码：</p><blockquote style="margin: 20px 0px 20px 20px; padding: 0px 0px 0px 20px; border-left-width: 3px; border-left-color: #cbcac8; color: #666666; font-style: italic; line-height: 1.5em; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #f9f7f5; "><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">public void writeObject(Object object)<br />throws IOException<br />{<br />if (object == null) {<br />writeNull();<br />return;<br />}</p><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">Serializer serializer;</p><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">serializer = findSerializerFactory().getSerializer(object.getClass());</p><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">serializer.writeObject(object, this);<br />}</p><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">public final SerializerFactory findSerializerFactory()<br />{<br />SerializerFactory factory = _serializerFactory;</p><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; "><span style="color: red; ">if (factory == null)<br />_serializerFactory = factory = new SerializerFactory();</span></p><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">return factory;<br />}</p></blockquote><p style="font-size: 13px; margin: 0px 0px 10px; padding: 0px; color: #444444; font-family: Arial, Helvetica, sans-serif; line-height: 26.383333206176758px; background-color: #f9f7f5; ">看代码，在writeObject()时，如果发现没有设置SerializerFactory，会自动设一个SerializerFactory，<br />看起来好像没有问题，我们自己设的SerializerFactory也是直接new出来的，没做什么手脚，<br />那为什么性能会下降这么快呢？开始还真被这行代码唬住了，看起来没啥区别，<br />仔细一想，才发现，Hessian2Output对象是prototype的，<br />每次请求，都会创建一个实例，用完即销毁，这样的话，基于下面的方式：</p><blockquote style="margin: 20px 0px 20px 20px; padding: 0px 0px 0px 20px; border-left-width: 3px; border-left-color: #cbcac8; color: #666666; font-style: italic; line-height: 1.5em; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #f9f7f5; "><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">if (factory == null)<br />_serializerFactory = factory = new SerializerFactory();</p></blockquote><p style="font-size: 13px; margin: 0px 0px 10px; padding: 0px; color: #444444; font-family: Arial, Helvetica, sans-serif; line-height: 26.383333206176758px; background-color: #f9f7f5; ">每一个Hessian2Output内部都会重新new SerializerFactory();<br />应改为：</p><blockquote style="margin: 20px 0px 20px 20px; padding: 0px 0px 0px 20px; border-left-width: 3px; border-left-color: #cbcac8; color: #666666; font-style: italic; line-height: 1.5em; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #f9f7f5; "><p style="font-size: 1em; margin: 0px 0px 10px; padding: 0px; ">private static final SerializerFactory DEFAULT_SERIALIZER_FACTORY =new SerializerFactory();<br />if (factory == null)<br />_serializerFactory = factory = DEFAULT_SERIALIZER_FACTORY;</p></blockquote><p style="font-size: 13px; margin: 0px 0px 10px; padding: 0px; color: #444444; font-family: Arial, Helvetica, sans-serif; line-height: 26.383333206176758px; background-color: #f9f7f5; ">从这里可以看出是创建SerializerFactory的开销非常大，导致性能下降严重，<br />这个应该算是Hessian的BUG，这种线程安全的工厂类，就不应该在设默认值时，每次都new一个。<br />大家用Hessian的时候请小心这个问题。<br />后续还发现，不设置SerializerFactory，会出现大量线程被阻塞：<br />(下图为VisualVM截图，红色标识的片断为Blocked状态)<br /><img src="http://pt.alibaba-inc.com/wp/wp-content/uploads/2010/12/hessian_blocked.jpg" alt="hessian blocked" /></p><img src ="http://www.blogjava.net/kelly859/aggbug/385480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-08-14 17:33 <a href="http://www.blogjava.net/kelly859/archive/2012/08/14/385480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hessian 2.0序列化协议规范</title><link>http://www.blogjava.net/kelly859/archive/2012/08/14/385478.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Tue, 14 Aug 2012 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/08/14/385478.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/385478.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/08/14/385478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/385478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/385478.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载:http://www.cnblogs.com/OnlyXP/archive/2007/09/26/906005.html&nbsp;&nbsp;&nbsp;&nbsp;Hessian 2.0序列化协议规范&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;翻译: Edison peng&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly859/archive/2012/08/14/385478.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly859/aggbug/385478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-08-14 17:26 <a href="http://www.blogjava.net/kelly859/archive/2012/08/14/385478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员能力矩阵 你属于哪一层？</title><link>http://www.blogjava.net/kelly859/archive/2012/08/14/385444.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Tue, 14 Aug 2012 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/08/14/385444.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/385444.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/08/14/385444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/385444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/385444.html</trackback:ping><description><![CDATA[<div><p>注意:每个层次的知识都是渐增的，位于层次n，也蕴涵了你需了解所有低于层次n的知识。</p> <p><strong>计算机科学 Computer Science</strong></p> <p><img src="http://www.oschina.net/uploads/img/201007/20095625_SPjx.jpg" alt="" /></p> <p><strong>软件工程 Software Engineering</strong></p> <p><img src="http://www.oschina.net/uploads/img/201007/20095625_i8PB.jpg" alt="" /></p> <p><strong>程序设计 Programming</strong></p> <p><img style="float: left;" src="http://www.oschina.net/uploads/img/201007/20095625_Tcj9.jpg" alt="" /></p> <p><img src="http://www.oschina.net/uploads/img/201007/20095625_8Bpc.jpg" alt="" /></p> <p><img src="http://www.oschina.net/uploads/img/201007/20095625_N7tR.jpg" alt="" /></p> <p><img src="http://www.oschina.net/uploads/img/201007/20095626_4y4Z.jpg" alt="" /></p> <p><strong>经验 Experience </strong></p> <p><strong><img src="http://www.oschina.net/uploads/img/201007/20095626_ve3h.jpg" alt="" /></strong></p> <p><strong> </strong></p> <p><strong> </strong></p> <p><strong> </strong></p><p><strong><br />学识 Knowledge</strong></p><strong> </strong> <p><img src="http://www.oschina.net/uploads/img/201007/20095626_LOu2.jpg" alt="" /></p> <p><img src="http://www.oschina.net/uploads/img/201007/20095626_t3ua.jpg" alt="" /></p> <p>原文出处：</p> <p><a href="http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm">http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm</a></p> <p>译文出处：</p> <p><a href="http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm">http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm</a></p></div><img src ="http://www.blogjava.net/kelly859/aggbug/385444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-08-14 09:56 <a href="http://www.blogjava.net/kelly859/archive/2012/08/14/385444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 加密解密简单实现</title><link>http://www.blogjava.net/kelly859/archive/2012/08/13/385392.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 13 Aug 2012 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/08/13/385392.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/385392.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/08/13/385392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/385392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/385392.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.200000762939453px; background-color: #ffffff; "></p><p style="margin: 0px; padding: 0px; ">转载自：<a href="http://www.iteye.com/topic/572581" style="color: #7d0000; ">http://www.iteye.com/topic/572581</a></p><p style="margin: 0px; padding: 0px; ">&nbsp;</p><p style="margin: 0px; padding: 0px; ">加密算法有很多种：这里只大约列举几例：</p><p style="margin: 0px; padding: 0px; ">1:消息摘要：（数字指纹）：既对一个任意长度的一个数据块进行计算，产生一个唯一指纹。MD5/SHA1<br />发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要，最后进行比较摘要是否相同。<br /><br />2:单匙密码体制:DES:比较简便高效,密钥简短，加解密速度快，破译极其困难,但其安全性依赖于密匙的安全性。<br />DES（Data Encryption Standard）是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个：Key、Data、Mode。其中Key为8个字节共64位，是DES算法的工作密钥；Data也为8个字节64位，是要被加密或被解密的数据；Mode为DES的工作方式，有两种：加密或解密<br /><br />3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据（或称数字指纹）进行RSA算法操作，以保证发信人无法抵赖曾发过该信息（即不可抵赖性），同时也确保信息报文在经签名后末被篡改（即完整性）。当信息接收者收到报文后，就可以用发送者的公钥对数字签名进行验证。<br />代表：DSA<br /><br />4:非对称密匙密码体制（公匙体系）：加密密匙不同于解密密匙，加密密匙公之于众，谁都可以使用，解密密匙只有解密人自己知道。代表：RSA</p><p style="margin: 0px; padding: 0px; ">下面是对上面几个例子进行的简单实现：<br /><span style="background-color: #efefef; "><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CryptUtil&nbsp;<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;encryptByMD5(String&nbsp;info)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;digesta&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDigest&nbsp;alga&nbsp;=&nbsp;MessageDigest.getInstance("MD5");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alga.update(info.getBytes());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digesta&nbsp;=&nbsp;alga.digest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;digesta;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;encryptBySHA(String&nbsp;info)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;digesta&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDigest&nbsp;alga&nbsp;=&nbsp;MessageDigest.getInstance("SHA-1");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alga.update(info.getBytes());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digesta&nbsp;=&nbsp;alga.digest();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;digesta;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;SecretKey&nbsp;createSecretKey(String&nbsp;algorithm)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyGenerator&nbsp;keygen&nbsp;=&nbsp;KeyGenerator.getInstance(algorithm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deskey&nbsp;=&nbsp;keygen.generateKey();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;deskey;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;encryptByDES(SecretKey&nbsp;key,&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;bytes)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;algorithm&nbsp;=&nbsp;"DES";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;cipherByte&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加密随机数生成器&nbsp;(RNG),(可以不写)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecureRandom&nbsp;sr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SecureRandom();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c1&nbsp;=&nbsp;Cipher.getInstance(algorithm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1.init(Cipher.ENCRYPT_MODE,&nbsp;key,&nbsp;sr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipherByte&nbsp;=&nbsp;c1.doFinal(bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cipherByte;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;decryptByDES(SecretKey&nbsp;key,&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;bytes)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;cipherByte&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;algorithm&nbsp;=&nbsp;"DES";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加密随机数生成器&nbsp;(RNG)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecureRandom&nbsp;sr&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SecureRandom();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c1&nbsp;=&nbsp;Cipher.getInstance(algorithm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1.init(Cipher.DECRYPT_MODE,&nbsp;key,&nbsp;sr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipherByte&nbsp;=&nbsp;c1.doFinal(bytes);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cipherByte;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Pair&lt;PublicKey,PrivateKey&gt;&nbsp;createPairKey()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PublicKey&nbsp;pubKey&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrivateKey&nbsp;priKey&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyPairGenerator&nbsp;keygen&nbsp;=&nbsp;KeyPairGenerator.getInstance("DSA");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecureRandom&nbsp;random&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SecureRandom();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;random.setSeed(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keygen.initialize(512,&nbsp;random);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyPair&nbsp;keys&nbsp;=&nbsp;keygen.generateKeyPair();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pubKey&nbsp;=&nbsp;keys.getPublic();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;priKey&nbsp;=&nbsp;keys.getPrivate();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Pair.makePair(pubKey,&nbsp;priKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;signByDSA(<span style="color: #0000FF; ">byte</span>[]&nbsp;data,<span style="color: #0000FF; ">byte</span>[]&nbsp;privateKey)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PKCS8EncodedKeySpec&nbsp;pkcs8KeySpec=<span style="color: #0000FF; ">new</span>&nbsp;PKCS8EncodedKeySpec(privateKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyFactory&nbsp;keyFactory=KeyFactory.getInstance("DSA");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrivateKey&nbsp;priKey=keyFactory.generatePrivate(pkcs8KeySpec);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Signature&nbsp;signature&nbsp;=&nbsp;Signature.getInstance("DSA");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signature.initSign(priKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signature.update(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;signature.sign();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;verifyByDSA(<span style="color: #0000FF; ">byte</span>[]&nbsp;data,<span style="color: #0000FF; ">byte</span>[]&nbsp;publicKey,<span style="color: #0000FF; ">byte</span>[]&nbsp;sign)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyFactory&nbsp;keyFactory=KeyFactory.getInstance("DSA");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X509EncodedKeySpec&nbsp;x509KeySpec=<span style="color: #0000FF; ">new</span>&nbsp;X509EncodedKeySpec(publicKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PublicKey&nbsp;pubKey=keyFactory.generatePublic(x509KeySpec);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Signature&nbsp;signature&nbsp;=&nbsp;Signature.getInstance("DSA");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signature.initVerify(pubKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signature.update(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;signature.verify(sign);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg&nbsp;=&nbsp;"maxchen最喜欢重庆火锅了~~~~~";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("encryptByMD5:"&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(Base64.encode(encryptByMD5(msg))));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("encryptBySHA:"&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(Base64.encode(encryptBySHA(msg))));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pair&lt;PublicKey,PrivateKey&gt;&nbsp;pair&nbsp;=&nbsp;createPairKey();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("PublicKey:"&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(Base64.encode(pair.first.getEncoded())));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("PrivateKey:"&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(Base64.encode(pair.second.getEncoded())));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("signByDSA:"&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(Base64.encode(signByDSA(msg.getBytes(),pair.second.getEncoded()))));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("verifyByDSA:"&nbsp;+&nbsp;verifyByDSA(msg.getBytes(),pair.first.getEncoded(),Base64.decode("MCwCFCHItZVWw7xZJnUjB+3Uv6oLZfJCAhRL5nAQE6MkSwvF3XBOQr1mGN1Lbw==")));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><span style="background-color: #efefef; "><br />用到的重要的类</span></p><span style="background-color: #efefef; ">javax.crypto.KeyGenerator</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">public final SecretKey generateKey()生成一个密钥</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">public static final KeyGenerator getInstance(String algorithm) 返回生成指定算法的秘密密钥的KeyGenerator对象。</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">javax.crypto 接口 SecretKey</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">javax.crypto.Cipher 此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心&nbsp;</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">public final void init(int opmode,Key key)</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">public final byte[] doFinal(byte[] input) 按单部分操作加密或解密数据，或者结束一个多部分操作</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">java.security.KeyPairGenerator</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">static KeyPairGenerator getInstance(String algorithm)&nbsp;</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">回生成指定算法的 public/private 密钥对的 KeyPairGenerator 对象。</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">java.security.Signature</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">使用 Signature 对象签名数据或验证签名包括以下三个阶段：</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">1：初始化，使用&nbsp;</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">初始化验证签名的公钥（请参见 initVerify），或使用&nbsp;</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">初始化签署签名的私钥（也可以选择&#8220;安全随机数生成器&#8221;）initSign(PrivateKey)和initSign(PrivateKey, SecureRandom)）。&nbsp;</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">2：更新</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">根据初始化类型，这可更新要签名或验证的字节。请参见 update 方法。</span><br style="background-color: #efefef; " /><span style="background-color: #efefef; ">3：签署或验证所有更新字节的签名。请参见 sign 方法和 verify 方法。</span>&nbsp;<br /><p>&nbsp;</p><p>&nbsp;</p><img src ="http://www.blogjava.net/kelly859/aggbug/385392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-08-13 14:48 <a href="http://www.blogjava.net/kelly859/archive/2012/08/13/385392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】Lucene Syntax (lucene查询语法详解)</title><link>http://www.blogjava.net/kelly859/archive/2012/06/11/380504.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 11 Jun 2012 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/06/11/380504.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/380504.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/06/11/380504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/380504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/380504.html</trackback:ping><description><![CDATA[Lucene提供了丰富的API来组合定制你所需要的查询器，同时也可以利用Query Parser提供的强大的查询语法解析来构造你想要的查询器。本文章详细的介绍了Lucene的查询语法。通过Java语法分析器把一个查询字符串解析成 Lucene的查询器。在你选择使用Query Parser前，请考虑以下事项：<br /><br />如果你打算在程序中拼接查询语法串然后再利用Query Parser转换，那么强烈建议你利用相应的API来自己构造查询器。也就是说，Query Parser是为手工输入高级查询设计的，而不是为程序拼接语法串而设计的。不分词的字段也最好通过相应的API添加到查询器中，而不是通过Query Parser。Query Parser 使用的Analyser分析器，作用是将用户手工输入的文本转化为相应的Term。如果一个字段的值是通过程序生成的（例如日期字段，关键词字段等），那么在查询的时候也应该保持前后一致，利用程序生成相应的格式来查询。<br /><br />在查询的目标中，如果字段全部是程序生成的文本，（例如补齐的日期字段等），最好使用Query Parser以便查询的时候也是一致的格式。至于其它的，例如日期范围查询，关键字查询等，最好调用相应的API来构建查询器。目标字段中如果仅仅拥有有限的枚举值时，最好通过下拉列表提供给用户选择，然后利用TermQuery添加到查询器中，而不是而其拼接到查询字符串然后利用Query Parser来解析。<br /><br /><strong>Terms&nbsp;</strong><br />一个查询将分解为若干Term以及操作符，有两种Term，其一是单一Term，其二为短语。单一Term是经过分析器分词后的最小单元，他就是一个简单的词，例如&#8220;Test&#8221;和&#8220;Hello&#8221;。短语则是一组被双引号括起来的一组词，例如：&#8220;Hello dolly&#8221;，多个Term可以通过布尔操作合并在一个更加复杂的查询器中。<br />注意：一般来说，创建索引的分析器和查询的分析器最好保持一致（当然也有特殊情况，比如单字索引，分词组合查询），所以选择一个不会干扰查询词的分析器是很重要的。<br /><br /><strong>Fields&nbsp;</strong><br />Lucene支持多字段数据，当你在查询的时候你可以指定一个字段查询，也可以使用默认的字段。你可以使用 字段名 + &#8220;：&#8221; + 查询词来指定字段名搜索。举个例子，让我们假定Lucene的索引中含有两个字段，Title字段和Text字段，其中Text字段是默认字段，当你想找到一篇文档其中标题包含&#8220;The Right Way&#8221;同时文本中包含&#8220;go&#8221;，你可以输入：<br />title:"The Right Way" AND text:go&nbsp;<br />或者：<br />title:" The Right Way " AND go&nbsp;<br />如果字段是默认字段的话，在查询语法中可以不需要显式指定。注意，使用默认字段有可能会造成如下的结果：<br />title:Do it right&nbsp;<br />以上查询将查找标题中含有&#8220;Do&#8221;，Text字段字段中含有&#8220;it&#8221;和&#8220;right&#8221;的文档，因为Text是默认字段，所以如果想要查找Title中完整包含的很用引号引起来。<br /><br /><strong>Term Modifiers</strong><br />Lucene支持在Term中使用通配符来支持模糊查询。<br /><br /><strong>Wildcard Searches&nbsp;</strong><br />Lucene支持单个或者多个字符的通配符查询，匹配单一字符使用符号&#8220;?&#8221;，匹配多个字符使用符号&#8220;*&#8221;。<br />&#8220;?&#8221;通配符将查找所有满足通过一个字符替换后符合条件的文档。比如：搜索&#8220;test&#8221;和&#8220;text&#8221;你可以使用：<br />te?t&nbsp;<br />&#8220;*&#8221;通配符将查询0个或者多个字符替换后符合条件的。举例来说，查询test，tests或者tester，你可以使用一下字符串来搜索：<br />test*<br />当然，你也可以将&#8220;*&#8221;放在字符的中间<br />te*t&nbsp;<br />注意：你不能将&#8220;*&#8221;和&#8220;?&#8221;放在第一个字符来查询。（Lucene应该是出于性能考虑，所以不支持该功能）<br /><br /><strong>Fuzzy Searches&nbsp;</strong><br />Lucene支持基于编辑距离算法的模糊搜索，你可以使用波浪符号&#8220;~&#8221;放在查询词的后面，比如搜索一个与&#8220;roam&#8221;拼写相近的词可以使用：<br />roam~&nbsp;<br />该查询将寻找类似&#8220;foam&#8221;和&#8220;roams&#8221;等的词语。也可以说是相似度查询。<br /><br /><strong>Proximity Searches&nbsp;</strong><br />Lucene支持指定距离查询，你可以使用波浪号&#8220;~&#8221;加数字在查询词后。举例来说搜索&#8220;apache&#8221;和&#8220;jakarta&#8221;距离10个字符以内，你可以使用如下语法：<br />"jakarta apache"~10&nbsp;<br />通过这个语法支持，我们可以单字索引，分词查询，分词完后，满足每个词的单字必须间距为0。这样可以保证100%的召回率，但是在索引方面将造成索引臃肿，同时查询速度也将在某程度上降低，一般来说，在150W文章数据到200W数据的时候性能将会明显的降低。<br /><br /><strong>Range Searches&nbsp;</strong><br />范围查询允许你指定某个字段最大值和最小值，查询在二者之间的所有文档。范围查询可以包含或者不包含最大值和最小值，排序是按照字典顺序来排序的。<br />mod_date:[20020101 TO 20030101]&nbsp;<br />这个将查找满足mode_date字段在大于等于20020101，小于等于20030101范围的所有文档，注意：范围查询并不是为日期字段专设的，你也可以对非日期字段进行范围查询。<br />title:{Aida TO Carmen}&nbsp;<br />这个将查找所有标题在Aida和Carmen之间但不包含Aida和Carmen的文档。包含最大值和最小值的查询使用方括号，排除则使用花括号。<br /><br /><strong>Boosting a Term&nbsp;</strong><br />Lucene支持给不同的查询词设置不同的权重。设置权重使用&#8220;^&#8221;符号，将&#8220;^&#8221;放于查询词的尾部，同时跟上权重值，权重因子越大，该词越重要。设置权重允许你通过给不同的查询词设置不同的权重来影响文档的相关性，假如你在搜索：<br />jakarta apache&nbsp;<br />如果你认为&#8220;jakarta&#8221;在查询时中更加重要，你可以使用如下语法：<br />jakarta^4 apache&nbsp;<br />这将使含有Jakarta的文档具有更高的相关性，同样你也可以给短语设置权重如下：<br />"jakarta apache"^4 "jakarta lucene"&nbsp;<br />在默认情况下，权重因子为1，当然权重因子也可以小于1。<br /><br /><strong>Boolean operators&nbsp;</strong><br />布尔操作符可以将多个Term合并为一个复杂的逻辑查询。Lucene支持AND，<br />+，OR，NOT， -作为操作符号。注意，所有的符号必须为大写。<br /><br /><strong>OR&nbsp;</strong><br />OR操作符默认的连接操作符。这意味着，当没有给多个Term显式指定操作符时，将使用OR，只要其中一个Term含有，则可以查询出文档，这跟逻辑符号||的意思相似。假设我们查询一个文档含有&#8220;jakarta apache&#8221;或者&#8220;jakarta&#8221;时，我们可以使用如下语法：<br />"jakarta apache" jakarta&nbsp;<br />或者<br />"jakarta apache" OR jakarta&nbsp;<br /><br /><strong>AND&nbsp;</strong><br />AND操作符规定必须所有的Term都出现才能满足查询条件，这跟逻辑符号&amp;&amp;意思相似。如果我们要搜索一个文档中同时含有&#8220;jakarta apache&#8221;和&#8220;jakarta lucene&#8221;，我们可以使用如下语法：<br />&nbsp;&nbsp; "jakarta apache" AND "jakarta lucene"&nbsp;<br /><br /><strong>+</strong><br />+操作符规定在其后的Term必须出现在文档中，也就是查询词中的MUST属性。举个例子来说，当我们要查询一个文档必须包含&#8220;jakarta&#8221;，同时可以包含也可以不包含&#8220;lucene&#8221;时，我们可以使用如下语法：<br />+jakarta apache&nbsp;<br /><br /><strong>NOT&nbsp;</strong><br />NOT操作符规定查询的文档必须不包含NOT之后的Term，这跟逻辑符号中的!相似。当我们要搜索一篇文档中必须含有&#8220;jakarta apache&#8221;同时不能含有&#8220;Jakarta lucene&#8221;时，我们可以使用如下查询；<br />"jakarta apache" NOT "jakarta lucene"&nbsp;<br />注意：NOT操作符不能使用在单独Term中，举例来说，以下查询将返回无结果：<br />NOT "jakarta apache"&nbsp;<br /><br /><strong>-&nbsp;</strong><br />-操作符排除了包含其后Term的文档，跟NOT有点类似，假设我们要搜索&#8220;Jakarta apache&#8221;但不包含&#8220;Jakarta lucene&#8221;时，我们使用如下语法：<br />"jakarta apache" -"jakarta lucene"&nbsp;<br /><br /><strong>Grouping&nbsp;</strong><br />Lucene支持使用圆括号来将查询表达式分组，这将在控制布尔控制查询中非常有用。举例来说：当搜索必须含有&#8220;website&#8221;，另外必须含有&#8220;jakarta&#8221;和&#8220;apache&#8221;之一，我们可以用如下语法：<br />(jakarta OR apache) AND website&nbsp;<br />这种语法对消除歧义，确保查询表达式的正确性具有很大的意义。<br /><br /><strong>Field Grouping&nbsp;</strong><br />Lucene支持对字段用圆括号来进行分组，当我们要查询标题中含有&#8220;return&#8221;和&#8220;pink ranther&#8221;时，我们可以使用如下语法：<br />title:(+return +"pink panther")&nbsp;<br /><br /><strong>Escaping Special Characters&nbsp;</strong><br />Lucene支持转义查询中的特殊字符，以下是Lucene的特殊字符清单：<br />+ - &amp;&amp; || ! ( ) { } [ ] ^ " ~ * ? : \<br />转义特殊字符我们可以使用符号&#8220;\&#8221;放于字符之前。比如我们要搜索(1+1):2，我们可以使用如下语法：<br />\(1\+1\)\:2&nbsp;<br /><br />原文：<a href="http://hi.baidu.com/expertsearch/blog/item/8d4f7d355a2e413c5ab5f547.html">http://hi.baidu.com/expertsearch/blog/item/8d4f7d355a2e413c5ab5f547.html</a>&nbsp;<br />英文原版：<a target="_blank" href="http://lucene.apache.org/java/1_4_3/queryparsersyntax.html">http://lucene.apache.org/java/1_4_3/queryparsersyntax.html</a>&nbsp;<img src ="http://www.blogjava.net/kelly859/aggbug/380504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-06-11 15:56 <a href="http://www.blogjava.net/kelly859/archive/2012/06/11/380504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】利用Lucene 实现高级搜索</title><link>http://www.blogjava.net/kelly859/archive/2012/06/11/380503.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 11 Jun 2012 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/06/11/380503.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/380503.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/06/11/380503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/380503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/380503.html</trackback:ping><description><![CDATA[<p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; ">原文：<a href="http://www.cnblogs.com/weekzero/archive/2008/06/17/1224064.html">http://www.cnblogs.com/weekzero/archive/2008/06/17/1224064.html</a>&nbsp;<br /><br />Lucene 支持多种形式的高级搜索，我们在这一部分中会进行探讨，然后我会使用 Lucene 的 API 来演示如何实现这些高级搜索功能。<br /><br /></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><a style="color: #1d58d1; "><strong>布尔操作符</strong></a></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; ">大多数的搜索引擎都会提供布尔操作符让用户可以组合查询，典型的布尔操作符有 AND, OR, NOT。Lucene 支持 5 种布尔操作符，分别是 AND, OR, NOT, 加(+), 减(-)。接下来我会讲述每个操作符的用法。</p><ul style="margin-left: 45px; font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><li style="list-style: inherit; "><strong>OR</strong>: 如果你要搜索含有字符 A 或者 B 的文档，那么就需要使用 OR 操作符。需要记住的是，如果你只是简单的用空格将两个关键词分割开，其实在搜索的时候搜索引擎会自动在两个关键词之间加上 OR 操作符。例如，&#8220;Java OR Lucene&#8221; 和 &#8220;Java Lucene&#8221; 都是搜索含有 Java 或者含有 Lucene 的文档。</li><li style="list-style: inherit; "><strong>AND</strong>: 如果你需要搜索包含一个以上关键词的文档，那么就需要使用 AND 操作符。例如，&#8220;Java AND Lucene&#8221; 返回所有既包含 Java 又包含 Lucene 的文档。</li><li style="list-style: inherit; "><strong>NOT</strong>: Not 操作符使得包含紧跟在 NOT 后面的关键词的文档不会被返回。例如，如果你想搜索所有含有 Java 但不含有 Lucene 的文档，你可以使用查询语句 &#8220;Java NOT Lucene&#8221;。但是你不能只对一个搜索词使用这个操作符，比如，查询语句 &#8220;NOT Java&#8221; 不会返回任何结果。</li><li style="list-style: inherit; "><strong>加号（+）</strong>: 这个操作符的作用和 AND 差不多，但它只对紧跟着它的一个搜索词起作用。例如，如果你想搜索一定包含 Java，但不一定包含 Lucene 的文档，就可以使用查询语句&#8220;+Java Lucene&#8221;。</li><li style="list-style: inherit; "><strong>减号（-）</strong>: 这个操作符的功能和 NOT 一样，查询语句 &#8220;Java -Lucene&#8221; 返回所有包含 Java 但不包含 Lucene 的文档。</li></ul><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><a style="color: #1d58d1; "><strong>域搜索(Field Search)</strong></a></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; ">Lucene 支持域搜索，你可以指定一次查询是在哪些域(Field)上进行。例如，如果索引的文档包含两个域，<code>Title</code>&nbsp;和&nbsp;<code>Content</code>，你就可以使用查询 &#8220;Title: Lucene AND Content: Java&#8221; 来返回所有在 Title 域上包含 Lucene 并且在 Content 域上包含 Java 的文档。<br /><br /></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><a style="color: #1d58d1; "><strong>通配符搜索(Wildcard Search)</strong></a></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; ">Lucene 支持两种通配符：问号（？）和星号（*）。你可以使用问号（？）来进行单字符的通配符查询，或者利用星号（*）进行多字符的通配符查询。例如，如果你想搜索 tiny 或者 tony，你就可以使用查询语句 &#8220;t?ny&#8221;；如果你想查询 Teach, Teacher 和 Teaching，你就可以使用查询语句 &#8220;Teach*&#8221;。<br /></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><a style="color: #1d58d1; "><strong>模糊查询</strong></a></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; ">Lucene 提供的模糊查询基于编辑距离算法(Edit distance algorithm)。你可以在搜索词的尾部加上字符 ~ 来进行模糊查询。例如，查询语句 &#8220;think~&#8221; 返回所有包含和 think 类似的关键词的文档。<br /></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><a style="color: #1d58d1; "><strong>范围搜索(Range Search)</strong></a></p><p style="font-family: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; ">范围搜索匹配某个域上的值在一定范围的文档。例如，查询 &#8220;age:[18 TO 35]&#8221; 返回所有 age 域上的值在 18 到 35 之间的文档。</p><img src ="http://www.blogjava.net/kelly859/aggbug/380503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-06-11 15:50 <a href="http://www.blogjava.net/kelly859/archive/2012/06/11/380503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用XStream在Java对象和XML之间相互转换</title><link>http://www.blogjava.net/kelly859/archive/2012/06/06/380160.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 06 Jun 2012 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/06/06/380160.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/380160.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/06/06/380160.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/380160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/380160.html</trackback:ping><description><![CDATA[<div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><strong style="padding: 0px; margin: 0px; ">利用XStream在Java对象和XML之间相互转换</strong></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">原文地址：<a href="http://lavasoft.blog.51cto.com/62575/64114">http://lavasoft.blog.51cto.com/62575/64114</a></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">XStream是个好东西，可以方便在Java对象和XML之间相互转换，效率和可读性都非常高，下面是我写的一个测试的例子，放出来一块看看。</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">需要的jar包如下：</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">xpp3_min-1.1.4c.jar<br style="padding: 0px; margin: 0px; " />xstream-1.3.jar<br /><div>kxml2-2.3.0.jar</div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">目标：将Persons对象转换xml，再将xml转化为Persons对象。</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><strong style="padding: 0px; margin: 0px; ">实现源码列表：</strong></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><strong style="padding: 0px; margin: 0px; "></strong>&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin: 0px; "><div style="padding: 4px; margin: 0px; border: 1px solid #cccccc; font-size: 10pt; width: 705px; color: #000000; word-break: break-all; line-height: 16px; font-family: verdana, 宋体; background-color: #eeeeee; ">package&nbsp;com.lavasoft.demo3;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />import&nbsp;com.thoughtworks.xstream.XStream;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />import&nbsp;java.util.List;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;java.util.ArrayList;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;java.util.Iterator;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;java.io.StringReader;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;java.io.FileReader;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;java.io.File;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;java.io.FileNotFoundException;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />import&nbsp;org.dom4j.io.SAXReader;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;org.dom4j.Document;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;org.dom4j.Node;&nbsp;<br style="padding: 0px; margin: 0px; " />import&nbsp;org.dom4j.DocumentException;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />/**&nbsp;<br style="padding: 0px; margin: 0px; " />* Created by IntelliJ IDEA.&nbsp;<br style="padding: 0px; margin: 0px; " />* File: demo3.java&nbsp;<br style="padding: 0px; margin: 0px; " />* User: leizhimin&nbsp;<br style="padding: 0px; margin: 0px; " />* Date: 2008-3-4 14:44:03&nbsp;<br style="padding: 0px; margin: 0px; " />*/&nbsp;<br style="padding: 0px; margin: 0px; " />public&nbsp;class&nbsp;XStreamDemo {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String args[]) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testBean2XML();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; * 生成一个Persons对象&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; * @return Persons对象&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Persons getPersons() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address add1 =&nbsp;new&nbsp;Address("type1",&nbsp;"郑州市经三路财富广场1");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address add2 =&nbsp;new&nbsp;Address("type2",&nbsp;"郑州市经三路财富广场2");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Address&gt; addlist1 =&nbsp;new&nbsp;ArrayList&lt;Address&gt;();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addlist1.add(add1);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addlist1.add(add2);&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address add3 =&nbsp;new&nbsp;Address("type3",&nbsp;"郑州市经三路财富广场3");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address add4 =&nbsp;new&nbsp;Address("type4",&nbsp;"郑州市经三路财富广场4");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Address&gt; addlist2 =&nbsp;new&nbsp;ArrayList&lt;Address&gt;();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addlist2.add(add3);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addlist2.add(add4);&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Addresses addes1 =&nbsp;new&nbsp;Addresses(addlist1);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Addresses addes2 =&nbsp;new&nbsp;Addresses(addlist2);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person person1 =&nbsp;new&nbsp;Person(addes1,&nbsp;"6666554",&nbsp;"lavasoft",&nbsp;"man");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person person2 =&nbsp;new&nbsp;Person(addes2,&nbsp;"7777754",&nbsp;"yutian",&nbsp;"man");&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Person&gt; listPerson =&nbsp;new&nbsp;ArrayList&lt;Person&gt;();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listPerson.add(person1);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listPerson.add(person2);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Persons persons =&nbsp;new&nbsp;Persons(listPerson,&nbsp;"001");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;persons;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; * 利用XStream在Java对象和XML之间相互转换&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;testBean2XML() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("将Java对象转换为xml！\n");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Persons persons = getPersons();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XStream xstream =&nbsp;new&nbsp;XStream();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xstream.alias("address", Address.class);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xstream.alias("addresses", Addresses.class);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xstream.alias("person", Person.class);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xstream.alias("persons", Persons.class);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String xml = xstream.toXML(persons);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(xml);&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("\n将xml转换为Java对象！");&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Persons cre_person = (Persons) xstream.fromXML(xml);&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(cre_person.toString());&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />}</div></div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin: 0px; "><div style="padding: 4px; margin: 0px; border: 1px solid #cccccc; font-size: 10pt; width: 705px; color: #000000; word-break: break-all; line-height: 16px; font-family: verdana, 宋体; background-color: #eeeeee; ">public&nbsp;class&nbsp;Persons {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String type;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&lt;Person&gt; listPerson;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Persons(List&lt;Person&gt; listPerson, String type) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.listPerson = listPerson;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.type = type;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String getType() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;type;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setType(String type) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.type = type;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List&lt;Person&gt; getListPerson() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;listPerson;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setListPerson(List&lt;Person&gt; listPerson) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.listPerson = listPerson;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String toString() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer sb=new&nbsp;StringBuffer();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Iterator it=listPerson.iterator();it.hasNext();){&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person p=(Person)it.next();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(it.toString());&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Persons{"&nbsp;+&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type='"&nbsp;+ type + '\'' +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", listPerson="&nbsp;+ sb.toString() +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"}\n";&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />}</div></div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin: 0px; "><div style="padding: 4px; margin: 0px; border: 1px solid #cccccc; font-size: 10pt; width: 705px; color: #000000; word-break: break-all; line-height: 16px; font-family: verdana, 宋体; background-color: #eeeeee; ">public&nbsp;class&nbsp;Person {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String name;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String sex;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String tel;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Addresses addes;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Person(Addresses addes, String name, String sex, String tel) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addes = addes;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sex = sex;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.tel = tel;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Addresses getAddes() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;addes;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setAddes(Addresses addes) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addes = addes;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String getName() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;name;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setName(String name) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name = name;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String getSex() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sex;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSex(String sex) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sex = sex;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String getTel() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;tel;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setTel(String tel) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.tel = tel;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String toString() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Person{"&nbsp;+&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"addes="&nbsp;+ addes.toString() +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", name='"&nbsp;+ name + '\'' +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", sex='"&nbsp;+ sex + '\'' +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", tel='"&nbsp;+ tel + '\'' +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"}\n";&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />}</div></div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin: 0px; "><div style="padding: 4px; margin: 0px; border: 1px solid #cccccc; font-size: 10pt; width: 705px; color: #000000; word-break: break-all; line-height: 16px; font-family: verdana, 宋体; background-color: #eeeeee; ">public&nbsp;class&nbsp;Addresses {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&lt;Address&gt; listAdd;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Addresses(List&lt;Address&gt; listAdd) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.listAdd = listAdd;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List&lt;Address&gt; getListAdd() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;listAdd;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setListAdd(List&lt;Address&gt; listAdd) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.listAdd = listAdd;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String toString() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer sb=new&nbsp;StringBuffer();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Iterator it=listAdd.iterator();it.hasNext();){&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address add=(Address)it.next();&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(add.toString());&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Addresses{"&nbsp;+&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"listAdd="&nbsp;+ sb.toString() +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"}\n";&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />}</div></div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin: 0px; "><div style="padding: 4px; margin: 0px; border: 1px solid #cccccc; font-size: 10pt; width: 705px; color: #000000; word-break: break-all; line-height: 16px; font-family: verdana, 宋体; background-color: #eeeeee; ">public&nbsp;class&nbsp;Address {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String addType;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String place;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Address(String addType, String place) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addType = addType;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.place = place;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String getAddType() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;addType;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setAddType(String addType) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.addType = addType;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String getPlace() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;place;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setPlace(String place) {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.place = place;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String toString() {&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Address{"&nbsp;+&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"addType='"&nbsp;+ addType + '\'' +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", place='"&nbsp;+ place + '\'' +&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"}\n";&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding: 0px; margin: 0px; " />}</div></div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">运行测试类XStreamDemo，打印出结果：</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin: 0px; "><div style="padding: 4px; margin: 0px; border: 1px solid #cccccc; font-size: 10pt; width: 705px; color: #000000; word-break: break-all; line-height: 16px; font-family: verdana, 宋体; background-color: #eeeeee; ">将Java对象转换为xml！&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />&lt;persons&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&lt;type&gt;001&lt;/type&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&lt;listPerson&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&lt;person&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;6666554&lt;/name&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sex&gt;lavasoft&lt;/sex&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tel&gt;man&lt;/tel&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addes&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;listAdd&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addType&gt;type1&lt;/addType&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;place&gt;郑州市经三路财富广场1&lt;/place&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addType&gt;type2&lt;/addType&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;place&gt;郑州市经三路财富广场2&lt;/place&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/listAdd&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/addes&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/person&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&lt;person&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;7777754&lt;/name&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sex&gt;yutian&lt;/sex&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tel&gt;man&lt;/tel&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addes&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;listAdd&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addType&gt;type3&lt;/addType&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;place&gt;郑州市经三路财富广场3&lt;/place&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addType&gt;type4&lt;/addType&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;place&gt;郑州市经三路财富广场4&lt;/place&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/listAdd&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/addes&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/person&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&nbsp;&nbsp;&lt;/listPerson&gt;&nbsp;<br style="padding: 0px; margin: 0px; " />&lt;/persons&gt;&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />将xml转换为Java对象！&nbsp;<br style="padding: 0px; margin: 0px; " />Persons{type='001', listPerson=java.util.AbstractList$<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#73;&#116;&#114;&#64;&#49;&#99;&#100;&#101;&#49;&#48;&#48;&#106;&#97;&#118;&#97;&#46;&#117;&#116;&#105;&#108;&#46;&#65;&#98;&#115;&#116;" style="padding: 0px; margin: 0px; color: #434343; text-decoration: none; ">Itr@1cde100java.util.Abst</a>ractList$Itr@1cde100}&nbsp;<br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " /><br style="padding: 0px; margin: 0px; " />Process finished with exit code 0&nbsp;</div></div></div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">&nbsp;</div><div style="margin: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">呵呵，XStream不错吧！</div><img src ="http://www.blogjava.net/kelly859/aggbug/380160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-06-06 17:53 <a href="http://www.blogjava.net/kelly859/archive/2012/06/06/380160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中Class.getResource用法</title><link>http://www.blogjava.net/kelly859/archive/2012/06/06/380124.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 06 Jun 2012 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/06/06/380124.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/380124.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/06/06/380124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/380124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/380124.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">原文地址:<a href="http://gavin-chen.iteye.com/blog/261151">http://gavin-chen.iteye.com/blog/261151</a>&nbsp;<br /><br />　　用JAVA获取文件，听似简单，但对于很多像我这样的新人来说，还是掌握颇浅，用起来感觉颇深，大常最经常用的，就是用JAVA的File类，如要取得c:/test.txt文件，就会这样用File file = new File("c:/test.txt");这样用有什么问题，相信大家都知道，就是路径硬编码，对于JAVA精神来说，应用应该一次成型，到处可用，并且从现实应用来讲，最终生成的应用也会部署到Windows外的操作系统中，对于linux来说，在应用中用了c:/这样的字样，就是失败，所以，我们应该尽量避免使用硬编码，即直接使用绝对路径。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">　　在Servlet应用中，有一个getRealPath(String str)的方法，这个方法尽管也可以动态地获得文件的路径，不秘直接手写绝对路径，但这也是一个不被建议使用的方法，那么，我们有什么方法可以更好地获得文件呢?</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那就是Class.getResource()与Class.getResourceAsStream()方法，但很多人还是不太懂它的用法，因为很多人（比如不久前的我）都不知道应该传怎么样的参数给它，当然，有些人己经用得如火纯青，这些人是不需要照顾的，在此仅给不会或者还不是很熟的人解释一点点。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">比如我们有以下目录</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">|--project</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; |--src</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--javaapplication</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--Test.java</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;|--file1.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--file2.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; |--build&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--javaapplication</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;|--Test.class</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--file3.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--file4.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">在上面的目录中，有一个src目录，这是JAVA源文件的目录，有一个build目录，这是JAVA编译后文件(.class文件等）的存放目录</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">那么，我们在Test类中应该如何分别获得</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">file1.txt&nbsp; file2.txt&nbsp; file3.txt&nbsp; file4.txt这四个文件呢？</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">首先讲file3.txt与file4.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">file3.txt:</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法一：File file3 = new File(Test.class.getResource("file3.txt").getFile());</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法二：File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile());</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法三：File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">file4.txt:</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法一：File file4 = new File(Test.class.getResource("/file4.txt").getFile());</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法二：File file4 = new File(Test.class.getClassLoader().getResource("file4.txt").getFile());</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">很好，我们可以有多种方法选择，但是file1与file2文件呢？如何获得？</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">答案是，你只能写上它们的绝对路径，不能像file3与file4一样用class.getResource()这种方法获得，它们的获取方法如下</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">假如整个project目录放在c:/下，那么file1与file2的获取方法分别为</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">file1.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法一：File file1 = new File("c:/project/src/javaapplication/file1.txt");</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法二：。。。没有</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">file2.txt</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法一：File file2 = new File("c:/project/src/file2.txt");</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">方法二：。。。也没有</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">总结一下，就是你想获得文件，你得从最终生成的.class文件为着手点，不要以.java文件的路径为出发点，因为真正使用的就是.class，不会拿个.java文件就使用，因为java是编译型语言嘛</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">至于getResouce()方法的参数，你以class为出发点，再结合相对路径的概念，就可以准确地定位资源文件了，至于它的根目录嘛，你用不同的IDE build出来是不同的位置下的，不过都是以顶层package作为根目录，比如在Web应用中，有一个WEB-INF的目录，WEB-INF目录里面除了web.xml文件外，还有一个classes目录，没错了，它就是你这个WEB应用的package的顶层目录，也是所有.class的根目录&#8220;/&#8221;，假如clasaes目录下面有一个file.txt文件，它的相对路径就是"/file.txt"，如果相对路径不是以"/"开头，那么它就是相对于.class的路径。。</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; text-align: left; background-color: #ffffff; ">还有一个getResourceAsStream()方法，参数是与getResouce()方法是一样的，它相当于你用getResource()取得File文件后，再new InputStream(file)一样的结果</p><img src ="http://www.blogjava.net/kelly859/aggbug/380124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-06-06 13:52 <a href="http://www.blogjava.net/kelly859/archive/2012/06/06/380124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何“打败”CAP定理</title><link>http://www.blogjava.net/kelly859/archive/2012/05/21/378716.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 21 May 2012 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/21/378716.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/378716.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/21/378716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/378716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/378716.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #888888; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">CAP定理是数据系统设计的基本理论，目前几乎所有的数据系统的设计都遵循了这个定理。但CAP定理给目前的数据系统带来了许多复杂的、不可控的问题，使得数据系统的设计越来越复杂。Twitter首席工程师、Storm的作者Nathan Marz在本文中通过避开CAP定理带来的诸多复杂问题，展示了一个不同于以往的数据系统设计方案，给我们的数据系统设计带来了全新的思路。</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">CAP定理指出，一个数据库不可能同时满足一致性（Consistency）、可用性（Availability）和分区容错性（Partition-Tolerance）。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">一致性（Consistency）是指执行了一次成功的写操作之后，未来的读操作一定可以读到这个写入的值。可用性（Availability）是指系统总是可读可写的。Yammer的Coda Hale和Cloudera的Henry Robinson都阐述过，分区容错性是不能牺牲的，因此只能在一致性和可用性上做取舍，如何处理这种取舍正是目前NoSQL数据库的核心焦点。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">选择一致性而不是可用性的系统将面临一些尴尬的问题，当系统不可用时怎么办？你可以对写操作进行缓冲处理，但如果存储缓冲数据的机器出现故障，客户端将丢失写入的值。同样地，缓冲写也可以被认为是一种非一致性的操作，因为客户端认为成功的写入实际上并没有写入到实际的数据库中。当然，系统可以在机器不可用时向客户端返回错误，但可以想象，一个经常告诉客户端&#8220;请重试&#8221;的产品是多么令人讨厌。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">另一个方案是选择可用性放弃一致性。这种情况下最好的一致性保障是&#8220;最终一致性&#8221;（Eventually Consistency）。当使用最终一致性的系统时，客户端有时会读到与刚刚写入数据不同的数据。有时候，同一时间同一个key的多个请求有可能返回不同的结果。数据更新并不能及时在所有的复制节点上生效，所以不同的复制节点上可能读取到的是不同的值。当你检测到数据不一致性时，你需要进行修复（Repair）操作，这就需要使用矢量时钟（vector clock）记录数据的版本历史并合并不同的数据更新（这称为读取修复，read repair）。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我相信在应用层维护最终一致性对开发人员负担太重，开发人员极易弄错读取修复的代码，而一旦开发人员犯错，有问题的读取修复将对数据库系统造成不可逆的损坏。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">所以牺牲可用性时问题会很多，牺牲一致性时构建和维护系统的复杂度又很高，但这里又只有两个选择，不管怎样做都会不完美。CAP定理是改不了的，那么还有什么其他可能的选择吗？</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">实际上，还有一个办法：你并不能避开CAP定理，但可以把复杂的问题独立出来，免得你丧失对整个系统的掌控能力。CAP定理带来的复杂性，其实是我们如何构建数据系统这一根本问题的体现。其中有两点特别重要：数据库中可变状态和更新状态的增量算法。复杂性正是这两点和CAP定理之间的相互作用导致的。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">本文将通过一个数据库系统的设计，来说明如何解决CAP定理通常会造成的复杂性问题。但我要做的不仅仅如此，CAP定理是一个针对机器发生错误时系统容错性的一个定理，而这里有比机器容错性更加重要的容错性&#8212;&#8212;人为操作容错性。在软件开发中一个确定的事实是，开发人员都并非完人，产品中难免有一些Bug，我们的系统必须对有Bug的程序写入的错误数据有足够的适应能力，我要展示的系统将是这样一个可以容忍人为错误的系统。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">本文将挑战你对数据系统如何构建这一问题的假设，通过颠覆传统数据系统构建方法，我会让大家看到一个前所未见的优雅、扩展性强、健壮的数据系统。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">什么是数据系统？</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">在开始介绍系统设计之前，让我们先来看看我们要解决的问题：数据系统的目的在于什么？ 什么是数据？ 在我们考虑CAP定理之前，我们必须给出一个可以适用于所有数据应用程序的定义来回答上述问题。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">数据应用程序种类很多，包括存入和提取数据对象、连接、聚合、流处理、机器学习等。似乎并不存在一个对数据系统的明确定义，数据处理的多样性使得我们很难用一个定义来描述。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">事实却并非如此，下面这个简单的定义：<strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; "></strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #808080; ">Query = Function(All Data)</span></strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">概括了数据库和数据系统的所有领域。每一个领域&#8212;&#8212;有50年历史的RDBMS、索引、OLAP、OLTP、MapReduce、EFL、分布式文件系统、流处理器、NoSQL等&#8212;&#8212;都可以被概括进这个方程。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">所谓数据系统就是要回答数据集问题的系统，这些问题我们称之为&#8220;查询&#8221;。上面的方程表明，查询就是数据上的一个函数。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">上述方程对于实际使用来说太过于笼统，几乎对复杂的数据系统设计不起什么作用。但如果所有的数据系统都遵循这个方程又会怎样呢？这个方程是探索我们数据系统的第一步，而它最终将引导我们找到&#8220;打败&#8221;CAP定理的方法。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">这个方程里面有两个关键概念：数据、查询。这两个完全不同的概念经常被混为一谈，所以下面来看看这两个概念究竟是什么意思。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">数据</strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我们先从&#8220;数据&#8221;开始。所谓数据就是一个不可分割的单位，它肯定存在，就跟数学里面的公理一样。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">关于&#8220;数据&#8221;有两个关键的性质。首先，数据是跟时间相关的，一个真实的数据一定是在某个时间点存在于那儿。比如，假如Sally在她的社交网络个人资料中写她住在芝加哥，你拿到的这个数据肯定是她某个时间在芝加哥填写的。假如某天Sally把她资料里面居住地点更新为亚特兰大，那么她肯定在这个时候是住在亚特兰大的，但她住在亚特兰大的事实无法改变她曾经住在芝加哥这个事实&#8212;&#8212;这两个数据都是真实的。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">其次，数据无法改变。由于数据跟某个时间点相关，所以数据的真实性是无法改变的。没有人可以回到那个时间去改变数据的真实性，这说明了对数据操作只有两种：读取已存在的数据和添加更多的新数据。那么CRUD就变成了CR【译者注：CRUD是指Create Read Update Delete，即数据的创建、读取、更新和删除】。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我去掉了&#8220;更新&#8221;操作，因为更新对于不可改变的数据没有任何作用。例如，更新Sally的位置信息本质上就是在她住的地方数据中新加一条最近的位置信息而已。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我同样去掉了&#8220;删除&#8221;操作，因为绝大部分删除操作可以更好地表述为新加一条数据。比如Bob在Twitter上不再关注Mary了，这并不能改变他曾经关注过Mary这个事实。所以与其删除Bob关注Mary这个数据，还不如新加一条Bob在某个时间点不再关注Mary这个数据。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">这里只有很少数的情况需要永久&#8220;删除&#8221;数据，例如规则要求你每隔一段时间清掉数据，这个情况在我将要展示的系统中有很好的解决方案，所以为了简洁，我们暂不考虑这些情况。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">查询</strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">查询是一个针对数据集的推导，就像是一个数学里面的定理。例如，你可以通过计算&#8220;Sally现在的位置在哪里&#8221;这个查询来得到Sally最新的位置数据。查询是整个数据集合上的函数，可以做一切事情：聚合、连接不同类型的数据等。因此，你可以查询系统中女性用户的数量，可以查询最近几小时热门的Twitter内容。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">前面我已经定义查询是整个数据集上的函数，当然，不是所有的查询都需要整个数据集，它们只需要数据集的<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #000000; ">一个子集。但我的定义是涵盖了所有的查询类型，如果想要&#8220;打败&#8221;CAP定理，我们需要能够处理所有的查询。</span></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">打败CAP定理</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">计算查询最简单的办法就是按照查询语义在整个数据集上运行一个函数。如果这可以满足你对延迟的要求，那么就没有其他需要构建的了。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">可想而知，我们不能指望在整个数据集上的查询能够很快完成，特别是那些服务大型网站、需要每秒处理几百万次请求的系统。但假如这种查询可以很快完成，让我们来看看像这样的系统和CAP定理的PK结果：你将会看到，这个系统不仅打败了CAP定理，而且还消灭了它。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">CAP定理仍然适用，所以你需要在可用性和一致性上做出选择，这里的漂亮之处在于，一旦你权衡之后做出了选择，你就做完了所有的事情。通常的那些因为CAP定理带来的问题，都可以通过不可改变的数据和从原始数据中计算查询来规避。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">如果你选择一致性而不是可用性，那么跟以前并没有多大的区别，因为你放弃了可用性，所以一些时候你将无法读取或者写入数据。当然这只是针对对强一致性有要求的系统。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">如果你选择可用性而不是一致性，在这种情况下，系统可以达到最终一致性而且规避了所有最终一致性带来的复杂问题。由于系统总是可用的，所以你总可以写入新数据或者进行查询。在出错情况下，查询可能返回的不是最近写入的数据，但根据最终一致性，这个数据最终会一致，而查询函数最终会把这个数据计算进去。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">这里的关键在于数据是不可变的。不可变数据意味着这里没有更新操作，所以不可能出现数据复制不同这种不一致的情况，也意味着不需要版本化的数据、矢量时钟或者读取修复。在一个查询场景中，一个数据只有存在或者不存在两种情况。这里只有数据和在数据之上的函数。这里没有需要你为确保最终一致性额外做的事情，最终一致性也不会因此使你的系统变得复杂。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">之前的复杂度主要来自增量更新操作和CAP定理之间的矛盾，在最终一致性系统中可变的值需要通过读取修复来保证最终一致性。通过使用不可变数据，去掉增量更新，使用不可变数据，每次从原始数据计算查询，你可以规避那些复杂的问题。CAP定理就被打败了。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">当然，现在讲的只不过是想法而已，而且每次从原始数据计算查询基本上不可能。但我们从中可以学到一些在实际解决方案中的关键点。</p><ul style="margin: 5px 0px 15px; padding: 0px 0px 0px 20px; border: 0px; outline: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">数据系统因为不可变数据和不断增长的数据集变得简单了。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">基本的写入操作就是写入一条新的不可变数据。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">数据系统通过重新从原始数据计算查询规避了CAP定理带来的复杂度。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">数据系统利用增量算法使得查询的返回延迟降低到一个可以接受的程度。</li></ul><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">让我们开始探索这个数据系统应该如何设计。请注意从这里开始我们所描述都是针对系统优化、数据库、索引、EFL、批量计算、流处理&#8212;&#8212;这些技术都是对查询函数的优化，让查询返回时间降低到一个可以接受的程度。这很简单，但也是数据系统所面对的现实。数据库通常是数据管理的核心，但它们是更大蓝图中的一部分。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">批量计算</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; text-align: left; ">&#8220;如何让任意一个函数可以在任意一个数据集上快速执行完成&#8221;这个问题太过于复杂，所以我们先放宽了一下这个问题依赖条件。首先假设，可以允许数据滞后几小时。放宽这个条件之后，我们可以得到一个简单、优雅、通用的数据系统构建解决方案。之后，我们会通过扩展这个解决方案使得它可以不用放宽条件来解决问题。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; text-align: left; ">由于查询是所有数据的一个函数，让查询变快的最简单的方法就是预先计算好这些查询。只要这里有新的数据，你就重新计算这些查询。这是可能的，因为我们放宽了条件使得我们的数据可以滞后几个小时。图1展示了这个工作流程。</p><div id="attachment_9264"  aligncenter"="" style="margin: 10px auto 1em; padding: 4px; border: 0px; outline: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: #ffffff; text-align: center; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; width: 338px; "><a href="http://www.programmer.com.cn/wp-content/uploads/2011/12/222.jpg" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #0088cc; text-decoration: none; "><img wp-image-9264=""  "="" title="222" src="http://www.programmer.com.cn/wp-content/uploads/2011/12/222.jpg" alt="图1 预计算工作流程" width="328" height="179" style="margin: 5px 0px 0px; padding: 0px; border: 0px none; outline: 0px; " /></a><p style="margin: 0px; padding: 6px 3px 2px; border: 0px; outline: 0px; font-size: 10px; line-height: 16px; text-indent: 28px; ">图1 预计算工作流程</p></div><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">为了实现这个，你的系统需要：</p><ul style="margin: 5px 0px 15px; padding: 0px 0px 0px 20px; border: 0px; outline: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">能很容易存储大的、不断增长的数据集；</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">能在数据集上可扩展地计算查询函数。</li></ul><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">这样的系统是存在的，即Hadoop。它是一个成熟的、经历了无数团队实战检验过的系统，同时拥有一个巨大的工具生态系统。它虽不完美，但是这里用来做批量处理的最好的一个工具。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">许多人也许会告诉你，Hadoop只适用于那些&#8220;非结构化&#8221;的数据，这是完全错误的看法。Hadoop处理&#8220;结构化&#8221;的数据也很不错，通过使用像Thrift或者Protocol Buffers这样的工具，你可以使用丰富的数据结构存储你的数据。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">Hadoop由分布式文件系统HDFS和批处理框架MapReduce两部分构成。HDFS可以通过文件存储大量数据，MapReduce可以在这样数据上进行可扩展计算。这个系统完全符合我们的要求。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我们将数据以文件形式存储到HDFS中去。文件可以包括一个数据记录序列。新增数据时，我们只需要在包括所有数据的文件夹中新增一个包含这条新记录的文件即可。像这样在HDFS存储数据满足了&#8220;能够很容易存储大的、不断增长的数据集&#8221;这个要求。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">预计算数据集上的查询也很直观，MapReduce是一个足够复杂的框架，使得几乎所有的函数都可以按照多个MapReduce任务这种方式实现。像Cascalog、Cascading和Pig这样的工具使实现这些函数变得十分简单。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">最后，为了可以快速访问这些预计算查询结果，你需要对查询结果进行索引，这里有许多数据库可以完成这个工作。ElephantDB和Voldemort read-only可以通过从Hadoop中导出key/value数据来加快查询速度。这些数据库支持批量写和随机读，同时不支持随机写。随机写使得数据库变得复杂，所以通过不支持随机写，这些数据库设计得特别简洁，也就几千行代码而已。简洁使得这些数据库鲁棒性变得非常好。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">下面来看批量处理系统整体上是如何配合工作的。假设写一个网站分析程序来跟踪页面访问量，你需要能够查询到任意时间段的页面访问量，数据是以小时方式提供的。如图2所示。</p><div id="attachment_9265"  aligncenter"="" style="margin: 10px auto 1em; padding: 4px; border: 0px; outline: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: #ffffff; text-align: center; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; width: 370px; "><a href="http://www.programmer.com.cn/wp-content/uploads/2011/12/1_%E5%89%AF%E6%9C%AC.jpg" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #0088cc; text-decoration: none; "><img wp-image-9265=""  "="" title="1_副本" src="http://www.programmer.com.cn/wp-content/uploads/2011/12/1_%E5%89%AF%E6%9C%AC.jpg" alt="图2 批处理工程流程示例(timestamp代表时间戳，count代表个数)" width="360" height="116" style="margin: 5px 0px 0px; padding: 0px; border: 0px none; outline: 0px; " /></a><p style="margin: 0px; padding: 6px 3px 2px; border: 0px; outline: 0px; font-size: 10px; line-height: 16px; text-indent: 28px; ">图2 批处理工程流程示例(timestamp代表时间戳，count代表个数)</p></div><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">实现这个很简单，每一个数据记录包括一个单一页面的访问量。这些数据通过文件形式存储到HDFS中，一个函数通过实现MapReduce计算任务，来计算一个URL下页面每小时的访问量。这个函数产生的是key/value对，其中[URL, hour]是key，value是页面的访问量。这些key/value对被导出到ElephantDB中去，使得应用程序可以快速得到任意[URL, hour]对对应的值。如果应用程序想要知道某个时间范围内某个页面的访问量，它可以查询ElephantDB中那段时间内的数据，然后把这些数据相加就可以得到这个访问量数据了。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">在数据滞后几小时这个缺陷下，批量处理可以计算任意数据集上的任意函数。系统中的&#8220;任意性&#8221;是指这个系统可以处理任何问题。更重要的是，它很简单，容易理解和完全可扩展，你需要考虑的只是数据和查询函数，Hadoop会帮你处理并行的事情。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">批处理系统、CAP定理和容忍人为错误</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">截至目前，我们的系统都很不错，这个批处理系统是不是可以达到容忍人为错误的目标呢？</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">让我们从CAP定理开始。这个批处理系统总是最终一致的：写入的数据总可以在几小时后被查询到。这个系统是一个很容易掌控的最终一致性系统，使得你可以只用关注你的数据和针对数据的查询函数。这里没有涉及读取修复、并发和其他一些需要考虑的复杂问题。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">接下来看看这个系统对人为错误的容忍性。在这个系统中人们可能会犯两个错误：部署了一个有Bug的查询函数或者写入了错误的数据。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">如果部署了一个有Bug的查询函数，需要做的所有事情就是修正那个Bug，重新部署这个查询函数，然后在主数据集上重新计算它。这之所以能起作用是因为查询只是一个函数而已。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">另外，错误的数据有明确的办法可以恢复：删除错误数据，然后重新计算查询。由于数据是不可变的，而且数据集只是往后添加新数据，写入错误的数据不会覆盖或者删除正确的数据，这与传统数据库更新一个数据就丢掉旧的数据形成了鲜明的对比。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">注意到MVCC和HBase类似的行版本管理并不能达到上面人为错误容忍级别。MVCC和HBase行版本管理不能永久保存数据，一旦数据库合并了这些版本，旧的数据就会丢失。只有不可变数据系统能够保证你在写入错误数据时可以找到一个恢复数据的方法。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">实时层</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">上面的批量处理系统几乎完全解决了在任意数据集上运行任意函数的实时性需求。任何超过几个小时的数据已经被计算进入了批处理视图中，所以剩下来要做的就是处理最近几个小时的数据。我们知道在最近几小时数据上进行查询比在整个数据集上查询要容易，这是关键点。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; text-align: left; ">为了处理最近几个小时的数据，需要一个实时系统和批处理系统同时运行。这个实时系统在最近几个小时数据上预计算查询函数。要计算一个查询函数，需要查询批处理视图和实时视图，并把它们合并起来以得到最终的数据。</p><div id="attachment_9267"  aligncenter"="" style="margin: 10px auto 1em; padding: 4px; border: 0px; outline: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: #ffffff; text-align: center; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; width: 310px; "><a href="http://www.programmer.com.cn/wp-content/uploads/2011/12/2_%E5%89%AF%E6%9C%AC_%E5%89%AF%E6%9C%AC.jpg" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #0088cc; text-decoration: none; "><img wp-image-9267=""  "="" title="2_副本_副本" src="http://www.programmer.com.cn/wp-content/uploads/2011/12/2_%E5%89%AF%E6%9C%AC_%E5%89%AF%E6%9C%AC.jpg" alt="图3 计算一个查询" width="300" height="163" style="margin: 5px 0px 0px; padding: 0px; border: 0px none; outline: 0px; " /></a><p style="margin: 0px; padding: 6px 3px 2px; border: 0px; outline: 0px; font-size: 10px; line-height: 16px; text-indent: 28px; ">图3 计算一个查询</p></div><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">在实时层，可以使用Riak或者Cassandra这种读写数据库，而且实时层依赖那些数据库中对状态更新的增量算法。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">让Hadoop模拟实时计算的工具是Storm。我写Storm的目的是让Hadoop可以健壮、可扩展地处理大量的实时数据。Storm在数据流上运行无限的计算，并且对这些数据处理提供了强有力的保障。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">让我们回到刚才那个根据某个URL查询某个页面在某个时间段内页面访问量的例子，通过这个例子我将展示实时层是如何工作的。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">批处理系统还是跟之前一样：一个基于Hadoop和ElephantDB的批处理工作流，在几个小时之前的数据上预计算查询函数。剩下就是让实时系统去处理最近几小时数据了。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; text-align: left; ">我们将最近几小时的数据状态存入Cassandra中，用Storm去处理页面访问量数据流并并行更新到数据库中，针对每一个页面访问量，在[URL, hour]所代表的key下，有一个计数器，这个计数器在Cassandra中实现。这就是所有的事情，Storm让事情变得非常简单。</p><div id="attachment_9268"  aligncenter"="" style="margin: 10px auto 1em; padding: 4px; border: 0px; outline: 0px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: #ffffff; text-align: center; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; width: 370px; "><a href="http://www.programmer.com.cn/wp-content/uploads/2011/12/3_%E5%89%AF%E6%9C%AC.jpg" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #0088cc; text-decoration: none; "><img wp-image-9268=""  "="" title="3_副本" src="http://www.programmer.com.cn/wp-content/uploads/2011/12/3_%E5%89%AF%E6%9C%AC.jpg" alt="图4 批处理/实时架构示例" width="360" height="128" style="margin: 5px 0px 0px; padding: 0px; border: 0px none; outline: 0px; " /></a><p style="margin: 0px; padding: 6px 3px 2px; border: 0px; outline: 0px; font-size: 10px; line-height: 16px; text-indent: 28px; ">图4 批处理/实时架构示例</p></div><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; "></strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; ">批处理层+实时层、CAP定理和人为错误容忍性</span></strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">貌似又回到一开始提出的问题上去了，访问实时数据需要使用NoSQL数据库和增量算法。这就说明回到了版本化数据、矢量时钟和读取修复这些复杂问题中来。但这是有本质区别的。由于实时层只处理最近几小时的数据，所有实时层的计算都会被最终批处理层重新计算。所以如果犯了什么错误或者实时层出了问题，最终都会被批处理层更正过来，所有复杂的问题都是暂时的。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">这并不意味着不需要关心实时层的读取修复和最终一致性，你仍然需要实时层尽可能的一致。但当犯了一个错误时，不会永久性地破坏数据。这便移除了许多你所需要面对的复杂问题。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">在批处理层仅需要考虑数据和数据上的查询函数，批处理层因此很好掌控。在实时层，需要使用增量算法和复杂的NoSQL数据库。把所有的复杂问题独立到实时层中，对系统的鲁棒性、可靠性做出了重大贡献。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">同样的，实时层并没有影响系统的人为错误容忍性，这个数据不可变和只追加的批处理系统，仍然是整个系统的核心，所以所有的都可以像上面说的一样被纠正过来。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我有一个类似的系统：Hadoop和ElephantDB组成批处理系统，Storm和Cassandra组成实时系统。由于缺乏监控，某天当我起床的时候发现Cassandra运行满负荷了，使得所有的数据请求都超时。这使得Storm计算失败，一些数据又重新回到了等待队列中，这个数据就一次次重复请求。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">如果我没有批处理层，那么我就需要扩展和恢复Cassandra，这个很不容易。更糟的是，因为请求不断的重复，无法得到正确的数据。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">幸运的是，所有的复杂问题都被隔离到实时层中去了，我清空了所有的后台请求队列，把它们打到了批处理层上，同时重启了Cassandra集群，过了几个小时之后所有数据都恢复正常了。没有错误数据，请求中也没有不准确的地方。<span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; "></strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">垃圾回收</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">上面描述的所有东西都是建立在一个不可变的、不断增长的数据集上的。如果数据集已经很大，使得不可能用水平扩展储存所有时间的所有数据，该如何处理呢？这是不是就推翻了我说的一切呢？是不是需要回到可变数据的系统上呢？</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">不。我们可以很容易地用&#8220;垃圾回收&#8221;对基本模型进行扩展来解决上面的问题。垃圾回收是一个在主数据集上的简单函数，返回的是一个过滤版本的主数据集。垃圾回收掉了旧数据，可以选择任意的垃圾回收策略。可以在易变的系统中只保留数据最新的一个值或者保留每个数据的历史。比如，如果要处理位置数据，可以保留每人每年的一个地点。可变性是一个不是很灵活的垃圾回收形式（它跟CAP定理交互得也很糟糕）。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">垃圾回收可以被实现成批处理的一个任务，隔段时间运行一下。由于它是作为离线批处理任务执行的，所以不影响我们与CAP定理的交互。<strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; "></strong></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><span style="margin: 0px; padding: 0px; border: 0px; outline: 0px; color: #3366ff; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">总结</strong></span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">让可扩展的数据系统复杂的原因不是CAP系统，而是数据增量算法和数据的可变状态。最近由于分布式数据库的兴起导致了复杂度越来越不可控。前面讲过，我将挑战对传统数据系统构建方法的假设。我把CRUD变成了CR，把持久化层分成了批处理和实时两个层，并且得到对人为错误容忍的能力。我花费了多年来之不易的经验打破我对传统数据库的假设，并得到了这些结论。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">批处理/实时架构有许多有趣的能力我并没有提到，下面我总结了一些。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">算法的灵活性。随着数据量的增长，一些算法会越来越难计算。比如计算标识符的数量，当标识符集合越来越大时，将会越来越难计算。批处理/实时分离系统给了你在批处理系统上使用精确算法和在实时系统上使用近似算法的灵活性。批处理系统计算结果会最终覆盖实时系统的计算结果，所以最终近似值会被修正，而你的系统拥有了&#8220;最终精确性&#8221;。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">数据结构迁移变得很容易。数据结构迁移的难题将一去不复返。由于批量计算是系统的核心，很容易在整个系统上运行一个函数，所以很容易更改你数据的结构或者视图。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">简单的Ad-Hoc网络。由于批处理系统的任意性，使得你可以在数据上进行任意查询。由于所有的数据在一个点上都可以获取，所以Ad-Hoc网络变得简单而且方便。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">自我检查。由于数据是不可变的，数据集就可以自我检查。数据集记录了它的数据历史，对于人为错误容忍性和数据分析很有用。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">我并没有说我已经&#8220;解决&#8221;了数据量过大的问题，但我已经为解决大数据问题制订了一个框架。批处理/实时架构可以应用到任何一个数据系统中去，&#8220;授人以鱼，不如授人以渔&#8221;，我已经告诉你了如何去构建这样的系统。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">为了提高系统整体能力来解决大数据的问题，我们还有许多工作需要做。</p><ul style="margin: 5px 0px 15px; padding: 0px 0px 0px 20px; border: 0px; outline: 0px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; "><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">扩展数据模型，支持批量写和随机读。不是每一个应用程序都支持key/value的数据库，这也是我们团队对扩展ElephantDB，使得可以支持搜索、文档数据库、区间查询感兴趣的原因。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">更好的批处理原语。Hadoop并不是批处理的最终形态，好多批处理计算Hadoop效率不高。Spark是一个有意思的扩展MapReduce的项目。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">提升后的读写NoSQL数据库。这里不同类型数据的数据库还有很大的提升空间，随着这些数据库的成熟，它们将收获很多。</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; ">高层级的抽象。未来工作中最有意思的就是对批处理模块和实时处理模块的高层次抽象，在批处理和实时架构下你没有理由不拥有一个简单的、描述性的、鲁棒性好的语言。</li></ul><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; outline: 0px; text-indent: 28px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; line-height: 22px; background-color: #ffffff; ">许多人需要一个可扩展的关系型数据库，本文就是想让你知道完全不需要那个。大数据量和NoSQL运动使数据管理比RDBMS更加复杂。那仅仅是因为我对大数据的处理采用了跟RDBMS同样的方法：把数据和视图混为一谈，并且依赖增量算法。大数据量需要采用完全不同的方式构建数据系统。通过存储持续增长的不可变数据，并且系统核心采用预计算，大数据系统就可以变得比关系型数据库更易掌控，并且可扩展性很强。</p><img src ="http://www.blogjava.net/kelly859/aggbug/378716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-21 17:07 <a href="http://www.blogjava.net/kelly859/archive/2012/05/21/378716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】Lucene3.6 各种Query效果测试</title><link>http://www.blogjava.net/kelly859/archive/2012/05/14/378076.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 14 May 2012 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/14/378076.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/378076.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/14/378076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/378076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/378076.html</trackback:ping><description><![CDATA[<div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.meiyu.lucene;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Document;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.CorruptIndexException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexReader;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.Term;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.IndexSearcher;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.Query;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.ScoreDoc;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.TermQuery;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.store.FSDirectory;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestQuery&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;TestLucene36<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试各种Query<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;Exception&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;CorruptIndexException&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;testQuery()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">获取IndexSearcher</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexReader&nbsp;reader&nbsp;=&nbsp;IndexReader.open(FSDirectory.open(<span style="color: #0000FF; ">new</span>&nbsp;File(indexPath)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IndexSearcher(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">1.TermQuery&nbsp;按词条搜索</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TermQuery(<span style="color: #0000FF; ">new</span>&nbsp;Term("desc","获得"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">2.MultiTermQuery</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">3.BooleanQuery&nbsp;布尔搜索</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BooleanQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;BooleanQuery();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query1&nbsp;=&nbsp;&nbsp;new&nbsp;TermQuery(new&nbsp;Term("desc","获得"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query2&nbsp;=&nbsp;&nbsp;new&nbsp;TermQuery(new&nbsp;Term("name","白"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.add(query1,&nbsp;BooleanClause.Occur.SHOULD);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.add(query2,&nbsp;BooleanClause.Occur.MUST);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">4.WildcardQuery&nbsp;通配符搜索</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WildcardQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;WildcardQuery(new&nbsp;Term("desc",&nbsp;"因为*"));</span><span style="color: #008000; ">//</span><span style="color: #008000; ">*?</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">5.PhraseQuery&nbsp;多关键字的搜索</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PhraseQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;PhraseQuery();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.add(new&nbsp;Term("desc","因为"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.add(new&nbsp;Term("desc","巨乳"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setSlop(5);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">通过setSlop()方法来设定一个称之为&#8220;坡度&#8221;的变量来确定关键字之间是否允许、允许多少个无关词汇的存在</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">6.PrefixQuery&nbsp;前缀搜索</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrefixQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;PrefixQuery(new&nbsp;Term("desc","因为"));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">7.MultiPhraseQuery&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiPhraseQuery&nbsp;query=new&nbsp;MultiPhraseQuery();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.add(new&nbsp;Term[]{new&nbsp;Term("desc","因为"),new&nbsp;Term("desc","巨乳")});</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">8.FuzzyQuery&nbsp;相近词语的搜索</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FuzzyQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;FuzzyQuery(new&nbsp;Term("desc","巨乳"));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">9.TermRangeQuery&nbsp;范围查询（主要指文本）</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TermRangeQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;TermRangeQuery("desc","250","300",true,true);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">10.NumericRangeQuery&nbsp;范围查询（索引字段必须是&nbsp;NumbericField）</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumericRangeQuery&lt;Integer&gt;&nbsp;query&nbsp;=&nbsp;NumericRangeQuery.newIntRange("birth",&nbsp;1980,&nbsp;1983,&nbsp;true,&nbsp;false);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">11.SpanQuery&nbsp;跨度查询</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpanTermQuery&nbsp;query1&nbsp;=&nbsp;new&nbsp;SpanTermQuery(new&nbsp;Term("desc",&nbsp;"因为"));</span><span style="color: #008000; ">//</span><span style="color: #008000; ">单独使用SpanTermQuery同TermQuery<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpanTermQuery&nbsp;query2&nbsp;=&nbsp;new&nbsp;SpanTermQuery(new&nbsp;Term("desc",&nbsp;"巨乳"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpanNearQuery&nbsp;query&nbsp;&nbsp;=&nbsp;new&nbsp;SpanNearQuery(new&nbsp;SpanQuery[]{query1,&nbsp;query2},&nbsp;5,&nbsp;true);</span><span style="color: #008000; ">//</span><span style="color: #008000; ">数值代表跨度范围&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScoreDoc[]&nbsp;hits&nbsp;=&nbsp;searcher.search(query,10).scoreDocs;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(ScoreDoc&nbsp;scoreDoc:hits)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc=&nbsp;searcher.doc(scoreDoc.doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(scoreDoc.score&nbsp;+&nbsp;"\tid:"+doc.get("id")+"\tname:"+doc.get("name")+"\tbirth:"+doc.get("birth")+"\tdesc:"+doc.get("desc"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index();</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><div></div><img src ="http://www.blogjava.net/kelly859/aggbug/378076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-14 09:59 <a href="http://www.blogjava.net/kelly859/archive/2012/05/14/378076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】Lucene3.6 索引与查询基础</title><link>http://www.blogjava.net/kelly859/archive/2012/05/14/378073.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 14 May 2012 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/14/378073.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/378073.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/14/378073.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/378073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/378073.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.meiyu.lucene;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.analysis.Analyzer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Document;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.Field;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.document.NumericField;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.FieldInfo.IndexOptions;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexReader;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexWriter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexWriterConfig;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.IndexWriterConfig.OpenMode;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.index.Term;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.queryParser.MultiFieldQueryParser;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.queryParser.QueryParser;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.IndexSearcher;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.Query;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.ScoreDoc;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.Sort;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.SortField;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.search.TopDocs;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.store.Directory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.store.FSDirectory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.lucene.util.Version;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.wltea.analyzer.lucene.IKAnalyzer;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestLucene36&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;indexPath&nbsp;=&nbsp;"d:/TMP/lucene";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Version&nbsp;VERSION_36&nbsp;=&nbsp;Version.LUCENE_36;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Analyzer&nbsp;analyzer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IKAnalyzer();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">搜索结果排序方式(该字段索引时必须isIndexed=true)</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Sort&nbsp;sort&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Sort(<span style="color: #0000FF; ">new</span>&nbsp;SortField("birth",SortField.INT,<span style="color: #0000FF; ">false</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;index()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;start&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Indexing&nbsp;to&nbsp;directory&nbsp;'"&nbsp;+&nbsp;indexPath&nbsp;+&nbsp;"'<img src="http://www.blogjava.net/Images/dot.gif" alt="" />");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory&nbsp;dir&nbsp;=&nbsp;FSDirectory.open(<span style="color: #0000FF; ">new</span>&nbsp;File(indexPath));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriterConfig&nbsp;iwc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IndexWriterConfig(VERSION_36,&nbsp;analyzer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwc.setOpenMode(OpenMode.CREATE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwc.setRAMBufferSizeMB(1024.0);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IndexWriter(dir,&nbsp;iwc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexDocs(writer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;end&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(end.getTime()&nbsp;-&nbsp;start.getTime()&nbsp;+&nbsp;"&nbsp;total&nbsp;milliseconds");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;indexDocs(IndexWriter&nbsp;writer)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(String&nbsp;info:data)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;ss&nbsp;=&nbsp;info.split("\\|");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Document();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field_id&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Field("id",&nbsp;ss[0],&nbsp;Field.Store.YES,&nbsp;Field.Index.NOT_ANALYZED_NO_NORMS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field_id.setIndexOptions(IndexOptions.DOCS_ONLY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(field_id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field_name&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Field("name",&nbsp;ss[1],&nbsp;Field.Store.YES,&nbsp;Field.Index.ANALYZED);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(field_name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumericField&nbsp;field_birth&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;NumericField("birth",Field.Store.YES,&nbsp;<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field_birth.setIntValue(Integer.valueOf(ss[2]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(field_birth);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field_desc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Field("desc",&nbsp;ss[3],&nbsp;Field.Store.YES,&nbsp;Field.Index.ANALYZED);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(field_desc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(writer.getConfig().getOpenMode()&nbsp;==&nbsp;OpenMode.CREATE)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.updateDocument(<span style="color: #0000FF; ">new</span>&nbsp;Term("id",&nbsp;ss[0]),&nbsp;doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;search(String[]&nbsp;fields,String&nbsp;keyword)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">获取IndexSearcher</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexReader&nbsp;reader&nbsp;=&nbsp;IndexReader.open(FSDirectory.open(<span style="color: #0000FF; ">new</span>&nbsp;File(indexPath)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IndexSearcher(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">搜索条件</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryParser&nbsp;parser&nbsp;=&nbsp;new&nbsp;QueryParser(VERSION_36,&nbsp;fields[0],&nbsp;analyzer);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryParser&nbsp;parser&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MultiFieldQueryParser(VERSION_36,&nbsp;fields,&nbsp;analyzer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;parser.parse(keyword);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Searching&nbsp;for:&nbsp;"&nbsp;+&nbsp;query.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TopDocs&nbsp;results&nbsp;=&nbsp;searcher.search(query,&nbsp;5);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TopDocs&nbsp;results&nbsp;=&nbsp;searcher.search(query,&nbsp;5,&nbsp;sort);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScoreDoc[]&nbsp;hits&nbsp;=&nbsp;results.scoreDocs;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("results.totalHits:"+&nbsp;results.totalHits);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("hits.length:"+&nbsp;hits.length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">高亮显示设置<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Formatter&nbsp;formatter&nbsp;=&nbsp;new&nbsp;SimpleHTMLFormatter("&lt;b&gt;","&lt;/b&gt;");&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Highlighter&nbsp;highlighter&nbsp;=&nbsp;new&nbsp;Highlighter(formatter,new&nbsp;QueryScorer(query));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;highlighter.setTextFragmenter(new&nbsp;SimpleFragmenter(200));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(ScoreDoc&nbsp;scoreDoc:hits)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">评分详情<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Explanation&nbsp;explanation&nbsp;=&nbsp;searcher.explain(query,&nbsp;scoreDoc.doc);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc=&nbsp;searcher.doc(scoreDoc.doc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(scoreDoc.score&nbsp;+&nbsp;"\tid:"+doc.get("id")+"\tname:"+doc.get("name")+"\tbirth:"+doc.get("birth")+"\tdesc:"+doc.get("desc"));<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(scoreDoc.score&nbsp;+&nbsp;"&nbsp;&nbsp;"&nbsp;+&nbsp;doc.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TokenStream&nbsp;tokenStream&nbsp;=&nbsp;analyzer.tokenStream("token",&nbsp;new&nbsp;StringReader(doc.get(field)));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(highlighter.getBestFragment(tokenStream,doc.get(field)));</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String[]&nbsp;data&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[]{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"0|苍井空空|1983|因为其童顏巨乳的特色，获得极大的回响与超高人气",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1|羽田夕夏|1985|因为乳晕太大，让自己自惭形秽，所以有些时候才会不想发",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"2|夏目奈奈|1982|入行前是珠宝售貨員的奈奈，坦言拍AV是她的天职",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"3|麻美由麻|1987|巨乳女优在厚薄码同时出道引发不少疑虑",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"4|小向杏奈|1983|如果那一天被不知名的男人强暴一定很刺激",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"5|大浦安娜|1980|日本第一乳神为法日混血儿,她的出现为业界带来极大的冲击",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"6|美月玲奈|1982|样貌绝对一流，另外还是高丽与扶桑的混血美女",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"7|游佐七海|1982|喜欢游佐七海的人估计都偏好日本学生系列",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"8|森原由紀|1978|护士制服很赞200",<span style="color: #008000; ">//</span><span style="color: #008000; ">森原由紀的片子涉及后门，这是我所不喜欢的地方</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"9|白石日和|1983|护士制服很赞300"<span style="color: #008000; ">//</span><span style="color: #008000; ">她身材不错，肉肉的感觉，很有质感，演技也不错，护士制服很赞的</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index();</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(<span style="color: #0000FF; ">new</span>&nbsp;String[]{"name","desc"},"苍井夕夏入行前偏好制服后门");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/kelly859/aggbug/378073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-14 09:56 <a href="http://www.blogjava.net/kelly859/archive/2012/05/14/378073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】Lucene倒排索引原理</title><link>http://www.blogjava.net/kelly859/archive/2012/05/11/377896.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Fri, 11 May 2012 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/11/377896.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/377896.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/11/377896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/377896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/377896.html</trackback:ping><description><![CDATA[<p style="font-family: Arial; line-height: 25px; background-color: #ffffff; ">转自：<a href="http://callan.iteye.com/blog/120325">http://callan.iteye.com/blog/120325</a><a href="http://dev.csdn.net/author/kingjIang/28cf4f5f62ca4bb696c43d5c438e79f7.html" style="color: #1d58d1; text-decoration: none; "></a></p><p style="font-family: Arial; line-height: 25px; background-color: #ffffff; ">Lucene是一个高性能的java全文检索工具包，它使用的是倒排文件索引结构。该结构及相应的生成算法如下：<br />　　<br />　　0）设有两篇文章1和2<br />　　文章1的内容为：Tom lives in Guangzhou,I live in Guangzhou too.<br />　　文章2的内容为：He once lived in Shanghai.<br />　　<br />　　1)由于lucene是基于关键词索引和查询的，首先我们要取得这两篇文章的关键词，通常我们需要如下处理措施<br />　　a.我们现在有的是文章内容，即一个字符串，我们先要找出字符串中的所有单词，即分词。英文单词由于用空格分隔，比较好处理。中文单词间是连在一起的需要特殊的分词处理。<br />　　b.文章中的&#8221;in&#8221;, &#8220;once&#8221; &#8220;too&#8221;等词没有什么实际意义，中文中的&#8220;的&#8221;&#8220;是&#8221;等字通常也无具体含义，这些不代表概念的词可以过滤掉<br />　　c.用户通常希望查&#8220;He&#8221;时能把含&#8220;he&#8221;，&#8220;HE&#8221;的文章也找出来，所以所有单词需要统一大小写。<br />　　d.用户通常希望查&#8220;live&#8221;时能把含&#8220;lives&#8221;，&#8220;lived&#8221;的文章也找出来，所以需要把&#8220;lives&#8221;，&#8220;lived&#8221;还原成&#8220;live&#8221;<br />　　e.文章中的标点符号通常不表示某种概念，也可以过滤掉<br />　　在lucene中以上措施由Analyzer类完成<br />　　<br />　　经过上面处理后<br />　　 文章1的所有关键词为：[tom] [live] [guangzhou] [i] [live] [guangzhou]<br />　　 文章2的所有关键词为：[he] [live] [shanghai]<br />　　<br />　　2) 有了关键词后，我们就可以建立倒排索引了。上面的对应关系是：&#8220;文章号&#8221;对&#8220;文章中所有关键词&#8221;。倒排索引把这个关系倒过来，变成：&#8220;关键词&#8221;对&#8220;拥有该关键词的所有文章号&#8221;。文章1，2经过倒排后变成<br />　　关键词 文章号<br />　　guangzhou 1<br />　　he 2<br />　　i 1<br />　　live 1,2<br />　　shanghai 2<br />　　tom 1<br />　　<br />　　通常仅知道关键词在哪些文章中出现还不够，我们还需要知道关键词在文章中出现次数和出现的位置，通常有两种位置：a)字符位置，即记录该词是文章中第几个字符（优点是关键词亮显时定位快）；b)关键词位置，即记录该词是文章中第几个关键词（优点是节约索引空间、词组（phase）查询快），lucene 中记录的就是这种位置。<br />　　<br />　　加上&#8220;出现频率&#8221;和&#8220;出现位置&#8221;信息后，我们的索引结构变为：<br />　　关键词 文章号[出现频率] 出现位置<br />　　guangzhou 1[2] 3，6<br />　　he 2[1] 1<br />　　i 1[1] 4<br />　　live 1[2],2[1] 2，5，2<br />　　shanghai 2[1] 3<br />　　tom 1[1] 1<br />　　<br />　　以live 这行为例我们说明一下该结构：live在文章1中出现了2次，文章2中出现了一次，它的出现位置为&#8220;2,5,2&#8221;这表示什么呢？我们需要结合文章号和出现频率来分析，文章1中出现了2次，那么&#8220;2,5&#8221;就表示live在文章1中出现的两个位置，文章2中出现了一次，剩下的&#8220;2&#8221;就表示live是文章2中第 2个关键字。<br />　　<br />　　以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的（lucene没有使用B树结构），因此lucene可以用二元搜索算法快速定位关键词。<br />　　<br />　　实现时 lucene将上面三列分别作为词典文件（Term Dictionary）、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词，还保留了指向频率文件和位置文件的指针，通过指针可以找到该关键字的频率信息和位置信息。<br />　　<br />　　 Lucene中使用了field的概念，用于表达信息所在位置（如标题中，文章中，url中），在建索引中，该field信息也记录在词典文件中，每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。<br />　　<br />　　为了减小索引文件的大小，Lucene对索引还使用了压缩技术。首先，对词典文件中的关键词进行了压缩，关键词压缩为&lt;前缀长度，后缀&gt;，例如：当前词为&#8220;阿拉伯语&#8221;，上一个词为&#8220;阿拉伯&#8221;，那么&#8220;阿拉伯语&#8221;压缩为&lt;3，语&gt;。其次大量用到的是对数字的压缩，数字只保存与上一个值的差值（这样可以减小数字的长度，进而减少保存该数字需要的字节数）。例如当前文章号是16389（不压缩要用3个字节保存），上一文章号是16382，压缩后保存7（只用一个字节）。<br />　　<br />　　 下面我们可以通过对该索引的查询来解释一下为什么要建立索引。<br />　　假设要查询单词 &#8220;live&#8221;，lucene先对词典二元查找、找到该词，通过指向频率文件的指针读出所有文章号，然后返回结果。词典通常非常小，因而，整个过程的时间是毫秒级的。<br />　　而用普通的顺序匹配算法，不建索引，而是对所有文章的内容进行字符串匹配，这个过程将会相当缓慢，当文章数目很大时，时间往往是无法忍受的。</p><img src ="http://www.blogjava.net/kelly859/aggbug/377896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-11 14:12 <a href="http://www.blogjava.net/kelly859/archive/2012/05/11/377896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】我是一个极其讨厌和反感AV的人</title><link>http://www.blogjava.net/kelly859/archive/2012/05/10/377843.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Thu, 10 May 2012 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/10/377843.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/377843.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/10/377843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/377843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/377843.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: 宋体, Arial, Helvetica, sans-serif; line-height: 24px; text-align: -webkit-left; background-color: #ffffff; ">我是一个极其讨厌AV和反感看AV的人，黄色产物，如同洪水猛兽，毒害着年轻一代，这是多么不堪的现状而至于那些什么苍井空,川滨奈美,堤莎也加,町田梨乃,二阶堂仁美,饭岛爱,饭田夏帆,饭冢友子,芳本叶月,冈崎结由,冈田丽奈,高木萌美,高田礼子,高原流美,宫本真美,宫岛司,古都光,光月夜也,河村亚季子,河井梨绪,黑崎扇菜,红月流奈,华歌恋,吉川萌,及川奈央,吉川真奈美,吉崎纱南,吉野莎莉,今井明日香,今木翔子,金泽蓝子,进藤玲菜,井上可奈,久保美希,酒井未希,臼井利奈,菊池丽香,菊池英里,菊池智子,橘真央,具志坚阳子,可爱亚织沙,葵小夏,蓝山南,兰望美,里见奈奈子,里美奈奈子,里美由梨香,立花丽华,立木爱,凉白舞,铃川玲理,铃江纹奈,铃木麻奈美,芦屋瞳,麻川美绪,麻生叶子,美里霞,美崎凉香,美雪沙织,美月莲,明日香,木谷麻耶,奈奈见沙织,内藤花苗,内田理沙,鲇川亚美,片濑亚纪,平山朝香,前原优树,前原佑子,浅见伽椰,浅井理,青木琳,青木玲,青野诗织,青羽未来,青沼知朝,秋本玲子,秋菜里子,秋元优奈,如月可怜,若林树里,若月树里,森下理音,纱月结花,杉浦清香,杉山亚来,山下由美子,杉原凉子,上原留华,神城千佳,神崎麻衣,神崎麻子,矢吹丽,手束桃,树本凉子,水城凛,水野朋美,水野茜,水越丽子,四季彩香寺田弥生,松浦梦,松浦唯,松田千夏,松下爱来,松下可怜,松元静香,速水真保,藤彩香,藤代流花,藤崎秋,藤森智子,天衣美津,田村麻衣,望月瞳,舞岛美织,午后野弥生,西泽友里,夏美舞,相川未希,相户爱,相田由美,小仓杏,小川流果,筱宫知世,小栗杏菜,小森美王,小室优奈,小野由佳,筱原凉,小泽菜穗,小泽玛丽亚,筱冢真树子,星爱丽斯,星崎瞳,星野绫香,星野洋子,星野真弥,徐若樱,雪乃小春,岩下美季,遥优衣,野宫美忧,野原奈津美,叶月千穗,伊东美华,一色丽矢,一色鲇美,一条沙希,乙伊沙也加,樱井沙也加,由树莉莉,有川真生,有吉奈生子,有森玲香,雨宫优衣,原千寻,原史奈,原田春奈,远野麻耶,月野静玖,早纪麻未,早乙女舞,泽舞音,长濑爱,长月亚美,真木亚里沙,真山润,中川珠代,中村理央,中根由真,中山美玖,中原绫,仲井美帆,竹田树理,佐伯美奈,佐佐木,幸田梨纱,北原爱子,成膳任,戴文青木,德永千奈美,笛木优子,福原爱,高见美香,高树玛丽亚,宫崎葵,观月雏乃,海江田纯子,后藤理莎,后藤香南子,矶山沙耶香,矶山沙也加,吉冈美穗,吉泽瞳,加纳则子,加藤小雪,菅谷梨沙子,结城翼,井上和香,井上熏,酒井瑛里,久纱野水萌,铃木爱理,玲木美生,泷泽乃南,美依旗由美,木下亚由美,前田知惠,前原爱,浅田真央,清水佐纪,入江纱绫,三尺真奈美,三宅尚子,森下千里,上原绫,石村舞波,矢田亚希子,市川由衣,市井纱耶香,嗣永桃子,松岛菜菜子,松居彩,松元莉绪,樋口真未,细川直美,夏烧雅,相乐纪子,小川熏,小林惠美,小野奈美,小泽真珠,星野亚希,须藤茉麻,亚纪奈,岩田小百合,伊藤步,优香,友崎玲,中泽裕子,佐藤麻纱,安藤沙耶,奥山唯子,白崎令于,柏木奈纯,板谷佑,滨田翔子,朝雾唯,川崎爱,大和抚子,大西由梨香,岛田百合花,二宫优,绀野舞子,岗原厚子,高鸠阳子,古河由摩,谷田未央,河合绫纯美,和久井辛,和希沙,黑田美礼,横仓里奈,后藤亚维梨,户田惠梨香,吉濑美智子,加藤麻依,江纱绫,井上诗织,井上优香,井真理绘,堀井美月,莲沼民子,柳明日,落合玲奈,牧濑奈美,木下亚由,奈良沙绪理,浅丘南,秋本那夜,秋山玲子,秋庭比吕子,三尺真奈,三井保奈美,森下真理,山吹美花,山口纱弥加,杉里香,神代弓子,树梨沙,水谷利加,松鸠永里奈,松山麻美,松屿初音,塔山直美,藤香南子,天使美树,天野理惠,田崎由希,桐岛淳子,尾崎美果,西野美绪,相泽优香,小林里实,小早川洋子,叶山小姬,樱树露衣,樱田佳子,永井绘理香,远藤真纪,早川美波,早川桃香,折原琴,中鸠广香,中泽夏木,竹野内丰,佐藤江梨花,爱内萌,爱田露美,爱田毛毛,安倍夏实,安原真美,奥山香,八木泽,白川美奈美,白鸟智惠子,白亚朱里,北山静香,北原步,北原真裕,仓本安奈,仓田杏里,朝比奈真理,朝仓加穗里,朝仓玛丽亚,持田茜,冲田由加里,川奈由依,大友梨奈,岛田香奈,堤沙也加,渡边香,风间舞,风见京子,福山洋子,冈本夏生,高仓梨奈,高野瞳,宫本瞳,宫本阳子,宫地奈,宫间沙布子,工藤瞳,宫下杏菜,河田纯子,和希结衣,横山千枝,华美月,姬野莉梦,吉田友里,吉野碧,菅野美寿纪,江口美贵,结衣美沙,金城美丽,井上彩菜,井上雅,鸠村熏,酒井美幸,菊池则江,君岛美香,可爱亚芝莎,来栖敦子,蓝原夕妃,蛯原舞,立花优,立原贵美,恋野恋,铃木由美,麻生岬,麻生真美子,麻田子,茂森亚弓,美波志保,木内亚吉拉,内田京香,品田由依,平山绫,前岛美步,前田亚纪,浅见怜,浅野子,青木美里,清木裕子,青山遥,青山叶子,三濑真美子,三崎真绪,三上夕希,三尾安齐,森宏子,森山子,森野雫,山口理惠,山口美纪,山口萌,杉山圭,杉田惠美,山田誉子,杉原爱砂,上原亚也加,神崎美树,神田美沙纪,圣瑛麻,石川恩惠,石川瞳,石川优季奈,矢吹凉子,矢吹麻理奈,矢择优子,水城梓,水希遥,松岛奈奈子,松纱良,速水怜,藤井彩,藤崎弭代,田山真美子,田中梨子,田中美久,瞳理欧,望月七,望月沙香,望月英子,武田真治,夏结玲,相纪美,相乐晴子,相仁泽美,相原里奈,翔巴辉,小池亚弭,小峰由衣,筱宫庆子,小田凉子,小向杏奈,小野濑,幸田李梨,岩崎千鹤,野宫凛子,野野由利加,叶山路易,一宫理绘,伊藤美沙纪,一条小百合,樱庭凉子,永井流奈,优木里绪奈,优木美纱,羽田夕夏,原惠美子,远山雪乃,远藤梨奈,早濑理沙,早乙女香织,长谷川,真纯麻子,织原奈美,柊丽子,中条佳奈子,中野美奈,仲村桃,足立美。。。。等等像以上这些女AV明星，我更是一个都不认识，听都没听说过</span>&nbsp;<img src ="http://www.blogjava.net/kelly859/aggbug/377843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-10 22:00 <a href="http://www.blogjava.net/kelly859/archive/2012/05/10/377843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【LUCENE】Lucene搜索方法总结</title><link>http://www.blogjava.net/kelly859/archive/2012/05/09/377710.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 09 May 2012 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/09/377710.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/377710.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/09/377710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/377710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/377710.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Lucene搜索方法总结&nbsp;原文地址http://www.iteye.com/topic/5693581.多字段搜索使用&nbsp;multifieldqueryparser&nbsp;可以指定多个搜索字段。query query = multifieldqueryparser.parse(&#8221;name*&#8221;, new string[] { fieldname,...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly859/archive/2012/05/09/377710.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly859/aggbug/377710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-09 16:09 <a href="http://www.blogjava.net/kelly859/archive/2012/05/09/377710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种架构图汇总!</title><link>http://www.blogjava.net/kelly859/archive/2012/05/07/377511.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Mon, 07 May 2012 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/05/07/377511.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/377511.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/05/07/377511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/377511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/377511.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">原文地址：<a href="http://blog.csdn.net/liuxiaotao008/archive/2008/06/29/2595391.aspx" style="color: #336699; text-decoration: none; ">http://blog.csdn.net/liuxiaotao008/archive/2008/06/29/2595391.aspx</a>&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">1.Spring架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/spring-overview.png" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/spring1.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/spring2.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">2.Hibernate架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/hibernate1.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/hibernate2.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/hibernate3.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">3.Struts2架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/struts2_1.jpg" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">4.Struts1架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/struts2.jpg" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">5.JSF请求处理生命周期图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/jsf1.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">6.Seam架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/Seam.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">7.Grails架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">8.DWR架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/dwr2.png" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/dwr3.png" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">9.J2EE架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/JEE5.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">10.SSH整合架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">11.Oracle架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/oracle.jpg" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">12.SmartClient Ajax框架架构图</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/SmartClient_AJAX.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">13.JavaSE总览</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/jse.gif" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;14.新的JEE包结构规范</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/j2ee_new.jpg" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">15.老的J2EE包结构规范</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/liuxiaotao008/j2ee.jpg" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; " /></p><img src ="http://www.blogjava.net/kelly859/aggbug/377511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-05-07 11:26 <a href="http://www.blogjava.net/kelly859/archive/2012/05/07/377511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 6 JVM参数选项大全（中文版）</title><link>http://www.blogjava.net/kelly859/archive/2012/04/25/376598.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Wed, 25 Apr 2012 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/04/25/376598.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/376598.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/04/25/376598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/376598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/376598.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 6 JVM参数选项大全（中文版）  &nbsp;原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm！  &nbsp;  本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Options&nbsp;编写的译文。主要介绍JVM中的非稳态选项及其使用说明。  为了让读者明白每个选项的含义...&nbsp;&nbsp;<a href='http://www.blogjava.net/kelly859/archive/2012/04/25/376598.html'>阅读全文</a><img src ="http://www.blogjava.net/kelly859/aggbug/376598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-04-25 16:03 <a href="http://www.blogjava.net/kelly859/archive/2012/04/25/376598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK7新增的工具方法列表</title><link>http://www.blogjava.net/kelly859/archive/2012/04/24/376454.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Tue, 24 Apr 2012 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/04/24/376454.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/376454.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/04/24/376454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/376454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/376454.html</trackback:ping><description><![CDATA[<div><div style="layout-grid:15.6000pt; "><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">在开源java工具包里，最有名的当属apache&nbsp;commons。其中，以commons&nbsp;lang包最为开发者熟知。</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">但是它作为第三方包存在，或多或少给开发者带来一些不便利。</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">面包牛奶总是会有的，从java7开始，lang包中的一些优秀工具方法，将被正式引入JDK。</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">下面是各个已确定被引入的工具类或方法说明。</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">1,&nbsp;新增类&nbsp;java.util.Objects&nbsp;(JDK对工具类的命名一向是以s结尾，例如Collections,&nbsp;Arrays)</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">A,&nbsp;空指针安全的&nbsp;equals,&nbsp;hashCode,&nbsp;toString,&nbsp;defaultNull&nbsp;方法。</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">即入参传入NULL，工具方法不会抛空指针异常。</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">&nbsp;调用方法举例：</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">&nbsp;Boolean&nbsp;result&nbsp;=&nbsp;Objects.equals(obj1,&nbsp;obj2);</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">B,&nbsp;比较对象的大小（需要实现Comparable）。</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">&nbsp;T&nbsp;Objects.max(T&nbsp;comparable1,&nbsp;T&nbsp;comparable2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">&nbsp;T&nbsp;Objects.min(T&nbsp;comparable1,&nbsp;T&nbsp;comparable2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">2,&nbsp;系统工具类新增一些取环境信息的工具方法。&nbsp;(java.lang.System)</span><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">以往，你需要通过&nbsp;System.getProperties(&#8220;user.dir&#8221;)&nbsp;这样来取。现在只需要调用一下工具方法就可以了。</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">File&nbsp;System.getJavaIoTempDir()&nbsp;//&nbsp;IO临时文件夹</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">File&nbsp;System.getJavaHomeDir()&nbsp;//&nbsp;JRE的安装目录</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">File&nbsp;System.getUserHomeDir()&nbsp;//&nbsp;当前用户目录</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">File&nbsp;System.getUserDir()&nbsp;//&nbsp;启动java进程时所在的目录</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">3,&nbsp;包装类型安全转换到原始类型的工具方法。</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Boolean.booleanValue(Boolean&nbsp;obj,&nbsp;boolean&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">char&nbsp;Character.charValue(Character&nbsp;obj,&nbsp;char&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">byte&nbsp;Byte.byteValue(Byte&nbsp;obj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">byte&nbsp;Byte.byteValue(Byte&nbsp;obj,&nbsp;byte&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">short&nbsp;Short.shortValue(Short&nbsp;obj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">short&nbsp;Short.shortValue(Short&nbsp;obj,&nbsp;short&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Integer.intValue(Integer&nbsp;obj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Integer.intValue(Integer&nbsp;obj,&nbsp;int&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Long.longValue(Long&nbsp;obj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Long.longValue(Long&nbsp;obj,&nbsp;long&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">float&nbsp;Float.floatValue(Float&nbsp;obj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">float&nbsp;Float.floatValue(Float&nbsp;obj,&nbsp;float&nbsp;defaultValue)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">double&nbsp;Double.doubleValue(Double&nbsp;obj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">double&nbsp;Double.doubleValue(Double&nbsp;obj,&nbsp;double&nbsp;defaultValue)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">4,&nbsp;针对包装类型的Boolean，提供了更具可读性和空指针安全的工具方法。</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.isTrue(Boolean&nbsp;booleanObj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.isFalse(Boolean&nbsp;booleanObj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.isNotTrue(Boolean&nbsp;booleanObj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.isNotFalse(Boolean&nbsp;booleanObj)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">5,&nbsp;Boolean类型反转，空指针安全</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Boolean&nbsp;Booleans.negate(Boolean&nbsp;booleanObj)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">True&nbsp;=&gt;&nbsp;False&nbsp;,&nbsp;False&nbsp;=&gt;&nbsp;True,&nbsp;Null&nbsp;=&gt;&nbsp;Null</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">6,&nbsp;Boolean参与位运算</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.and(boolean[]&nbsp;array)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.or(boolean[]&nbsp;array)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.xor(boolean[]&nbsp;array)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.and(Boolean[]&nbsp;array)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.or(Boolean[]&nbsp;array)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Booleans.xor(Boolean[]&nbsp;array)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">7,&nbsp;两个char间的equals</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Character.equalsIgnoreCase(char&nbsp;ch1,&nbsp;char&nbsp;ch2)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">8,&nbsp;声明一批空数组常量，各种类型</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Boolean[]&nbsp;Boolean.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean[]&nbsp;Boolean.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Character[]&nbsp;Character.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">char[]&nbsp;Character.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Byte[]&nbsp;Byte.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">byte[]&nbsp;Byte.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Short[]&nbsp;Short.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">short[]&nbsp;Short.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Integer[]&nbsp;Integer.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int[]&nbsp;Integer.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Long[]&nbsp;Long.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long[]&nbsp;Long.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Float[]&nbsp;Float.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">float[]&nbsp;Float.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Double[]&nbsp;Double.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">double[]&nbsp;Double.EMPTY_PRIMITIVE_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">String[]&nbsp;String.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Class[]&nbsp;Class.EMPTY_ARRAY</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Object[]&nbsp;Objects.EMPTY_OBJECT_ARRAY</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">甚至通过Class类型来取空数组。</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Boolean.class.emptyArray();</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">9,&nbsp;数组长度判定工具类，空指针安全</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Arrays.isEmpty(Object[]&nbsp;array)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Arrays.size(Object[]&nbsp;array)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">10,&nbsp;集合长度判定工具类，空指针安全</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Collections.isEmpty(Collection&nbsp;coll)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Collections.size(Collection&nbsp;coll)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">boolean&nbsp;Collections.isEmpty(Map&nbsp;map)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Collections.size(Map&nbsp;map)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">11,&nbsp;空指针安全的ClassName获取</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">String&nbsp;Class.getName(Class&nbsp;cls)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">String&nbsp;Class.getSimpleName(Class&nbsp;cls)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">String&nbsp;Class.getPackageName(Class&nbsp;cls)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">12,&nbsp;可以直接解析locale信息字符串的工具方法</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">Locale&nbsp;parse(String&nbsp;localeStr)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">13,&nbsp;提供根据语言取国家列表或根据国家取语言列表的工具方法</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">List&nbsp;Locale.countriesByLanguage(String&nbsp;langaugeStr)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">List&nbsp;Locale.languagesByCountry(String&nbsp;countryStr)</span></p><p style="margin-bottom:10.5000pt; margin-top:10.5000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-weight:bold; font-size:12.0000pt; font-family:'Times New Roman'; ">14,&nbsp;安全的加减乘除</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Math.safeToInt(long&nbsp;value)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Math.safeNegate(int&nbsp;value)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeNegate(long&nbsp;value)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Math.safeAdd(int&nbsp;value1,&nbsp;int&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeAdd(long&nbsp;value1,&nbsp;int&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeAdd(long&nbsp;value1,&nbsp;long&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Math.safeSubtract(int&nbsp;value1,&nbsp;int&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeSubtract(long&nbsp;value1,&nbsp;int&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeSubtract(long&nbsp;value1,&nbsp;long&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">int&nbsp;Math.safeMultiply(int&nbsp;value1,&nbsp;int&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeMultiply(long&nbsp;value1,&nbsp;int&nbsp;value2)</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">long&nbsp;Math.safeMultiply(long&nbsp;value1,&nbsp;long&nbsp;value2)</span></p><p style="margin-bottom:5.0000pt; margin-top:5.0000pt; text-autospace:ideograph-other; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">原文链接：</span><a href="http://kenwublog.com/jdk7-new-utility-methods"><span style="mso-spacerun:'yes'; color:#0000ff; text-decoration:underline ;font-size:10.5000pt; font-family:'Times New Roman'; ">http://kenwublog.com/jdk7-new-utility-methods</span></a></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "><br /></span></p></div></div><img src ="http://www.blogjava.net/kelly859/aggbug/376454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-04-24 11:37 <a href="http://www.blogjava.net/kelly859/archive/2012/04/24/376454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.5常用新特性</title><link>http://www.blogjava.net/kelly859/archive/2012/04/24/376449.html</link><dc:creator>maxchen</dc:creator><author>maxchen</author><pubDate>Tue, 24 Apr 2012 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/kelly859/archive/2012/04/24/376449.html</guid><wfw:comment>http://www.blogjava.net/kelly859/comments/376449.html</wfw:comment><comments>http://www.blogjava.net/kelly859/archive/2012/04/24/376449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kelly859/comments/commentRss/376449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kelly859/services/trackbacks/376449.html</trackback:ping><description><![CDATA[<div><p>1, 范型<br /> 使用范型, 可以做到方法参数,返回值,集合等都是类型安全的.<br /> 特别是,一个类使用了接口作为专递参数,可使用范型,将其参数进行泛化.<br /> 优点是: 简化变量名,支持多种实现.</p> <p>2, 可变参数<br /> 方法中,同类型的多个参数,可以使用如下语法精简.<br /> public void print(String a,String b,String c)<br /> 变成<br /> public void print(String&#8230; strs)</p> <p>3, for each的迭代,简化iterator接口<br /> 针对iterator接口的作用,简化了迭代的代码量.</p> <p>List strs = new ArrayList();</p> <p>for (String str : strs) {<br />     //iterator here<br /> }</p> <p>4, 静态引入<br /> 将老的&#8221;类.方法&#8221;静态引用方式,替换成import进来.<br /> import static com.java.Test;<br /> 此处Test是静态方法</p> <p>5, 自动装箱/拆箱<br /> 针对Integer,Long,Double等包装类型,以后可以直接使用int,long,double<br /> jdk编译时,会进行转换.</p> 			<p>&nbsp;</p><div>原文链接：<a href="http://kenwublog.com/new-worthly-in-jdk15" rel="bookmark">http://kenwublog.com/new-worthly-in-jdk15</a></div><br /><a href="http://kenwublog.com/new-worthly-in-jdk15" rel="bookmark"></a><p>&nbsp;</p></div><img src ="http://www.blogjava.net/kelly859/aggbug/376449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kelly859/" target="_blank">maxchen</a> 2012-04-24 11:16 <a href="http://www.blogjava.net/kelly859/archive/2012/04/24/376449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>