??xml version="1.0" encoding="utf-8" standalone="yes"?>国产+人+亚洲,久久免费看视频,欧美激情一区二区三区全黄http://www.aygfsteel.com/freeman1984/category/46575.htmlSTANDING ON THE SHOULDERS OF GIANTS zh-cnMon, 14 Dec 2015 10:38:24 GMTMon, 14 Dec 2015 10:38:24 GMT60JAVA Thread Dump 分析lDhttp://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html疯狂疯狂Mon, 14 Dec 2015 10:04:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.htmlhttp://www.aygfsteel.com/freeman1984/comments/428645.htmlhttp://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/428645.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/428645.html阅读全文

疯狂 2015-12-14 18:04 发表评论
]]>
(?Oracle数据库如何授权收费(Database LicensingQ?http://www.aygfsteel.com/freeman1984/archive/2014/10/27/419097.html疯狂疯狂Mon, 27 Oct 2014 08:43:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2014/10/27/419097.htmlhttp://www.aygfsteel.com/freeman1984/comments/419097.htmlhttp://www.aygfsteel.com/freeman1984/archive/2014/10/27/419097.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/419097.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/419097.html
说白了,Oracle License是一张纸Q一张许可证。这跟许多Y件品是一LQ有没有许可证的产品在功能上是没有区别的Q仅仅是一个法律问题。也是_随便到网上下的Oracle都可以免Ҏ怋用,只不q这个用是有区别的Q如果是试或研发,那没关系Q随便用Q如果是用于商业用途,那就是违法的了,Oracle公司有权赯Q?/span>

 

与免费的下蝲版本不同Q正式版的Oracle在购买后Q用户会得到一个品服务码Q凭此Oracle服务码,可以得到Oracle的在U升U等服务QOracle的服务分为好多Q不同别提供相对应的在U或是现场服务?/span>

 

现在Oracle有两U授权方式,按CPU(Process)数和按用h(NamedUser Plus)?/strong>前一U方式一般用于用h不确定或者用h量很大的情况Q典型的如互联网环境Q而后一U则通常被用于用h定或者较的情况?/span>

 

按CPUQ?/strong>License?CPU?pL。系数来自Oracle的一个参数表Q如IBM Power6的处理器?QAMD和Intel的处理器?.5Q详l情况见下:

参数

处理器型?/span>

0.25

Sun UltraSPARC T1 处理?/span>

0.50

Sun UltraSPARC T1处理?/span>

0.50

Intel、AMD处理?/span>

0.50

Sun UltraSPARC T2+ 处理?/span>

1.00

IBM POWER6、POWER7 处理?/span>

0.75

其他多核处理?/span>

1.00

单核处理?/span>

则根据公式可以算出,一个SUN UltraSparc T1?*8核处理器需?*8*0.25=8个CPU licenses

 

按用hQ?/strong>Oracle数据库按照用h授权Q是指最l端的连接到Oracle数据库的用户数。按照用h来买的时候只能用于一个系l,不允许在多台机器上安装。每一个访问Oracle数据库的用户Q无论是自然是设备,都算作一个用?(Named User)。如果是B/S架构Q那么是指连接到中间件上的用h?/span>

 

Named User Plus: is defined as anindividual authorized by you to use the programs which are installed on a singleserver or multiple servers, regardless of whether the individual is activelyusing the programs at any given time. A non human operated device will becounted.

 

按用h购买则对应相应的产品有对应的License的最低购买量限制Q如下:

产品

最低License?/span>

Oracle Database Standard Edition ONE

5 Named User Plus licenses

Oracle Database Standard Edition

5 Named User Plus licenses

Oracle Database Enterprise Edition

25 Named User Plus licenses per CPU

Oracle Application Server Standard Edition ONE

5 Named User Plus licenses

All other Oracle Application Server products

10 Named User Plus licenses per CPU

当然用户应该Ҏ自己的实际用h订购Q且不少于相应版本所要求的最低用h?/span>

一般情况下Q?CPU的费用约{于50user的费用,所以如果用h>CPU?pL*50Q则按CPU订购反而更为经?/strong>

 

更换服务器,OracleLicense要重新购买吗Q?/strong>

如果用户是按照用h购买的OracleQ更改硬件不需要重新购买LicenseQ?/span>

如果是按照CPU个数乎ͼ有相应的换算ҎQ具体请咨询Oracle公司?/span>

 

q里是Oracle 11g企业版的销售h|

每个Licenseq有有效期的分类Q不论是User Licenseq是CPU LicenseQ,分别为:1q?q?q?q?q、永久。当然hg是依ơ增加?/span>

 

当前Oracle 11G的User License无限使用期的hZh民币3?左右Q按50个User License无限使用期的购买量则h?7.5?每个CPU License无限使用期的h?7?千,按IBM机的系数计,则购Chgؓ17?千,?0个User License的h格相q?/span>

 

关于服务hQ一般地Q购买Oracle的License都包含首q的服务费,以后的费用按每年原h?2%计算?/span>

 

更多的品h格可以访问http://shop.oracle.com查看?/span>


q里我们再介l一下如何查看服务器上物理CPUL以及核数Q?/strong>

a.如果已安装了数据库实例,那么直接查看V$license视图卛_:

SQL> select cpu_count_current,CPU_CORE_COUNT_CURRENT,CPU_SOCKET_COUNT_CURRENT from v$license;

CPU_COUNT_CURRENT CPU_CORE_COUNT_CURRENT CPU_SOCKET_COUNT_CURRENT
----------------- ---------------------- ------------------------
                2                      2                        1
以上通过v$license 视图反应了数据库服务器当前的逻辑CPUL?Q而ȝ核数也是2Q实际的物理CPU Socket?Q那么说明是1个双核的物理CPU?/span>


b. 如果服务器上没有部|实例则不能使用v$license视图Q那么可以通过OS 命o来获取必要的信息?/span>

在x86 Linux服务器上Q?/span>


列出当前使用的物理CPU的个敎ͼ

grep core\ id /proc/cpuinfo | grep -c \ 0$ | grep ^0$ >> /dev/null && grep -c processor /proc/cpuinfo || \
grep core\ id /proc/cpuinfo | grep -c \ 0$

列出单个物理CPU的核?

grep "cpu cores" /proc/cpuinfo |uniq

 

 

在Powerpd的IBM机上按照cpu模块方式来购乎ͼ在IBM Dual-Core ModuleQ双核模块)的power芯片上,一个双核模块(内含2颗物理cpuQ只需要购?.5个license Q?具体的模块类型可以咨询IBM厂家或者集成商?br />
转自Q?a >http://blog.csdn.net/eurasiaxz/article/details/10699869

当然随着cpu计算能力的提高,cpu个数有可能ƈ不需要太多。oracle的收Ҏ式肯定会变化?/p>

疯狂 2014-10-27 16:43 发表评论
]]>
URL最大长度限??http://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html疯狂疯狂Thu, 30 May 2013 01:29:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.htmlhttp://www.aygfsteel.com/freeman1984/comments/399942.htmlhttp://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/399942.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/399942.html

转自Q?a >http://blog.csdn.net/jinhill/article/details/3961881

  1. URL不能大于255bytes的说法确实存在,?a title="RFC2616" target="_blank">RFC2616中提刎ͼ

    The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).

    Note: Servers ought to be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations might not properly support these lengths.

  2. 从上一点也可以看出Q?55bytes的说法也是ؓ了兼Ҏ考虑。实际上C览器的限制如下Q?br />

    Microsoft Internet Explorer (Browser)
    Microsoft states that the maximum length of a URL in Internet Explorer is 2,083 characters, with no more than 2,048 characters in the path portion of the URL. In my tests, attempts to use URLs longer than this produced a clear error message in Internet Explorer.
    Firefox (Browser)
    After 65,536 characters, the location bar no longer displays the URL in Windows Firefox 1.5.x. However, longer URLs will work. I stopped testing after 100,000 characters.
    Safari (Browser)
    At least 80,000 characters will work. I stopped testing after 80,000 characters.
    Opera (Browser)
    At least 190,000 characters will work. I stopped testing after 190,000 characters. Opera 9 for Windows continued to display a fully editable, copyable and pasteable URL in the location bar even at 190,000 characters.
    Apache (Server)
    My early attempts to measure the maximum URL length in web browsers bumped into a server URL length limit of approximately 4,000 characters, after which Apache produces a “413 Entity Too Large” error. I used the current up to date Apache build found in Red Hat Enterprise Linux 4. The official Apache documentation only mentions an 8,192-byte limit on an individual field in a request.
    Microsoft Internet Information Server
    The default limit is 16,384 characters (yes, Microsoft’s web server accepts longer URLs than Microsoft’s web browser). This is configurable.
    Perl HTTP::Daemon (Server)
    Up to 8,000 bytes will work. Those constructing web application servers with Perl’s HTTP::Daemon module will encounter a 16,384 byte limit on the combined size of all HTTP request headers. This does not include POST-method form data, file uploads, etc., but it does include the URL. In practice this resulted in a 413 error when a URL was significantly longer than 8,000 characters. This limitation can be easily removed. Look for all occurrences of 16×1024 in Daemon.pm and replace them with a larger value. Of course, this does increase your exposure to denial of service attacks.

  3. 另外值得注意的是Q有文章提到作ؓ<a>的href属性时QURL不能过1024bytesQ这Ҏ有详l查?

lgQURLq是不适合太长Q不是不得已Q尽量不要通过GET方式提交大量参数Q可以考虑用POST方式Q大U在2M左右Q应该是和服务器及设定有养I。另外这么长的URL在访问和收藏Q有文章提到有些览器在收藏长地址时也是会出现问题Q时也是相当不友好的。当Ӟ之前数据库字D设|时q是作ؓ255bytes处理Q现在可能要考虑扩充一下了?/p>

参考:

  1. What is the maximum length of a URL?
  2. What is the limit on QueryString / GET / URL parameters?


疯狂 2013-05-30 09:29 发表评论
]]>
关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和?/title><link>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 24 Dec 2012 07:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/393402.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/393402.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/393402.html</trackback:ping><description><![CDATA[     摘要: 关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和?nbsp; <a href='http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html'>阅读全文</a><img src ="http://www.aygfsteel.com/freeman1984/aggbug/393402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2012-12-24 15:16 <a href="http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A/B试(转蝲)http://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html疯狂疯狂Tue, 28 Aug 2012 03:41:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.htmlhttp://www.aygfsteel.com/freeman1984/comments/386419.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/386419.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/386419.htmlA / B试不是一个时髦名词。现在很多有l验的营销和设计工作者用它来获得访客行ؓ信息Q来提高转换率。然而, A / B试与SEO不同的是Qh们都不太知道徒河q行|站分析和可用性分析。他们ƈ不完全明白它是什么或如何更有效的使用它。本文将Z提供有史以来最好的A / B试教程?/p>

什么是A/B试?

A / B试的核心就是:定两个元素或版本(A和BQ哪个版本更好,你需要同时实验两个版本。最后,选择最好的版本使用?/p>

|络上的A / B试Q即你设计的面有两个版本(A和BQ,A为现行的设计Q称为控Ӟ Q?B是新的设计。比较这两个版本之间你所兛_的数据(转化率,业WQ蟩出率{) 。最后,您选择效果最好的版本?/p>

试哪些东西?

你要选择什么去试取决于你的目标。例如,如果你的目标是增加顾客数量,那么您可能测试下列内容:注册表单数量Q字D늱型要求,隐私政策{。在q种情况下A / B试的目标是要弄清楚什么阻止了游客注册。需要填写的表单的数量?用户的隐U?q是该网站做了让游客不信ȝ事情Q所有这些问题都可以通过一个个A/B 试获得{案?/p>

每一个A / B试内容都是独一无二的,单通常试一下这些内容:

  • 行动按钮的措辞,大小Q颜色和位置Q?/li>
  • 标题或品说明,
  • 表单的数量和字段cdQ?/li>
  • |站的布局和风|
  • 产品定h和促销zdQ?/li>
  • 着陆和产品面上的囄Q?/li>
  • 面上文字的长度Q少Vs多)?/li>

一旦你军_要测试什么,下一步当然是要选择一个合适的试工具。如果你惌一个基的免费工P可以使用Google Website Optimizer。如果你惌功能更加强大的工P可以使用Visual Website Optimizer  。其他的一些选择都是可以的,建立试验在所有工具中都很怼Q所以我们只需讨论一U即可?/p>

你可以通过两种Ҏ建立A / B试Q?/p>

  • 在页面测试加载前替换元素
    如果你测试的是页面上的单个元素,如注册按钮,然后需要在试工具中设|按钮。当试Ӟ在A / B工具在面l用户前随机替换按钮?/li>
  • 重定向到另一面
    如果你想通过A / B试整个面Q比如说Q一个绿色的主题和一个红色主题,那么你就需要创建和上传新的面。例如,如果您的主页?http://www.example.com/index.htmlQ那么你需要创建另外一个页?http://www.example.com/index1.html。当试q行Ӟ您的试工具一部分讉K者重定向到第二个|址?/li>

一旦您使用了上面的两种变换ҎQ下一步是建立您的转换目标。通常Q你会得C个JavaScript代码Q您可以复制q粘贴到一个需要游客到辄目标|页。例如,如果您有一个电子商务网站,你正在测试的“立即购买“按钮的颜Ԍ然后您的转换目标是购买成功后的“谢谢?#8220;面?/p>

在{换事件发生的同时Q在A / B试工具Q记录了哪种面昄l了讉K者。经q够数量的游客Q您可以定哪个面带来了最多的转化Q徏立和q行的A / B试Q其实很单?/p>

该做什么和不该做什?/strong>

虽然A / B试是超U简单的概念Q但是请CQ以下这些都只是我自ql验?/p>

注意事项

需要做?/strong>

  • 知道q行试多久。结束太早,可能会你花了时间但是没有得到有意义的结果。结束太晚也不好Q因为效果不佳的面可能影响你的转化和业l。用一?a href="http://visualwebsiteoptimizer.com/ab-split-test-duration/">计算?/a>Q来定试多久以后来结束它?/li>
  • 相同的面呈献l同一个访客。您的工具应该有一个记忆访问者已l看到的面的功能。这样可以防止向同一用户昄一不同的h格或不同的促销优惠?/li>
  • 让您的A / B试在整个网站保持一致。如果你正在试的登录按钮在多个地点出现Q然后一个访问者应在所有的地方看到同样的变化。在面1昄一个样子,在页?昄两外一个样子,会试验l果被干扰?/li>
  • 做很多的A / B试。让我们面对现实吧:你的W一个A / B试可能会无效。但是不要绝望。一个A / B试只能有三个结果:没有l果Q不好的l果和好的结果。优化{换率的关键是要做大量的A / B试Q把所有的好的l果拼接hQ最l推动业l?/li>

l典A/B试案例研究

q里有一些如何进行A/B试的案例研I?/p>

Writing Decisions: Headline Tests on the Highrise Sign-Up Page 37Signals试他们的h格页面的标题。最l发玎ͼ “30-Day Free Trial on All Accounts “比原来的“Start a Highrise Account. “多?0 Q以上的订单?/p>

“You Should Follow Me on Twitter Here” (Dustin Curtis) q是一个用来测试召唤用户在Twitter上关注自q试验? Dustin 发现提示文字?#8220;You should follow me on Twitter here” 的效果是“I’m on Twitter.” 173%

Human Photos Double Conversion Rates 从两个不同的A / B试在|站上增加{换率的h的照片:一个oZo人惊讶的l论QA/B试两张囄Q将真h照片攑֜|站上会获得一倍的转化。研I说明,我们潜意识被照片吸引了?/p>

Google Website Optimizer Case Study: Daily Burn, 20%+ Improvement (Tim Ferriss) 一个将用户选择减少的变化转化提高?0%Q最l的版本在细节和文字上更易吸引目光?/p>

Two Magical Words Increased Conversion Rate by 28% “It’s free” q个单词增加了注册按钮点L数的28%, 试l果表明Q在行动召唤上一些很的变化会带来o人惊讶的l果?/p>

Changing the Sign-Up Button from Green to Red 依靠A / B试Q?CareLogger把注册按钮从l色修改为红色增加了34Q{换率Q?/p>

Single page vs. multi-step checkout 如果你有一个在U商店,很常见的是支付程。这个A / B试发现Q多个支付流E比单个支付程完成的销售更好?/p>

“Mad Libs” style form increases conversion 25-40% 打|传统的智慧,此A / B试发现一D风?/em>形式输入字段比传lŞ式的布局更好?/p>

Complete redesign of product page increased sales by 20% 一个Y件品的公司重新设计他们的品页l它一个现代的外观和增加信L块。最l结果:他们成功地增?0 Q的总销售额。本案例研究证明了设计对销售的影响?/p>

Marketing Experiments response capture case study – triple digit increase in conversions 通过优化邮g地址获取提高?58 Q。重Ҏ消除所有的q扰Qƈ要求游客只需提供电子邮g地址。用亚马逊礼品卡让他/她的完成个h资料?/p>

A/B试工具

有许多侧重点Qh位和功能不同的A / B试工具Q这里是一些:

一些深入研I的A/B试资料

如果你已l读到这里,那么A / B试大概已经Ȁ起你的兴。在q里Q有一些非常好的A/B试资源?/p>

L你下一个A/B试的灵?/strong>

一些介l性文?/strong>

A/B试中的数学

原文地址Q?a >http://www.smashingmagazine.com/2010/06/24/the-ultimate-guide-to-a-b-testing/
转蝲自:http://ucdchina.com/snap/7203



疯狂 2012-08-28 11:41 发表评论
]]>
数字证书原理(?http://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.html疯狂疯狂Tue, 24 Jul 2012 02:35:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.htmlhttp://www.aygfsteel.com/freeman1984/comments/383817.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/383817.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/383817.html阅读全文

疯狂 2012-07-24 10:35 发表评论
]]>
Quartz+Spring的集配|??http://www.aygfsteel.com/freeman1984/archive/2012/05/11/377882.html疯狂疯狂Fri, 11 May 2012 03:02:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/05/11/377882.htmlhttp://www.aygfsteel.com/freeman1984/comments/377882.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/05/11/377882.html#Feedback1http://www.aygfsteel.com/freeman1984/comments/commentRss/377882.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/377882.html阅读全文

疯狂 2012-05-11 11:02 发表评论
]]>
select, iocp, epoll,kqueue及各UI/O复用机制http://www.aygfsteel.com/freeman1984/archive/2011/12/07/365746.html疯狂疯狂Wed, 07 Dec 2011 05:45:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365746.htmlhttp://www.aygfsteel.com/freeman1984/comments/365746.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365746.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/365746.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/365746.html首先Q介l几U常见的I/O模型及其区别Q如下:

  • blocking I/O

  • nonblocking I/O

  • I/O multiplexing (select and poll)

  • signal driven I/O (SIGIO)

  • asynchronous I/O (the POSIX aio_functions)

blocking I/O
q个不用多解释吧Q阻塞套接字。下图是它调用过E的囄Q?/p>

重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernelQ注意kernel?个过E,wait for data和copy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此q程一直是d的?/p>

nonblocking I/OQ?/strong>
与blocking I/O对立的,非阻塞套接字Q调用过E图如下Q?/p>

可以看见Q如果直接操作它Q那是个轮询。。直到内核缓冲区有数据?/p>

I/O multiplexing (select and poll)
最常见的I/O复用模型Qselect?/p>

select先阻塞,有活动套接字才返回。与blocking I/O相比Qselect会有两次pȝ调用Q但是select能处理多个套接字?/p>

signal driven I/O (SIGIO)
只有UNIXpȝ支持Q感兴趣的课查阅相关资料

?strong>I/O multiplexing (select and poll)相比Q它的优势是Q免Mselect的阻塞与轮询Q当有活跃套接字Ӟ由注册的handler处理?/p>

asynchronous I/O (the POSIX aio_functions)
很少?nixpȝ支持Qwindows的IOCP则是此模?/p>

完全异步的I/O复用机制Q因为纵观上面其它四U模型,臛_都会在由kernel copy data to appliction旉塞。而该模型是当copy完成后才通知applicationQ可见是U异?/font>的。好像只有windows?font color="#ff0000">完成端口是这个模型,效率也很?/p>

下面是以上五U模型的比较

可以看出Q越往后,d少Q理Z效率也是最优?/p>

=====================分割U?=================================

5U模型的比较比较清晰了,剩下的就是把select,epoll,iocp,kqueue按号入那就OK了?/p>

select和iocp分别对应W?U与W?U模型,那么epoll与kqueue呢?其实也于select属于同一U模型,只是更高U一些,可以看作有了W?U模型的某些Ҏ,如callback机制?/p>

那么Qؓ什么epoll,kqueue比select高Q?

{案是,他们?font color="#ff0000">轮询。因Z们用callback取代了。想想看Q当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调?不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU旉。如果能l套接字注册某个回调函数Q当他们z跃Ӟ自动完成相关操作Q那避免了轮询Q这正是epoll与kqueue做的?/p>

windows or *nix QIOCP or kqueue/epollQ?

诚然QWindows的IOCP非常Q目前很有支持asynchronous I/O的系l,但是׃其系l本w的局限性,大型服务器还是在UNIX下。而且正如上面所qͼkqueue/epoll ?IOCP相比Q就是多了一层从内核copy数据到应用层的阻塞,从而不能算?strong>asynchronous I/OcR?/strong>但是Q这层小的d无轻重Qkqueue与epoll已经做得很优U了?/p>

提供一致的接口QIO Design Patterns

实际上,不管是哪U模型,都可以抽象一层出来,提供一致的接口Q广Zh知的有ACE,Libeventq些Q他们都是跨q_的,而且他们自动选择最优的I/O复用机制Q用户只需调用接口卛_。说到这里又得说?个设计模式,Reactor and Proactor?/strong>有一经典文?a >http://www.artima.com/articles/io_design_patterns.html值得阅读QLibevent?strong>Reactor模型QACE提供Proactor模型。实际都是对各种I/O复用机制的封装?/p>

Java nio包是什么I/O机制Q?/strong>

我曾天真的认为java nio装的是IOCP。。现在可以确定,目前的java本质是select()模型Q可以检?jre/bin/nio.dll得知。至于java服务器ؓ什么效率还不错。。我也不得而知Q可能是设计得比较好吧。?_-?/p>

=====================分割U?=================================

ȝ一些重点:

  1. 只有IOCP是asynchronous I/OQ其他机制或多或都会有一炚w塞?
  2. select低效是因为每ơ它都需要轮询。但低效也是相对的,视情况而定Q也可通过良好的设计改?
  3. epoll, kqueue是Reacor模式QIOCP是Proactor模式?
  4. java nio包是select模型。?

转蝲自:http://blog.csdn.net/shallwake/article/details/5265287



疯狂 2011-12-07 13:45 发表评论
]]>
nginx和tomcat负蝲单配|?windows环境)http://www.aygfsteel.com/freeman1984/archive/2011/12/07/365726.html疯狂疯狂Wed, 07 Dec 2011 02:40:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365726.htmlhttp://www.aygfsteel.com/freeman1984/comments/365726.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365726.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/365726.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/365726.html阅读全文

疯狂 2011-12-07 10:40 发表评论
]]>
hibernateQspring理事务?transactionQJDBC connectionQHibernate Session的用研I?Q一Q?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 18 Nov 2011 03:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/363984.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/363984.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/363984.html</trackback:ping><description><![CDATA[如果单独使用hibernate可参考上一文?a href="http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html">http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html</a><br /><br /><strong>首先hibernate的Connection release mode有以下几U:<br /></strong>1 after_statement 2 after_transaction 3 on_close 其中after_statement 用在jta?Q?span style="color: red"><strong>on_close ?.1之前遗留的(也许是ؓspring留的-_-Q,也就?.1之前默认是on_close Q但3.1之后默认如果单独使用hibernate是after_transactionQ?/strong></span>如果有第三方事务理Q就用第三方提供的默认|spring是默认使用了on_close?br /><strong>在spring理事务中我们看看系l启动后默认使用的配|:<br /></strong>1,ransaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory使用spring事务{略<br />2Qhibernate内部 Automatic session close at end of transaction: disabled 因ؓ已经交给spring?br />3   Connection release mode: auto 默认Q也是没有配置hibernate.connection.release_mode的时候,但是q里有地斚w要注意:也就是前面提到的使用W三方策略时的问题:看一下代码: <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">String releaseModeName </span><span style="color: #000000">=</span><span style="color: #000000"> PropertiesHelper.getString( Environment.RELEASE_CONNECTIONS, properties, </span><span style="color: #000000">"</span><span style="color: #000000">auto</span><span style="color: #000000">"</span><span style="color: #000000"> );<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />        log.info( </span><span style="color: #000000">"</span><span style="color: #000000">Connection release mode: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> releaseModeName );<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />        ConnectionReleaseMode releaseMode;<br /><img id="Codehighlighter1_246_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_311_Open_Text.style.display='none'; Codehighlighter1_246_311_Closed_Image.style.display='inline'; Codehighlighter1_246_311_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_246_311_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_246_311_Closed_Text.style.display='none'; Codehighlighter1_246_311_Open_Image.style.display='inline'; Codehighlighter1_246_311_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif">        </span><span style="color: #0000ff">if</span><span style="color: #000000"> ( </span><span style="color: #000000">"</span><span style="color: #000000">auto</span><span style="color: #000000">"</span><span style="color: #000000">.equals(releaseModeName) ) </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_246_311_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_246_311_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />            </span><span style="color: red">releaseMode </span><span style="color: red">=</span><span style="color: red"> transactionFactory.getDefaultReleaseMode();        }</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" /></span></span><span style="color: #000000"><br /><img id="Codehighlighter1_320_663_Open_Image" onclick="this.style.display='none'; Codehighlighter1_320_663_Open_Text.style.display='none'; Codehighlighter1_320_663_Closed_Image.style.display='inline'; Codehighlighter1_320_663_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_320_663_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_320_663_Closed_Text.style.display='none'; Codehighlighter1_320_663_Open_Image.style.display='inline'; Codehighlighter1_320_663_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif">        </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_320_663_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_320_663_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />            releaseMode </span><span style="color: #000000">=</span><span style="color: #000000"> ConnectionReleaseMode.parse( releaseModeName );<br /><img id="Codehighlighter1_494_659_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_659_Open_Text.style.display='none'; Codehighlighter1_494_659_Closed_Image.style.display='inline'; Codehighlighter1_494_659_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_494_659_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_494_659_Closed_Text.style.display='none'; Codehighlighter1_494_659_Open_Image.style.display='inline'; Codehighlighter1_494_659_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif">            </span><span style="color: #0000ff">if</span><span style="color: #000000"> ( releaseMode </span><span style="color: #000000">==</span><span style="color: #000000"> ConnectionReleaseMode.AFTER_STATEMENT </span><span style="color: #000000">&&</span><span style="color: #000000"> </span><span style="color: #000000">!</span><span style="color: #000000">connections.supportsAggressiveRelease() ) </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_494_659_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_494_659_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />                log.warn( </span><span style="color: #000000">"</span><span style="color: #000000">Overriding release mode as connection provider does not support 'after_statement'</span><span style="color: #000000">"</span><span style="color: #000000"> );<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />                releaseMode </span><span style="color: #000000">=</span><span style="color: #000000"> ConnectionReleaseMode.AFTER_TRANSACTION;<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />            }</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />        }</span></span></div>其中U色部分是调用了spring提供的默认|而spring的默认|在jta和cmt中都默认使用的是after_statement<br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_0_328_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_328_Open_Text.style.display='none'; Codehighlighter1_0_328_Closed_Image.style.display='inline'; Codehighlighter1_0_328_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_328_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_328_Closed_Text.style.display='none'; Codehighlighter1_0_328_Open_Image.style.display='inline'; Codehighlighter1_0_328_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_328_Closed_Text">/** */</span><span id="Codehighlighter1_0_328_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * Sets connection release mode "on_close" as default.<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * <p>This was the case for Hibernate 3.0; Hibernate 3.1 changed<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * it to "auto" (i.e. "after_statement" or "after_transaction").<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * However, for Spring's resource management (in particular for<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * HibernateTransactionManager), "on_close" is the better default.<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_384_428_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_428_Open_Text.style.display='none'; Codehighlighter1_384_428_Closed_Image.style.display='inline'; Codehighlighter1_384_428_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_384_428_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_384_428_Closed_Text.style.display='none'; Codehighlighter1_384_428_Open_Image.style.display='inline'; Codehighlighter1_384_428_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> ConnectionReleaseMode getDefaultReleaseMode() </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_384_428_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_384_428_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> ConnectionReleaseMode.ON_CLOSE;<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />    }</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span></div><br />而springZ么要使用on_close Q而不是用after_transaction ,我们xopensessioninview的原理也许能明白Qsession在view成还要用,所以不能再transactio<span>n使用完后关闭JDBC connectionQ必要在session之后Q所以要使用on<strong>_close</strong></span><strong><span>Q?/span><span>也就是在on session(flush.autoQ或者flush.Eagerly) 关闭Q。这U情况hibernate内部q会在spring关闭JDBC connection后提C?费解Q因为after transaction之后session没有关闭Q但?nbsp;Connection release mode配置的是on_close,session的关闭和 Connection 的关闭都由spring来管理,hibernate׃知道?Q所以hibernate有好的提C如?其实sessionQ已l关闭。当焉着session的关闭jdbc链接释放回连接池)Q?/span><br /><span style="color: red">transaction completed on session with on_close connection release mode; be sure to cl</span></strong>ose the session to release JDBC resources!Q?br /><br />。当然我们也可以使用after_transaction Q这U情况对使用~程式事务非帔R用?br />     <img src ="http://www.aygfsteel.com/freeman1984/aggbug/363984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-11-18 11:25 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsessionid 问题分析http://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html疯狂疯狂Fri, 02 Sep 2011 08:33:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.htmlhttp://www.aygfsteel.com/freeman1984/comments/357833.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/357833.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/357833.html阅读全文

疯狂 2011-09-02 16:33 发表评论
]]>
raid技?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 21 Jun 2011 09:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/352756.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/352756.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/352756.html</trackback:ping><description><![CDATA[<h3><span style="letter-spacing: 0.25pt">RAID 0</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q无差错控制的带区组</span><span style="letter-spacing: 0.25pt"></span></h3> <p><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p style="text-indent: 15.75pt"><span style="font-family: 宋体">要实?/span>RAID0<span style="font-family: 宋体">必须要有两个以上盘驱动器,</span>RAID0<span style="font-family: 宋体">实现了带区组Q数据ƈ不是保存在一个硬盘上Q而是分成数据块保存在不同驱动器上。因为将数据分布在不同驱动器上,所以数据吞吐率大大提高Q驱动器的负载也比较q。如果刚好所需要的数据在不同的驱动器上效率最好。它不需要计校验码Q实现容易。它的缺Ҏ它没有数据差错控Ӟ如果一个驱动器中的数据发生错误Q即使其它盘上的数据正确也无于事了。不应该它用于Ҏ据稳定性要求高的场合。如果用戯行图象(包括动画Q编辑和其它要求传输比较大的场合使用</span>RAID0<span style="font-family: 宋体">比较合适。同Ӟ</span>RAID<span style="font-family: 宋体">可以提高数据传输速率Q比如所需d的文件分布在两个盘上,q两个硬盘可以同时读取。那么原来读取同h件的旉被羃短ؓ</span>1/2<span style="font-family: 宋体">。在所有的U别中,</span>RAID 0<span style="font-family: 宋体">的速度是最快的。但?/span>RAID 0<span style="font-family: 宋体">没有冗余功能的,如果一个磁盘(物理Q损坏,则所有的数据都无法用?/span></p> <p style="text-indent: 21pt">RAID0<span style="font-family: 宋体">又称?/span>Stripe<span style="font-family: 宋体">?/span>Striping<span style="font-family: 宋体">Q它代表了所?/span>RAID<span style="font-family: 宋体">U别中最高的</span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">性能?/span>RAID 0<span style="font-family: 宋体">提高存储性能的原理是把连l的数据分散到多个磁盘上存取Q这Ppȝ有数据请求就可以被多个磁盘ƈ行的执行Q每个磁盘执行属于它自己的那部分数据h。这U数据上的ƈ行操作可以充分利用ȝ的带宽,显著提高盘整体存取性能?/span></p> <p><span style="font-family: 宋体">  如图所C?/span>:<span style="font-family: 宋体">pȝ向三个磁盘组成的逻辑盘</span>(RADI 0 <span style="font-family: 宋体">盘l?/span>)<span style="font-family: 宋体">发出?/span>I/O<span style="font-family: 宋体">数据h被{化ؓ</span>3<span style="font-family: 宋体">Ҏ作,其中的每一Ҏ作都对应于一块物理硬盘。我们从图中可以清楚的看到通过建立</span>RAID 0<span style="font-family: 宋体">Q原先顺序的数据h被分散到所有的三块盘中同时执行?/span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p><span style="font-family: 宋体">  从理ZԌ三块盘的ƈ行操作同一旉内磁盘读写速度提升?/span>3<span style="font-family: 宋体">倍?/span> <span style="font-family: 宋体">但由于ȝ带宽{多U因素的影响Q实际的提升速率肯定会低于理论|但是Q大量数据ƈ行传输与串行传输比较Q提速效果显著显然毋庸置疑?/span></p> <p><span style="font-family: 宋体">  </span>RAID 0<span style="font-family: 宋体">的缺Ҏ不提供数据冗余,因此一旦用h据损坏,损坏的数据将无法得到恢复?/span></p> <p><span style="font-family: 宋体">  </span>RAID 0<span style="font-family: 宋体">h的特点,使其特别适用于对性能要求较高Q而对数据</span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">不太在乎的领域,如图形工作站{。对于个人用P</span>RAID 0<span style="font-family: 宋体">也是提高盘存储性能的绝佳选择?/span></p> <p> </p> <h3><span style="letter-spacing: 0.25pt">RAID 1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q镜象结?/span></h3> <p style="text-align: center; margin: 1.5pt 0cm 0pt;background: #f6f6f6; word-break: break-all" align="center"><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p style="text-indent: 22pt"><span style="font-family: 宋体; letter-spacing: 0.25pt">对于使用q种</span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">l构的设备来_</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">控制器必能够同时对两个盘进行读操作和对两个镜象盘进行写操作。通过下面的结构图您也可以看到必须有两个驱动器。因为是镜象l构在一l盘出现问题Ӟ可以使用镜象Q提高系l的定w能力。它比较Ҏ设计和实现。每Mơ盘只能d一块数据,也就是说数据块传送速率与单独的盘的d速率相同。因?/span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">的校验十分完备,因此对系l的处理能力有很大的影响Q通常?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">功能pY件实玎ͼ而这L实现Ҏ在服务器负蝲比较重的时候会大大影响服务器效率。当您的pȝ需要极高的可靠性时Q如q行数据l计Q那么?/span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">比较合适。而且</span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">技术支?/span><span style="letter-spacing: 0.25pt">“</span><span style="font-family: 宋体; letter-spacing: 0.25pt">热替?/span><span style="letter-spacing: 0.25pt">”</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q即不断늚情况下对故障盘q行更换Q更换完毕只要从镜像盘上恢复数据卛_。当ȝ盘损坏时Q镜像硬盘就可以代替ȝ盘工作。镜像硬盘相当于一个备份盘Q可惌知Q这U硬盘模式的安全性是非常高的Q?/span><span style="letter-spacing: 0.25pt">RAID 1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">的数据安全性在所有的</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">U别上来说是最好的。但是其盘的利用率却只?/span><span style="letter-spacing: 0.25pt">50%</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q是所?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">U别中最低的?/span></p> <p><span style="font-family: 宋体"> </span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体">又称?/span>Mirror<span style="font-family: 宋体">?/span>Mirroring<span style="font-family: 宋体">Q它的宗旨是最大限度的保证用户数据的可用性和可修复性?/span> RAID 1<span style="font-family: 宋体">的操作方式是把用户写入硬盘的数据癑ֈ之百地自动复制到另外一个硬盘上?/span></p> <p><span style="font-family: 宋体">  当读取数据时Q系l先?/span>RAID 0<span style="font-family: 宋体">的源盘读取数据,如果d数据成功Q则pȝ不去备份盘上的数据</span>;<span style="font-family: 宋体">如果d源盘数据p|Q则pȝ自动转而读取备份盘上的数据Q不会造成用户工作d的中断。当Ӟ我们应当及时地更换损坏的盘q利用备份数据重新徏?/span>Mirror<span style="font-family: 宋体">Q避免备份盘在发生损坏时Q造成不可挽回的数据损失?/span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p><span style="font-family: 宋体">  ׃?/span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">的数据进行百分之癄备䆾Q在所?/span>RAID<span style="font-family: 宋体">U别中,</span>RAID 1<span style="font-family: 宋体">提供最高的数据</span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">保障。同P׃数据的百分之癑֤份,备䆾数据占了d储空间的一半,因而,</span>Mirror<span style="font-family: 宋体">的磁盘空间利用率低,存储成本高?/span></p> <p><span style="font-family: 宋体">  </span>Mirror<span style="font-family: 宋体">虽不能提高存储性能Q但׃其具有的高数据安全性,使其其适用于存N要数据,?/span><span style="font-family: 宋体"><span>服务?/span></span><span style="font-family: 宋体">和数据库存储{领域?/span></p> <p> </p> <h3>RAID 0+1</h3> <p>RAID 0+1:<span style="font-family: 宋体">正如其名字一?/span>RAID 0+1<span style="font-family: 宋体">?/span>RAID 0<span style="font-family: 宋体">?/span>RAID 1<span style="font-family: 宋体">的组合Ş式,也称?/span>RAID 10<span style="font-family: 宋体">?/span></p> <p><span style="font-family: 宋体">  以四个磁盘组成的</span>RAID 0+1<span style="font-family: 宋体">ZQ其数据</span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">方式如图所C?/span>:RAID 0+1<span style="font-family: 宋体">是存储性能和数?/span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">兼顾的方案。它在提供与</span>RAID 1<span style="font-family: 宋体">一L数据安全保障的同Ӟ也提供了?/span>RAID 0<span style="font-family: 宋体">q似的存储性能?/span></p> <p><span style="font-family: 宋体">  ׃</span>RAID 0+1<span style="font-family: 宋体">也通过数据?/span>100%<span style="font-family: 宋体">备䆾提供数据安全保障Q因?/span>RAID 0+1<span style="font-family: 宋体">的磁盘空间利用率?/span>RAID 1<span style="font-family: 宋体">相同Q存储成本高?/span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p>RAID 0+1<span style="font-family: 宋体">的特点其特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域Q如银行、金融、商业超市、仓储库ѝ各U档案管理等?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID2</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q带h码校?/span></h3> <p><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p><span style="font-family: 宋体; letter-spacing: 0.25pt">从概念上Ԍ</span><span style="letter-spacing: 0.25pt">RAID 2 </span><span style="font-family: 宋体; letter-spacing: 0.25pt">?/span><span style="letter-spacing: 0.25pt">RAID 3</span><span style="font-family: 宋体; letter-spacing: 0.25pt">cMQ?/span> <span style="font-family: 宋体; letter-spacing: 0.25pt">两者都是将数据条块化分布于不同的硬盘上Q?/span> <span style="font-family: 宋体; letter-spacing: 0.25pt">条块单位Z或字节。然?/span><span style="letter-spacing: 0.25pt">RAID 2 </span><span style="font-family: 宋体; letter-spacing: 0.25pt">使用一定的~码技术来提供错误查及恢复。这U编码技术需要多个磁盘存放检查及恢复信息Q?/span><span style="letter-spacing: 0.25pt">RAID 2</span><span style="font-family: 宋体; letter-spacing: 0.25pt">技术实施更复杂。因此,在商业环境中很少使用。下囑ַ边的各个盘上是数据的各个位Q由一个数据不同的位运得到的h校验码可以保存另一l磁盘上Q具体情况请见下图。由于v明码的特点,它可以在数据发生错误的情况下错误校正,以保证输出的正确。它的数据传送速率相当高,如果希望辑ֈ比较理想的速度Q那最好提高保存校验码</span><span style="letter-spacing: 0.25pt">ECC</span><span style="font-family: 宋体; letter-spacing: 0.25pt">码的盘Q对于控制器的设计来_它又?/span><span style="letter-spacing: 0.25pt">RAID3</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q?/span><span style="letter-spacing: 0.25pt">4</span><span style="font-family: 宋体; letter-spacing: 0.25pt">?/span><span style="letter-spacing: 0.25pt">5</span><span style="font-family: 宋体; letter-spacing: 0.25pt">要简单。没有免费的午餐Q这里也一P要利用v明码Q必要付出数据冗余的代仗输出数据的速率与驱动器l中速度最慢的相等?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID3</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q带奇偶校验码的q行传?/span></h3> <p> </p> <p style="text-indent: 25pt"><span style="font-family: 宋体; letter-spacing: 0.25pt; font-size: 12pt">q种校验码与RAID2不同Q只能查错不能纠错。它讉K数据时一ơ处理一个带区,q样可以提高d和写入速度,它像RAID 0一样以q行的方式来存放数据Q但速度没有RAID 0快。校验码在写入数据时产生q保存在另一个磁盘上。需要实现时用户必须要有三个以上的驱动器Q写入速率与读出速率都很高,因ؓ校验位比较少Q因此计时间相对而言比较。用软g实现RAID控制是十分困难的,控制器的实现也不是很Ҏ。它主要用于囑ŞQ包括动画){要求吞吐率比较高的场合。不同于RAID 2QRAID 3使用单块盘存放奇偶校验信息。如果一块磁盘失效,奇偶盘及其他数据盘可以重C生数据。如果奇偶盘失效Q则不媄响数据用。RAID 3对于大量的连l数据可提供很好的传输率Q但对于随机数据Q奇偶盘会成为写操作的瓶颈。利用单独的校验盘来保护数据虽然没有镜像的安全性高Q但是硬盘利用率得到了很大的提高QؓQn-1Q?n?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID4</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q带奇偶校验码的独立盘l构</span></h3> <p><span style="font-family: 宋体">  </span> </p> <p style="text-indent: 26.25pt">RAID4<span style="font-family: 宋体">?/span>RAID3<span style="font-family: 宋体">很象Q不同的是,它对数据的访问是按数据块q行的,也就是按盘q行的,每次是一个盘。在图上可以q么看,</span>RAID3<span style="font-family: 宋体">是一ơ一横条Q?/span>RAID4<span style="font-family: 宋体">一ơ一竖条。它的特点的</span>RAID3<span style="font-family: 宋体">也挺象,不过在失败恢复时Q它的难度可要比</span>RAID3<span style="font-family: 宋体">大得多了Q控制器的设计难度也要大许多Q而且讉K数据的效率不怎么好?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID5</span><span style="font-family: 宋体; letter-spacing: 0.25pt">Q分布式奇偶校验的独立磁盘结?/span></h3> <p style="text-align: center; margin: 1.5pt 0cm 0pt;background: #f6f6f6; word-break: break-all" align="center"><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p style="text-indent: 21pt"><span style="font-family: 宋体">从它的示意图上可以看刎ͼ它的奇偶校验码存在于所有磁盘上Q其中的</span>p0<span style="font-family: 宋体">代表W?/span>0<span style="font-family: 宋体">带区的奇偶校验|其它的意思也相同?/span>RAID5<span style="font-family: 宋体">的读出效率很高,写入效率一般,块式的集体访问效率不错。因为奇偶校验码在不同的盘上,所以提高了可靠性,允许单个盘出错?/span>RAID 5<span style="font-family: 宋体">也是以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位Q而是数据段的校验位交互存放于各个硬盘上。这PM一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据。硬盘的利用率ؓ</span>n-1<span style="font-family: 宋体">?/span> <span style="font-family: 宋体">但是它对数据传输的ƈ行性解决不好,而且控制器的设计也相当困难?/span>RAID 3 <span style="font-family: 宋体">?/span>RAID 5<span style="font-family: 宋体">相比Q重要的区别在于</span>RAID 3<span style="font-family: 宋体">每进行一ơ数据传输,需涉及到所有的阵列盘。而对?/span>RAID 5<span style="font-family: 宋体">来说Q大部分数据传输只对一块磁盘操作,可进行ƈ行操作。在</span>RAID 5<span style="font-family: 宋体">中有</span>“<span style="font-family: 宋体">写损?/span>”<span style="font-family: 宋体">Q即每一ơ写操作Q将产生四个实际的读</span>/<span style="font-family: 宋体">写操作,其中两次L的数据及奇偶信息Q两ơ写新的数据及奇偶信息?/span> RAID-5<span style="font-family: 宋体">的话Q优Ҏ提供了冗余性(支持一块盘掉线后仍然正常运行)Q磁盘空间利用率较高Q?/span>N-1/N<span style="font-family: 宋体">Q,d速度较快Q?/span>N-1<span style="font-family: 宋体">倍)?/span>RAID5<span style="font-family: 宋体">最大的好处是在一块盘掉线的情况下Q?/span>RAID<span style="font-family: 宋体">照常工作Q相对于</span>RAID0<span style="font-family: 宋体">必须每一块盘都正常才可以正常工作的状况容错性能好多了。因?/span>RAID5<span style="font-family: 宋体">?/span>RAID<span style="font-family: 宋体">U别中最常见的一个类型?/span>RAID5<span style="font-family: 宋体">校验位即</span>P<span style="font-family: 宋体">位是通过其它条带数据做异?/span>(xor)<span style="font-family: 宋体">求得的。计公式ؓ</span>P=D0xorD1xorD2…xorDn<span style="font-family: 宋体">Q其?/span>p<span style="font-family: 宋体">代表校验块,</span>Dn<span style="font-family: 宋体">代表相应的数据块Q?/span>xor<span style="font-family: 宋体">是数学运符号异或?/span> </p> <p><span style="font-family: 宋体">  </span>RAID5<span style="font-family: 宋体">校验位算法详?/span> </p> <p><span style="font-family: 宋体">  </span>P=D1 xor D2 xor D3 … xor Dn <span style="font-family: 宋体">Q?/span>D1,D2,D3 … Dn<span style="font-family: 宋体">为数据块Q?/span>P<span style="font-family: 宋体">为校验,</span>xor<span style="font-family: 宋体">为异或运)</span> </p> <p><span style="font-family: 宋体">  </span>XOR(Exclusive OR)<span style="font-family: 宋体">的校验原理如下表Q?/span> </p> <p><span style="font-family: 宋体">  </span> </p> <table style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; border-top: #888888 1pt solid; border-right: #888888 1pt solid" border="1" cellpadding="0"> <tbody> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>A<span style="font-family: 宋体">?/span></p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>B<span style="font-family: 宋体">?/span></p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>Xor<span style="font-family: 宋体">l果</span></p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td></tr></tbody></table> <p><span style="font-family: 宋体">  q里?/span>A<span style="font-family: 宋体">?/span>B<span style="font-family: 宋体">值就代表了两个位Q从中可以发玎ͼ</span>A<span style="font-family: 宋体">?/span>B<span style="font-family: 宋体">一hQ?/span>XOR(<span style="font-family: 宋体">非或又称</span>"<span style="font-family: 宋体">非异?/span>")<span style="font-family: 宋体">l果?/span>0<span style="font-family: 宋体">Q?/span>A<span style="font-family: 宋体">?/span>B<span style="font-family: 宋体">不一hQ?/span>XOR<span style="font-family: 宋体">l果是</span>1<span style="font-family: 宋体">Q如果知?/span>XOR<span style="font-family: 宋体">l果Q?/span>A<span style="font-family: 宋体">?/span>B<span style="font-family: 宋体">中的M两个数|可以反推出剩下的一个数倹{比?/span>A<span style="font-family: 宋体">?/span>1<span style="font-family: 宋体">Q?/span>XOR<span style="font-family: 宋体">l果?/span>1<span style="font-family: 宋体">Q那?/span>B<span style="font-family: 宋体">肯定?/span>0<span style="font-family: 宋体">Q如?/span>XOR<span style="font-family: 宋体">l果?/span>0<span style="font-family: 宋体">Q那?/span>B<span style="font-family: 宋体">肯定?/span>1<span style="font-family: 宋体">。这是</span>XOR<span style="font-family: 宋体">~码与校验的基本原理?/span></p> <p style="text-indent: 26.25pt">RAID 5<span style="font-family: 宋体">是一U?/span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">性能、数?/span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">和存储成本兼儡存储解决Ҏ?/span> <span style="font-family: 宋体">以四个硬盘组成的</span>RAID 5<span style="font-family: 宋体">ZQ其数据存储方式如下图所C?/span>:</p> <p><span style="font-family: 宋体">  </span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p style="text-align: center; line-height: 160%" align="center">图中QP0为D0QD1和D2的奇偶校验信息,其它以此cL?/p> <p><span style="font-family: 宋体">  由图中可以看出,</span>RAID 5<span style="font-family: 宋体">不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组?/span>RAID5<span style="font-family: 宋体">的各个磁盘上Qƈ且奇偶校验信息和相对应的数据分别存储于不同的盘上。当</span>RAID5<span style="font-family: 宋体">的一个磁盘数据发生损坏后Q利用剩下的数据和相应的奇偶校验信息L复被损坏的数据?/span></p> <p style="text-indent: 21pt">RAID 5<span style="font-family: 宋体">可以理解为是</span>RAID 0<span style="font-family: 宋体">?/span>RAID 1<span style="font-family: 宋体">的折h案?/span>RAID 5<span style="font-family: 宋体">可以为系l提供数据安全保障,但保障程度要?/span>Mirror<span style="font-family: 宋体">低而磁盘空间利用率要比</span>Mirror<span style="font-family: 宋体">高?/span>RAID 5<span style="font-family: 宋体">h?/span>RAID 0<span style="font-family: 宋体">相近似的数据d速度Q只是多了一个奇偶校验信息,写入数据的速度比对单个盘q行写入操作E慢。同时由于多个数据对应一个奇偶校验信息,</span>RAID 5<span style="font-family: 宋体">的磁盘空间利用率要比</span>RAID 1<span style="font-family: 宋体">高,存储成本相对较低?/span></p> <h3><span style="font-family: 宋体">数据恢复</span></h3> <p style="text-indent: 25pt"><span style="font-family: 宋体; letter-spacing: 0.25pt; font-size: 12pt">一旦RAID阵列出现故障Q硬件服务商只能l客户重新初始化或者REBUILDQ这样客h据就会无法挽回。出现故障以后只要不寚w列作初始化操作,有Z恢复出故障RAID盘阵列的数据?/span></p> <p style="text-indent: 22pt"><span style="font-family: 宋体; letter-spacing: 0.25pt">׃</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">数据恢复的复杂性和技术难度较高,?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">阵列出现故障Ӟ一定要找有l验的专业数据恢复中心提供数据恢复帮助。判断专业数据恢复中心的标准包括数据恢复中心所使用?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">数据恢复工具、数据恢复工E师从业l验{。因?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">阵列中存储的数据一般都比较重要Q一旦被d损坏Q将造成无法挽回的损失?/span></p> <p style="text-indent: 22pt"><span style="font-family: 宋体; letter-spacing: 0.25pt">目前常用?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">阵列数据恢复工具包括效率?/span><span style="letter-spacing: 0.25pt">HD Doctor</span><span style="font-family: 宋体; letter-spacing: 0.25pt">、数据恢复指南针</span><span style="letter-spacing: 0.25pt">Data Compass</span><span style="font-family: 宋体; letter-spacing: 0.25pt">、硬盘复制机</span><span style="letter-spacing: 0.25pt">Data Copy King</span><span style="font-family: 宋体; letter-spacing: 0.25pt">{?/span></p> <p style="text-indent: 21pt"> </p> <p style="text-indent: 21pt"></p><img src ="http://www.aygfsteel.com/freeman1984/aggbug/352756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-06-21 17:07 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx tomcat负蝲配置http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344398.html疯狂疯狂Tue, 15 Feb 2011 15:08:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344398.htmlhttp://www.aygfsteel.com/freeman1984/comments/344398.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344398.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/344398.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344398.htmlNginx.conf :

user  oschina;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    use epoll;
    worker_connections  2048;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] $request '
    #                  '"$status" $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  off;
    access_log  logs/access.log;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
 
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #keepalive_timeout  75 20;

    include    gzip.conf;
   
    server {
    listen 80;
    server_name .oschina.net;
    location / {
        rewrite (.*) http://www.test.net$1 permanent;
    }
    }

    server {
    listen 80;
    server_name www.test.net;

        log_format  oschina_log
        '$remote_addr - $remote_user [$time_local] $request '
        '"$status" $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/oschina.log;

    location ~ ^/(WEB-INF)/ {
            deny all;
        }

        location ~ \.(apk|torrent|htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
            root /data/oschina/webapp;
        access_log off;
            expires 24h;
        }
       
    location ~ ^/uploads/ {
        access_log off;
            root /data/test/webapp;
        expires 24h;
        }

    location / {
        proxy_pass http://localhost:8080;
        include proxy.conf;
    }

    error_page 502 503 /502.html;
        error_page 404 /404.html;
    error_page 403 /403.html;
    }
}

gzip.conf:

gzip              on;
gzip_min_length      1000;
gzip_types         text/plain text/css application/x-javascript;

proxy.conf:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   300;
proxy_send_timeout      300;
proxy_read_timeout      300;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;



疯狂 2011-02-15 23:08 发表评论
]]>
Tomcat中限制ip讉Khttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344326.html疯狂疯狂Tue, 15 Feb 2011 03:07:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344326.htmlhttp://www.aygfsteel.com/freeman1984/comments/344326.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344326.html#Feedback1http://www.aygfsteel.com/freeman1984/comments/commentRss/344326.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344326.htmlOriginal URL: http://www.miotour.com/2010/04/27/tomcat%e4%b8%ad%e9%99%90%e5%88%b6ip%e8%ae%bf%e9%97%ae/
Tomcat中限制ip讉K是非常简单的Q只需要编辑server.xml文g卛_

vi server.xml

扑ֈcontext区域Q如

<context path=”/joseph”  reloadable=”true” docBase=”/var/www/joseph”>

<value className=”org.apache.catalina.values.RemoteAddrValue” allow=”” deny=”127.0.0.1″ />

</context>

说明Q只限制127.0.0.1讉K

如要限制192.168.1.0-192.168.5.255?92.168.10.0-192.168.15.255

deny=”192.168.[1-5].*,192.168.[10-15].*”


疯狂 2011-02-15 11:07 发表评论
]]>
jkmount不{发部?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 15 Feb 2011 02:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/344325.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/344325.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/344325.html</trackback:ping><description><![CDATA[<div>Original URL: <a title="jkmount不{发部分请? >http://www.miotour.com/2009/11/30/jkmount%e4%b8%8d%e8%bd%ac%e5%8f%91%e9%83%a8%e5%88%86%e8%af%b7%e6%b1%82/</a></div> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">W一U情形:部分静态页面需要apache处理Q不转发l后端的tomcat<br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount  <wbr>/*  <wbr>  <wbr>router <wbr> <wbr>  <wbr>###默认所有请求{发给tomcat处理<br /> </span><span style="color: #ff0000">JKUnmount</span> <span style="color: #ff0000">/*.php  <wbr> router <wbr> <wbr>  <wbr>###phph不交ltomcat处理<br /> JKUnmount /*.htm  <wbr> router <wbr> <wbr>  <wbr>###htmh不交ltomcat处理<br /> JKUnmount /*.html  <wbr>router</span> <span style="color: #ff0000">###htmlh不交ltomcat处理</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JKUnmount  <wbr>  <wbr> /css/*  <wbr>  <wbr>  <wbr> router <wbr> <wbr>  <wbr>###cssh不交ltomcat处理<br /> JKUnmount  <wbr>  <wbr> /js/*  <wbr>  <wbr>  <wbr>  <wbr> router <wbr> <wbr>  <wbr> ###jsh不交ltomcat处理</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JKUnmount  <wbr>/image/*  <wbr> router <wbr> <wbr>  <wbr>###imageh不交ltomcat</span><span style="color: #ff0000">处理</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> <wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">W二U情形:所有请求{发到后端tomcat之后Q将不同路径定位l不同的tomcat</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /*  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> router</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /login/*  <wbr>  <wbr> tomcat1</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /shop/*  <wbr>  <wbr> tomcat2</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /buy/*  <wbr>  <wbr>  <wbr> tomcat3</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> <wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">注意Q这U情形下Q必要有这L处理Q?/span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">worker.list=router,jkstatus,tomcat1,tomcat2,tomcat3</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">如果是第一U情形,tomcat1,tomcat2,tomcat3是不需要写在上面这个地方的</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">而是写在下面Q?/span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">worker.router.balance_workers=tomcat1,tomcat2,tomcat3</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">实际使用中,应该是上qCU情形相l合使用的较多,静态内容交lapache处理Q然后将动态内容分布到不同的服务器上?br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> <wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">JkMount把匹配的转发到指定服务器.<br /> JkUnMount把匹配的不{发到指定服务?<br /> <strong>JkUnMount选项的别高于JkMount</strong>.<br /> 单独有JkMount规则有效,?strong>单独有JkUnMount无效</strong>,JkUnMount与JkMount要成对出?<br /> </p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/344325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-02-15 10:53 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache 集群tomcat配置参数说明http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344322.html疯狂疯狂Tue, 15 Feb 2011 02:37:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344322.htmlhttp://www.aygfsteel.com/freeman1984/comments/344322.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344322.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/344322.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344322.htmlTomcat 集群配置
打开Server.xmlQshutdown, ajp, httpq三个端口就不多说了Q解开下面注释
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
jvmRoute的DҎapache的配|,不能冲突?br /> 接着是最重要的一点,tomcat默认集群配置Q?lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>Q时Q配|的l节实际上被省略了,对于大多数应用而言Q用默认配|已l够,完整的默认配|应该是q样Q?

Xml代码 [url=http://tyler-zhou.javaeye.com/blog/507158]


<!--同步异步模式由channelSendOptions参数控制Q默认值是8Qؓ异步模式Q?是同步模式。在异步模式下,可以通过加上拯认QAcknowledgeQ来提高可靠性,此时channelSendOptions设ؓ10?->  
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="6">  
<!---session 拯方式 BackupManager 只拷贝部|当前应用的服务器,DeltaManager 拯方式all to all-->  
    <Manager className="org.apache.catalina.ha.session.BackupManager"  
        expireSessionsOnShutdown="false"  
        notifyListenersOnReplication="true"  
        mapSendOptions="6"/>  
    <!--   
    <Manager className="org.apache.catalina.ha.session.DeltaManager"  
    expireSessionsOnShutdown="false"  
    notifyListenersOnReplication="true"/>  
    -->  
    <!--Channel负责对tomcat集群的IO层进行配|?->  
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
        <!--Membership用于发现集群中的其他节点Q这里的address用的是组播地址QMulticast addressQ了解更多组播地址详情请参见http://zyycaesar.javaeye.com/admin/blogs/296501Q,使用同一个组播地址和端口的多个节点同属一个子集群Q因此通过自定义组播地址和端口就可将一个大的tomcat集群分成多个子集?->  
        <Membership className="org.apache.catalina.tribes.membership.McastService"  
            address="228.0.0.4"  
            port="45564"  
            frequency="500"  
            dropTime="3000"/>  
        <!--Receiver用于各个节点接收其他节点发送的数据Q在默认配置下tomcat会从4000-4100间依ơ选取一个可用的端口q行接收Q自定义配置Ӟ如果多个tomcat节点在一台物理服务器上注意要使用不同的端?->  
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
            address="auto"  
            port="5001"  
            selectorTimeout="100"  
            maxThreads="6"/>  
        <!--Sender用于向其他节点发送数据,具体实现通过Transport配置QPooledParallelSender是从tcpq接池中获取q接Q可以实现ƈ行发送,即集中的多个节点可以同时向其他所有节点发送数据而互不媄?->  
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
        </Sender>  
        <!---Interceptor有点cM下面要解释的ValveQvC个阀门的作用Q在数据到达目的节点前进行检或其他操作Q如TcpFailureDetector用于在数据的传输过E中是否发生了tcp错误?-->  
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>  
  
    </Channel>  
    <!--Valve用于在节点向客户端响应前q行或q行某些操作QReplicationValve是用于用于当前的响应是否涉及Session数据的更斎ͼ如果是则启动Session拯操作Qfilter用于qohQ如客户端对囄QcssQjs的请求就不会涉及SessionQ因此不需,默认状态下不进行过滤,监测所有的响应.JvmRouteBinderValve会在前端的Apache mod_jk发生错误时保证同一客户端的h发送到集群的同一个节?->  
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
    filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  
    <!--Deployer用于集群的farm功能Q监控应用中文g的更斎ͼ以保证集中所有节点应用的一致性,如某个用户上传文件到集群中某个节点的应用E序目录下,Deployer会监到q一操作q把q一文g拯到集中其他节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能Q不q很遗憾Qtomcat集群目前q不能做到这一点,开发h员正在努力实现它Q这里的配置只是预留了一个接?->  
    <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
        tempDir="/tmp/war-temp/"  
        deployDir="/tmp/war-deploy/"  
        watchDir="/tmp/war-listen/"  
        watchEnabled="false"/>  
  
    <!--Listener用于跟踪集群中节点发出和收到的数据,也有点类似Valve的功能?->  
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
  
</Cluster>  
最后在Web.xml里面加上<distributable/>Q官Ҏ档没有这个,但我觉得q是应该加上Q因为按照标准的tomcat启动Q当Host对象被创建时Q一个Cluster对象Q默认配|下是SimpleTcpClusterQ也同时被关联到q个Host对象。当某个应用在web.xml中设|了distributableӞTomcatؓ此应用的上下文环境创Z个DeltaManager。SimpleTcpCluster启动membership服务和Replication服务?br />
---

extra/httpd-mpm.conf 模块  

上边一L׃贴了Q主要是下边的配|,因ؓ我用?span style="font-family: Arial, 宋体, sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px">mod_security模块Q所以要做一些配|,q里不做解释了,写的很详l,我比较喜Ƣ在配置文g里把Ҏ忘记的地方写上文档。毕竟这东西配完了就不再动了Q很Ҏ忘记

# WinNT MPM

# ThreadsPerChild: constant number of worker threads in the server process

# MaxRequestsPerChild: maximum  number of requests a server process serves

#注意QThreadLimit指o应当攑֜ThreadsPerChild之前Q否则ThreadsPerChild指o生效后ThreadLimit会失效,而导致不必要的错?ThreadLimit必须大于{于ThreadsPerChild

#对于mpm_winntQThreadLimit的默认值是1920Q对于其他MPMq个值是64

#ThreadLimit q个指o讄了每个子q程可配|的U程数ThreadsPerChild上限。Q何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效?/p>

#ThreadLimit 使用q个指o时要特别当心。如果将ThreadLimit讄成一个高出ThreadsPerChild实际需要很多的|会有过多的׃n内存被分配?/p>

#如果ThreadLimit和ThreadsPerChild讄成超q系l的处理能力QApache可能无法启动Q或者系l将变得不稳定。该指o的值应当和ThreadsPerChild大致保持一?/p>

#ThreadsPerChild 每个子进E徏立的帔R的执行线E数。默认值是25。子q程在启动时建立q些U程后就不再建立新的U程了?/p>

<IfModule mpm_winnt_module>

    ThreadLimit            2000

    ThreadsPerChild        2000

    MaxRequestsPerChild    2000

</IfModule>



疯狂 2011-02-15 10:37 发表评论
]]>
提高AJAX客户端响应速度(转蝲)http://www.aygfsteel.com/freeman1984/archive/2011/02/11/344056.html疯狂疯狂Fri, 11 Feb 2011 07:23:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/11/344056.htmlhttp://www.aygfsteel.com/freeman1984/comments/344056.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/11/344056.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/344056.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344056.html提高AJAX客户端响应速度

(文:包一?/span>)

AJAX的出现极大的改变?/span>Web应用客户端的操作模式Q它使的用户可以在全心工作时不必频繁的忍受那令h厌恶的页面刷新。理ZAJAX技术在很大的程度上可以减少用户操作的等待时_同时节约|络上的数据量。而然Q实际情况却q不Lq样。用h怼抱怨用?/span>AJAX的系l响应速度反而降低了?/span>

W者从?/span>AJAX斚w的研发多q_参与开发了目前国内较ؓ成熟?/span>AJAXq_-dorado。根据笔者的l验Q导致这U结果的Ҏ原因q不?/span>AJAX。很多时候系l响应速度的降低都是由不够合理的界面设计和不够高效的编E习惯造成的。下面我们就来分析几?/span>AJAX开发过E中需要时L意的环节?/span>

合理的用客L~程和远E过E调用?/span>

客户端的~程主要都是ZJavaScript的。?/span>JavaScript是一U解释型的编E语aQ它的运行效率相对于Java{都要稍逊一{V同?/span>JavaScript又是q行在浏览器q样一个严格受限的环境当中。因此开发h员对于哪些逻辑可以在客L执行应该有一个清醒的认识?/span>

在实际的应用中究竟应该怎样使用客户端编E,q依赖于开发h员的l验判断。这里很多问题是只可意会的。由于篇q有限,在这里我们大致归U_下面q几个注意事:

可能避免频J的使用q程q程调用Q例如避免在循环体中使用q程q程调用?/span>

如果可能的话可能?/span>AJAX方式的远E过E调用(异步方式的远E过E调用)?/span>

避免重量的数据操作放|在客户端。例如:大批量的数据复制操作、需要通过大量的数据遍历完成的计算{?/span>

改进?/span>DOM对象的操作方式?/span>

客户端的~程中,?/span>DOM对象的操作往往是最Ҏ占用CPU旉的。而对?/span>DOM对象的操作,不同的编E方法之间的性能差异又往往是非常大的?/span>

以下是三D运行结果完全相同的代码Q它们的作用是在|页中创Z?/span>10x1000的表根{然而它们的q行速度却有着天壤之别?/span>

/* 试代码1 - 耗时: 41U?/span>*/

var table = document.createElement("TABLE");

document.body.appendChild(table);

for(var i = 0; i < 1000; i++){

 var row = table.insertRow(-1);

 for(var j = 0; j < 10; j++){

    var cell = objRow.insertCell(-1);

     cell.innerText = "( " + i + " , " + j + " )";

 }

}

/* 试代码2 - 耗时: 7.6U?/span> */

var table = document.getElementById("TABLE");

document.body.appendChild(table);

var tbody = document.createElement("TBODY");

table.appendChild(tbody);

for(var i = 0; i < 1000; i++){

 var row = document.createElement("TR");

 tbody.appendChild(row);

 for(var j = 0; j < 10; j++){

    var cell = document.createElement("TD");

     row.appendChild(cell);

     cell.innerText = "( " + i + " , " + j + " )";

 }

}

/* 试代码3 - 耗时: 1.26U?/span> */

var tbody = document.createElement("TBODY");

for(var i = 0; i < 1000; i++){  

 var row = document.createElement("TR");

       for(var j = 0; j < 10; j++){

    var cell = document.createElement("TD");

     cell.innerText = "( " + i + " , " + j + " )";

     row.appendChild(cell);

 }

 tbody.appendChild(row);

}

var table = document.getElementById("TABLE");

table.appendChild(tbody);

document.body.appendChild(table);

q里?#8220;试代码1”?#8220;试代码2”之间的差别在于在创徏表格单元时用了不同?/span>APIҎ。?#8220;试代码2”?#8220;试代码3之间的差别在于处理顺序的略微不同?/span>

“试代码1”?#8220;试代码2”之间如此大的性能差别我们无从分析Q目前所知的?/span>insertRow?/span>insertCell?/span>DHTML中表格特有的APIQ?/span>createElement?/span>appendChild?/span>W3C DOM的原?/span>API。而前者应该是对后者的装。不q,我们q不能因此而得出结?/span>DOM的原?/span>APIL优于对象Ҏ?/span>API。徏议大家在需要频J调用某一APIӞ对其性能表现做一些基本的试?/span>

“试代码2”?#8220;试代码3”之间的性能差异主要来自于他们的构徏序不同?#8220;试代码2”的做法是首先创徏最外层?/span><TABLE>对象Q然后再在@环中依次创徏<TR>?/span><TD>。?#8220;试代码3”的做法是首先在内存中由内到外的构建好整个表格Q最后再它d到网中。这样做的目的是可能的减少览器重新计页面布局的次数。每当我们将一个对象添加到|页中时Q浏览器都会试寚w面中的控件的布局q行重新计算。所以,如果我们能够首先在内存中整个要构造的对象全部创徏好,然后再一ơ性的d到网中。那么,览器将只会做一ơ布局的重计算。ȝZ句话那就是越晚执?/span>appendChild好。有时ؓ了提高运行效率,我们甚至可以考虑先?/span>removeChild已存在的控件从面中移除,然后构造完成后再重新将其放|回面当中?/span>

提高字符串篏加的速度

在?/span>AJAX提交信息Ӟ我可能常帔R要拼装一些比较大的字W串通过XmlHttp来完?/span>POST提交。尽提交这样大的信息的做法看v来ƈ不优雅,但有时我们可能不得不面对q样的需求。那?/span>JavaScript中对字符串的累加速度如何呢?我们先来做下面的q个实验。篏加一个长度ؓ30000的字W串?/span>

/* 试代码1 - 耗时: 14.325U?/span> */

var str = "";

for (var i = 0; i < 50000; i++) {

       str += "xxxxxx";

}

q段代码耗时14.325U,l果q不理想。现在我们将代码改ؓ如下的Ş式:

/* 试代码2 - 耗时: 0.359U?/span> */

var str = "";

for (var i = 0; i < 100; i++) {

       var sub = "";

       for (var j = 0; j < 500; j++) {

              sub += "xxxxxx";

       }

       str += sub;

}

q段代码耗时0.359U!同样的结果,我们做的只是首先D一些较的字符串然后再l装成更大的字符丌Ӏ这U做法可以有效的在字W串D的后期减内存复制的数据量。知道了q一原理之后我们q可以把上面的代码进一步拆散以后进行测试。下面的代码仅耗时0.140U?/span>

/* 试代码3 - 耗时: 0.140U?/span> */

var str = ""; 

for (var i1 = 0; i1 < 5; i1++) {

       var str1 = "";

       for (var i2 = 0; i2 < 10; i2++) {

              var str2 = "";

              for (var i3 = 0; i3 < 10; i3++) {

                     var str3 = "";

                     for (var i4 = 0; i4 < 10; i4++) {

                            var str4 = "";

                            for (var i5 = 0; i5 < 10; i5++) {

                                   str4 += "xxxxxx";

                            }

                            str3 += str4;

                     }

                     str2 += str3;

              }

              str1 += str2;      

       }

       str += str1; 

}

不过Q上面这U做法也许ƈ不是最好的Q如果我们需要提交的信息?/span>XML格式的(其实l大多数情况下,我们都可以设法将要提交的信息l装?/span>XML格式Q,我们q能扑ֈ更高效更优雅的方?/span>?span style="font-family: 宋体">利用DOM对象为我们组装字W串。下面这D代买组装一个长度ؓ950015的字W串仅须耗时0.890U?/span>

/* 利用DOM对象l装信息 - 耗时: 0.890U?/span> */

var xmlDoc; 

if (browserType == BROWSER_IE) {

       xmlDoc = new ActiveXObject("Msxml.DOMDocument");

}

else {

       xmlDoc = document.createElement("DOM");

}

var root = xmlDoc.createElement("root");

for (var i = 0; i < 50000; i++) {

       var node = xmlDoc.createElement("data");

       if (browserType == BROWSER_IE) {

              node.text = "xxxxxx";

       }

       else {

              node.innerText = "xxxxxx";

       }

       root.appendChild(node);

}

xmlDoc.appendChild(root);

var str;

if (browserType == BROWSER_IE) {

       str = xmlDoc.xml;

}

else {

       str = xmlDoc.innerHTML;

}

避免DOM对象的内存泄漏?/span>

关于IE?/span>DOM对象的内存泄露是一个常常被开发h员忽略的问题。然而它带来的后果却是非怸重的Q它会导?/span>IE的内存占用量持箋上升Qƈ且浏览器的整体运行速度明显下降。对于一些泄露比较严重的|页Q甚臛_要刷新几ơ,q行速度׃降低一倍?/span>

比较常见的内存泄漏的模型?#8220;循环引用模型”?#8220;闭包函数模型”?#8220;DOM插入序模型”,对于前两U泄漏模型,我们都可以通过在网|构时解除引用的方式来避免。而对?#8220;DOM插入序模型”则需要通过改变一些惯有的~程习惯的方式来避免?/span>

有关内存泄漏的模型的更多介绍可以通过Google很快的查刎ͼ本文不做q多的阐q。不q,q里我向您推荐一个可用于查找和分析网内存泄露的工?/span>?span style="font-family: 'Verdana', 'sans-serif'">DripQ目前的较新版本?/span>0.5Q下载地址?/span>http://outofhanwell.com/ieleak/index.php

复杂面的分D装载和初始?/span>

对系l当中某些确实比较复杂而又不便使用IFrame的界面,我们可以对其实施分段装蝲。例如对于多|{界面Q我们可以首先下载和初始化多|{默认,然后利用AJAHQ?/span>asynchronous JavaScript and HTMLQ技术来异步的装载其他标{N中的内容。这样就能保证界面可以在W一旉首先展现l用戗把整个复杂界面的装载过E分散到用户的操作过E当中?/span>

利用GZIP压羃|络量?/span>

除了上面提到的这些代码的改良之外,我们q可以利?/span>GZIP来有效的降低|络量。目前常见的L览器已l全部支?/span>GZIP法Q我们往往只需要编写少量的代码可以支?/span>GZIP了。例如在J2EE中我们可以在Filter中通过下面的代码来判断客户端浏览器是否支持GZIP法Q然后根据需要利?/span>java.util.zip.GZIPOutputStream来实?/span>GZIP的输出?/span>

/* 判断览器对GZIP支持方式的代?/span> */

private static String getGZIPEncoding(HttpServletRequest request) {

 String acceptEncoding = request.getHeader("Accept-Encoding");

 if (acceptEncoding == null) return null;

 acceptEncoding = acceptEncoding.toLowerCase();

 if (acceptEncoding.indexOf("x-gzip") >= 0) return "x-gzip";

 if (acceptEncoding.indexOf("gzip") >= 0) return "gzip";

 return null;

}

一般而言Q?/span>GZIP对于HTML?/span>JSP的压~比可以辑ֈ80%左右Q而它造成的服务端和客L的性能损耗几乎是可以忽略的。结合其他因素,支持GZIP的网站有可能为我们节U?/span>50%的网l流量。因?/span>GZIP的用可以ؓ那些|络环境不是特别好的应用带来显著的性能提升。?/span>Http的监视工?/span>Fiddler可以方便的检出|页在?/span>GZIP前后的通讯数据量?/span>Fiddler的下载地址?/span>http://www.fiddlertool.com/fiddler/

关于Web应用的性能优化其实是一个非常大的话题。本文由于篇q有限,只能涉及其中的几个细节,q且也无法将q些l节的优化方式全面的展现l大家。期望本文能够引起大家对Web应用其是客L性能优化的充分重视。毕竟服务端~程技巧已为大家熟知多q_在服务端挖掘性能的潜力已l不大了。而在客户端的Ҏ改进往往能够得到令h惊奇的性能提升?/span>



疯狂 2011-02-11 15:23 发表评论
]]>
架构永远都没有最好的Q只有最合适的http://www.aygfsteel.com/freeman1984/archive/2010/11/01/336688.html疯狂疯狂Mon, 01 Nov 2010 07:36:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/11/01/336688.htmlhttp://www.aygfsteel.com/freeman1984/comments/336688.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/11/01/336688.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/336688.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/336688.html
    软g架构的选择和设计ƈ不是很容易做出的Q一个成功的软g架构取决于N多的因素QY件架构这个词向来是最为模p的一个词Q个Y件架构实在是个很大的话题Q业界一直采用的形象比喻是房子时的房屋l构图,以Y件的角度来说QY件架构应臛_包括软g开发时使用什么语a、Ş成Y件开发时可运行的核心基础框架、Y件应用模块的设计Q包括模块内聚的功能、对外提供的服务{)、Y件测试的Ҏ、Y仉|的Ҏ以及团队开发的ҎQ那么怎么来选择和设计Y件架构呢Q其衡量的因素是什么呢Q个为其中质量和快速是衡量软g架构的选择和设计是否成功的两个最重要的因素?br /> Z么说质量和快速是两个最重要的因素呢Q首先来看看q里的质量和快速分别包含了什么内容:
质量
软g的质量是软g能否成功的非帔R帔R要的因素Q就个h看来QY件质量应包括软g功能性需求的实现、Y仉功能性需求的实现?br /> 软g功能性需求中最重要的就是要定对于客户而言商业价值最高的部分是什么,q一对于Y件架构而言的媄响是软g应用模块的设计上Q而Y件应用模块的设计呢,通常要取决于可运行的核心基础框架的设计和实现上;
软g非功能性需求则通常会包含很多要素,像Y件灵zL、可扩展性、高响应{,在这些众多的要素中同栯选择出对于目前Y件最重要的要素是什么,q会影响到Y件架构中的Y件开发语a的选择、可q行的核心基框架?br /> 软g的质量还有需要考虑的要素就是Y件测试的Ҏ了(q也会媄响到选择什么语a来开发YӞQ这点对于Y件质量而已Q无疑是非常重要的一炏V?br /> 快?br /> 软g能否快速开发完成也已经成ؓ了Y件能否成功的重要因素Q快速开发完成的意思非常容易理解,但它其实很大的程度媄响到了Y件架构的选择和设计,很明昄它将影响到Y件开发用什么语a、Y件开发时可运行的核心基础框架、Y仉|的Ҏ以及团队开发的Ҏ{等Q团队中的h很大E度上决定了软g开发时使用什么语aQ这个时候也要注意,其实什么语a会媄响到开发的速度、开发的质量{,例如erLang的设计目标是Z可构建容错的pȝ、c则更适合从底层控制整个系l的交互、java具备丰富的基库、业界资源和更适合复杂业务的需求)Q至于核心基框架、部|的Ҏ、团队开发的Ҏ的设计都是ؓ了快速这个目标的?br /> 从上面的两个因素我们可以看到Q要使得软g高质量且快速的完成QY件架构在选择和设计上旉帔R要的是寻扑ֈ一U^衡,所以Y件架构要做到模式化其实ƈ不容易?br /> 在这里多说下别的话,其实从上面所q能看出Q去评论哪种语言会死是没有什么意义的Qƈ不会有一U语a攑֜M环境下都适合Q就像在互联|网站的上,我想可能很多人都会选择php+c或类似的语言体系Q但大家其实可以仔细L惻I是不是网站的上一定要q样的两U语a才能承担互联|的高ƈ发等需求呢Q或怽更应该做的是从该|站最重要的非功能性需求、团队等{因素来考虑Q就像如果你的团队是java性质的团队,而网站最重要的非功能性需求又是支持业务的灉|性的话,那么我会觉得cq样的过E化语言l对不是q种情况下的最佳选择Q而java却是q种情况下的最佳选择Q可能很多h会说java太慢呀Q什么的Q其实ƈ不尽Ӟ很多时候靠g以及优秀的架构完全可以I补掉java比cq样的程序运行相Ҏ慢的毛病Q?)Q这也算是给java的一个^反吧Q呵呵,毕竟java相对c而言q有更大的好处那是javaE序的开发无Z质量q是快速开发上肯定ZcQ我q样说ƈ不是说一定要选择javaQ我只是惌明应该根据什么样的情冉|选择和设计什么样的架构,那才是最合理的,所以架构永q都没有最好的Q只有最合适的Q而这也是架构师最隑ց的原因,架构师在做架构的设计和选择旉循的出发点就是保证Y仉质量且快速的完成?nbsp; 


 转蝲自:http://www.aygfsteel.com/BlueDavy/archive/2007/10/11/151907.html

疯狂 2010-11-01 15:36 发表评论
]]>
CometQ基?HTTP 长连接的“服务器推”技?/title><link>http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sun, 17 Oct 2010 15:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/335394.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/335394.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/335394.html</trackback:ping><description><![CDATA[<p>CometQ基?HTTP 长连接的“服务器推”技?br /> 2008-06-30 21:31<br /> 别: 中 <br /> ??(zhouting@cn.ibm.com), 软g工程? IBM 中国软g开发技术实验室</p> <p>2007 q?8 ?31 ?/p> <p>很多应用譬如监控、即旉信、即时报Ll都需要将后台发生的变化实时传送到客户端而无dL不停地刷新、发送请求。本文首先介l、比较了常用?#8220;服务器推”ҎQ着重介l了 Comet Q?使用 HTTP 长连接、无L览器安装插g的两U?#8220;服务器推”ҎQ基?AJAX 的长轮询方式Q基?iframe ?htmlfile 的流方式。最后分析了开?Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架Qpushlet 构徏自己?#8220;服务器推”应用?br /> “服务器推”技术的应用</p> <p> 误?Ajax 技术资源中心,q是有关 Ajax ~程模型信息的一站式中心Q包括很多文档、教E、论坛、blog、wiki 和新闅RQ?Ajax 的新信息都能在这里找到?nbsp; <br />    订阅 Ajax 相关文章和教E的 RSS 提要 <br />  </p> <p> <br />  <br /> 传统模式?Web pȝ以客L发出h、服务器端响应的方式工作。这U方式ƈ不能满很多现实应用的需求,譬如Q?/p> <p>监控pȝQ后台硬件热插拔、LED、温度、电压发生变化; <br /> x通信pȝQ其它用L录、发送信息; <br /> x报hpȝQ后台数据库内容发生变化Q?<br /> q些应用都需要服务器能实时地更新的信息传送到客户端,而无dL发出h?#8220;服务器推”技术在现实应用中有一些解x案,本文这些解x案分Zc:一c需要在览器端安装插gQ基于套接口传送信息,或是使用 RMI、CORBA q行q程调用Q而另一cd无须览器安装Q何插件、基?HTTP 长连接?/p> <p>?#8220;服务器推”应用?Web E序中,首先考虑的是如何在功能有限的览器端接收、处理信息:</p> <p>客户端如何接收、处理信息,是否需要用套接口或是使用q程调用。客L呈现l用L?HTML 面q是 Java applet ?Flash H口。如果用套接口和远E调用,怎么?JavaScript l合修改 HTML 的显C?<br /> 客户与服务器端通信的信息格式,采取怎样的出错处理机制?<br /> 客户端是否需要支持不同类型的览器如 IE、FirefoxQ是否需要同时支?Windows ?Linux q_?<br />   <br />   回页?<br />  <br /> Z客户端套接口?#8220;服务器推”技?/p> <p>Flash XMLSocket</p> <p>如果 Web 应用的用h受应用只有在安装?Flash 播放器才能正常运行, 那么使用 Flash ?XMLSocket 也是一个可行的Ҏ?/p> <p>q种Ҏ实现的基是:</p> <p>Flash 提供?XMLSocket cR?<br /> JavaScript ?Flash 的紧密结合:?JavaScript 可以直接调用 Flash E序提供的接口?<br /> 具体实现ҎQ在 HTML 面中内嵌入一个用了 XMLSocket cȝ Flash E序。JavaScript 通过调用?Flash E序提供的套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很Ҏ地控?HTML 面的内ҎC?/p> <p>关于如何L建充当了 JavaScript ?Flash XMLSocket 桥梁?Flash E序Q以及如何在 JavaScript 里调?Flash 提供的接口,我们可以参?AFLAXQAsynchronous Flash and XMLQ项目提供的 Socket Demo 以及 SocketJSQ请参见 参考资源)?/p> <p>Javascript ?Flash 的紧密结合,极大增强了客L的处理能力。从 Flash 播放?V7.0.19 开始,已经取消?XMLSocket 的端口必d?1023 的限制。Linux q_也支?Flash XMLSocket Ҏ。但此方案的~点在于Q?/p> <p>客户端必d?Flash 播放器; <br /> 因ؓ XMLSocket 没有 HTTP 隧道功能QXMLSocket cM能自动穿q防火墙Q?<br /> 因ؓ是用套接口Q需要设|一个通信端口Q防火墙、代理服务器也可能对?HTTP 通道端口q行限制Q?<br /> 不过q种Ҏ在一些网l聊天室Q网l互动游戏中已得到广泛用?/p> <p>Java Applet 套接?</p> <p>在客L使用 Java AppletQ通过 java.net.Socket ?java.net.DatagramSocket ?java.net.MulticastSocket 建立与服务器端的套接口连接,从而实?#8220;服务器推”?/p> <p>q种Ҏ最大的不在于 Java applet 在收到服务器端返回的信息后,无法通过 JavaScript L?HTML 面的内宏V?/p> <p>  <br />   回页?<br />  <br /> Z HTTP 长连接的“服务器推”技?/p> <p>Comet ?/p> <p>览器作?Web 应用的前収ͼ自n的处理功能比较有限。浏览器的发展需要客L升软gQ同时由于客L览器Y件的多样性,在某U意义上Q也影响了浏览器新技术的推广。在 Web 应用中,览器的主要工作是发送请求、解析服务器q回的信息以不同的风格显C。AJAX 是浏览器技术发展的成果Q通过在浏览器端发送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系l,对Q何用h_可以认ؓ服务器是另外一个用戗现?AJAX 技术的发展q不能解军_一个多用户?Web 应用中,更新的信息实时传送给客户端,从而用户可能在“q时”的信息下q行操作。?AJAX 的应用又使后台数据更新更加频J成为可能?/p> <p>?1. 传统?Web 应用模型与基?AJAX 的模型之比较  <br /> “服务器推”是一U很早就存在的技术,以前在实C主要是通过客户端的套接口,或是服务器端的远E调用。因为浏览器技术的发展比较~慢Q没有ؓ“服务器推”的实现提供很好的支持Q在U浏览器的应用中很难有一个完善的Ҏd?#8220;服务器推”q用于商业程序。最q几q_因ؓ AJAX 技术的普及Q以及把 IFrame 嵌在“htmlfile“?ActiveX lg中可以解?IE 的加载显C问题,一些受Ƣ迎的应用如 meeboQgmail+gtalk 在实C使用了这些新技术;同时“服务器推”在现实应用中实存在很多需求。因些原因,ZU浏览器?#8220;服务器推”技术开始受到较多关注,Alex RussellQDojo Toolkit 的项?LeadQ称q种Z HTTP 长连接、无d览器端安装插g?#8220;服务器推”技术ؓ“Comet”。目前已l出C一些成熟的 Comet 应用以及各种开源框Ӟ一?Web 服务器如 Jetty 也在为支持大量ƈ发的长连接进行了很多改进。关?Comet 技术最新的发展状况请参考关?Comet ?wiki?/p> <p>下面介l两U?Comet 应用的实现模型?/p> <p>Z AJAX 的长轮询Qlong-pollingQ方?/p> <p>??1 所C,AJAX 的出C?JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP hQJavaScript 响应处理函数Ҏ服务器返回的信息?HTML 面的显C行更新。?AJAX 实现“服务器推”与传l的 AJAX 应用不同之处在于Q?/p> <p>服务器端会阻塞请求直到有数据传递或时才返回?<br /> 客户?JavaScript 响应处理函数会在处理完服务器q回的信息后Q再ơ发求,重新建立q接?<br /> 当客L处理接收的数据、重新徏立连接时Q服务器端可能有新的数据到达Q这些信息会被服务器端保存直到客L重新建立q接Q客L会一ơ把当前服务器端所有的信息取回?<br /> ?2. Z长轮询的服务器推模型  <br /> 一些应用及CZ?“Meebo”, “Pushlet Chat” 都采用了q种长轮询的方式。相对于“轮询”QpollQ,q种长轮询方式也可以UCؓ“?#8221;QpullQ。因U方案基?AJAXQ具有以下一些优点:h异步发出Q无d装插ӞIE、Mozilla FireFox 都支?AJAX?/p> <p>在这U长轮询方式下,客户端是?XMLHttpRequest ?readystate ?4Q即数据传输l束Q时调用回调函数Q进行信息处理。当 readystate ?4 Ӟ数据传输l束Q连接已l关闭。Mozilla Firefox 提供了对 Streaming AJAX 的支持, ?readystate ?3 Ӟ数据仍在传输中)Q客L可以d数据Q从而无d闭连接,pd处理服务器端q回的信息。IE ?readystate ?3 Ӟ不能d服务器返回的数据Q目?IE 不支持基?Streaming AJAX?/p> <p>Z Iframe ?htmlfile 的流QstreamingQ方?/p> <p>iframe 是很早就存在的一U?HTML 标记Q?通过?HTML 面里嵌入一个隐蔵Q然后将q个隐蔵帧的 SRC 属性设为对一个长q接的请求,服务器端p源源不断地往客户端输入数据?/p> <p>?3. Z方式的服务器推模型  <br /> 上节提到?AJAX Ҏ是在 JavaScript 里处?XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的L?HTML 面的显C。同L思\用在 iframe Ҏ的客LQiframe 服务器端q不q回直接昄在页面的数据Q而是q回对客L Javascript 函数的调用,?#8220;<script type="text/javascript">js_func(“data from server ”)</script>”。服务器端将q回的数据作为客L JavaScript 函数的参C递;客户端浏览器?Javascript 引擎在收到服务器q回?JavaScript 调用时就会去执行代码?/p> <p>??3 可以看到Q每ơ数据传送不会关闭连接,q接只会在通信出现错误Ӟ或是q接重徏时关闭(一些防火墙常被讄Z弃过长的q接Q?服务器端可以讄一个超时时_ 时后通知客户端重新徏立连接,q关闭原来的q接Q?/p> <p>使用 iframe h一个长q接有一个很明显的不之处:IE、Morzilla Firefox 下端的进度栏都会昄加蝲没有完成Q而且 IE 上方的图标会不停的{动,表示加蝲正在q行。Google 的天才们使用一个称?#8220;htmlfile”?ActiveX 解决了在 IE 中的加蝲昄问题Qƈ这U方法用C gmail+gtalk 产品中。Alex Russell ?“What else is burried down in the depth's of Google's amazing JavaScript?”文章中介l了q种Ҏ。Zeitoun |站提供?comet-iframe.tar.gzQ封装了一个基?iframe ?htmlfile ?JavaScript comet 对象Q支?IE、Mozilla Firefox 览器,可以作ؓ参考。(请参?参考资源)</p> <p>  <br />   回页?<br />  <br /> 使用 Comet 模型开发自q应用</p> <p>上面介绍了两U基?HTTP 长连接的“服务器推”架构Q更多描qC客户端处理长q接的技术。对于一个实际的应用而言Q系l的E_性和性能是非帔R要的。将 HTTP 长连接用于实际应用,很多l节需要考虑?/p> <p>不要在同一客户端同时用超q两个的 HTTP 长连?/p> <p>我们使用 IE 下蝲文g时会有这L体验Q从同一?Web 服务器下载文Ӟ最多只能有两个文g同时被下载。第三个文g的下载会被阻塞,直到前面下蝲的文件下载完毕。这是因?HTTP 1.1 规范中规定,客户端不应该与服务器端徏立超q两个的 HTTP q接Q?新的q接会被d。?IE 在实C严格遵守了这U规定?/p> <p>HTTP 1.1 对两个长q接的限Ӟ会对使用了长q接?Web 应用带来如下现象Q在客户端如果打开过两个?IE H口去访问同一个用了长连接的 Web 服务器,W三?IE H口?HTTP h被前两个H口的长q接d?/p> <p>所以在开发长q接的应用时Q?必须注意在用了多个 frame 的页面中Q不要ؓ每个 frame 的页面都建立一?HTTP 长连接,q样会阻塞其它的 HTTP hQ在设计上考虑让多?frame 的更新共用一个长q接?/p> <p>服务器端的性能和可扩展?/p> <p>一?Web 服务器会为每个连接创Z个线E,如果在大型的商业应用中?CometQ服务器端需要维护大量ƈ发的长连接。在q种应用背景下,服务器端需要考虑负蝲均衡和集技术;或是在服务器端ؓ长连接作一些改q?/p> <p>应用和技术的发展L带来新的需求,从而推动新技术的发展。HTTP 1.1 ?1.0 规范有一个很大的不同Q?.0 规范下服务器在处理完每个 Get/Post h后会关闭套接口连接; ?1.1 规范下服务器会保持这个连接,在处理两个请求的间隔旉里,q个q接处于I闲状态?Java 1.4 引入了支持异?IO ?java.nio 包。当q接处于I闲Ӟ个连接分配的U程资源会返q到U程池,可以供新的连接用;当原来处于空闲的q接的客户发出新的请求,会从U程池里分配一个线E资源处理这个请求?q种技术在q接处于I闲的机率较高、ƈ发连接数目很多的场景下对于降低服务器的资源负载非常有效?/p> <p>但是 AJAX 的应用h的出现变得频J,?Comet 则会长时间占用一个连接,上述的服务器模型在新的应用背景下会变得非怽效,U程池里有限的线E数甚至可能会阻塞新的连接。Jetty 6 Web 服务器针?AJAX、Comet 应用的特点进行了很多创新的改q,请参考文?#8220;AJAXQComet and Jetty”Q请参见 参考资源)?/p> <p>控制信息与数据信息用不同的 HTTP q接</p> <p>使用长连接时Q存在一个很常见的场景:客户端网需要关闭,而服务器端还处在d数据的堵塞状态,客户端需要及旉知服务器端关闭数据q接。服务器在收到关闭请求后首先要从d数据的阻塞状态唤醒,然后释放个客L分配的资源,再关闭连接?/p> <p>所以在设计上,我们需要客户端的控制h和数据请求用不同的 HTTP q接Q才能控制h不会被阻塞?/p> <p>在实CQ如果是Z iframe 方式的长连接,客户端页面需要用两?iframeQ一个是控制帧,用于往服务器端发送控制请求,控制h能很快收到响应,不会被堵塞;一个是昄帧,用于往服务器端发送长q接h。如果是Z AJAX 的长轮询方式Q客L可以异步地发Z?XMLHttpRequest hQ通知服务器端关闭数据q接?/p> <p>在客户和服务器之间保?#8220;心蟩”信息</p> <p>在浏览器与服务器之间l持一个长q接会ؓ通信带来一些不定性:因ؓ数据传输是随机的Q客L不知道何时服务器才有数据传送。服务器端需要确保当客户端不再工作时Q释放ؓq个客户端分配的资源Q防止内存泄漏。因此需要一U机制双方知道大家都在正常q行。在实现上:</p> <p>服务器端在阻塞读时会讄一个时限,时后阻塞读调用会返回,同时发给客户端没有新数据到达的心跳信息。此时如果客L已经关闭Q服务器往通道写数据会出现异常Q服务器端就会及旉放ؓq个客户端分配的资源?<br /> 如果客户端用的是基?AJAX 的长轮询方式Q服务器端返回数据、关闭连接后Q经q某个时限没有收到客L的再ơ请求,会认为客L不能正常工作Q会释放个客L分配、维护的资源?<br /> 当服务器处理信息出现异常情况Q需要发送错误信息通知客户端,同时释放资源、关闭连接?<br /> Pushlet - 开?Comet 框架</p> <p>Pushlet 是一个开源的 Comet 框架Q在设计上有很多值得借鉴的地方,对于开发轻量?Comet 应用很有参考h倹{?/p> <p>观察者模?/p> <p>Pushlet 使用了观察者模型:客户端发送请求,订阅感兴的事gQ服务器端ؓ每个客户端分配一个会?ID 作ؓ标记Q事件源会把C生的事g以多播的方式发送到订阅者的事g队列里?/p> <p>客户?JavaScript ?/p> <p>pushlet 提供了基?AJAX ?JavaScript 库文件用于实现长轮询方式?#8220;服务器推”Q还提供了基?iframe ?JavaScript 库文件用于实现流方式?#8220;服务器推”?/p> <p>JavaScript 库做了很多封装工作:</p> <p>定义客户端的通信状态:STATE_ERROR、STATE_ABORT、STATE_NULL、STATE_READY、STATE_JOINED、STATE_LISTENINGQ?<br /> 保存服务器分配的会话 IDQ在建立q接之后的每ơ请求中会附上会?ID 表明w䆾Q?<br /> 提供?join()、leave()、subscribe()?unsubsribe()、listen() {?API 供页面调用; <br /> 提供了处理响应的 JavaScript 函数接口 onData()、onEvent()… <br /> |页可以很方便地使用q两?JavaScript 库文件封装的 API 与服务器q行通信?/p> <p>客户端与服务器端通信信息格式</p> <p>pushlet 定义了一套客户与服务器通信的信息格式,使用 XML 格式。定义了客户端发送请求的cdQjoin、leave、subscribe、unsubscribe、listen、refreshQ以及响应的事gcdQdata、join_ack、listen_ack、refresh、heartbeat、error、abort、subscribe_ack、unsubscribe_ack?/p> <p>服务器端事g队列理</p> <p>pushlet 在服务器端?Java Servlet 实现Q其数据l构的设计框架仍可适用?PHP、C ~写的后台客L?/p> <p>Pushlet 支持客户端自己选择使用、拉Q长轮询Q、轮询方式。服务器端根据客户选择的方式在d事g队列QfetchEventsQ时q行不同的处理?#8220;轮询”模式?fetchEvents() 会马上返回?#8221;?#8220;?#8221;?#8220;模式使用d的方式读事gQ如果超Ӟ会发l客L发送一个没有新信息收到?#8220;heartbeat“事gQ如果是“?#8221;模式Q会?#8220;heartbeat”?#8220;refresh”事g一起传l客LQ通知客户端重新发求、徏立连接?/p> <p>客户服务器之间的会话理</p> <p>服务端在客户端发?join hӞ会ؓ客户端分配一个会?IDQ?q传l客LQ然后客L通过此会?ID 标明w䆾发出 subscribe ?listen h。服务器端会为每个会话维护一个订阅的主题集合、事仉列?/p> <p>服务器端的事件源会把C生的事g以多播的方式发送到每个会话Q即订阅者)的事仉列里?/p> <p>  <br />   回页?<br />  <br /> 结</p> <p>本文介绍了如何在现有的技术基上选择合适的Ҏ开发一?#8220;服务器推”的应用,最优的Ҏq是取决于应用需求的本n。相对于传统?Web 应用Q?目前开?Comet 应用q是h一定的挑战性?/p> <p>“服务器推”存在q泛的应用需求,Z?Comet 模型适用于大规模的商业应用,以及方便用户构徏 Comet 应用Q最q几q_无论是服务器q是览器都出现了很多新技术,同时也出C很多开源的 Comet 框架、协议。需求推动技术的发展Q相?Comet 的应用会变得?AJAX 一h及?/p> <p>参考资?</p> <p>学习 <br /> developerWorks 文章“ 面向 Java 开发h员的 Ajax: 使用 Jetty ?Direct Web Remoting ~写可扩展的 Comet 应用E序”Q受异步服务器端事g驱动?Ajax 应用E序实现较ؓ困难Q本文介l了一U结合?Comet 模式?Jetty 6 Continuations API 的解x法?<br /> “Comet: Low Latency Data for the Browser”QAlex Russell ?Dojo Toolkit 的项目主和 Dojo Foundation 的主席,他在q篇博客文章中提Z Comet q个术语?<br /> “What else is burried down in the depth’s of Google’s amazing JavaScript?”QAlex RusselQ?006 q?2 月)QAlex 在这文章里介绍了如何?#8220;htmlfile”ActiveX 控g解决 iframe h长连接时 IE 的加载显C问题?<br /> Comet wikiQ提供了很多开?Comet 框架的链接?<br /> JettyQJetty 是一U开源的Z标准?Web 服务器,完全使用 Java 语言实现?<br /> “Ajax, Comet and Jetty”QGreg WilkinsQWebtideQ?006 q?1 月)QWilkins 的这份白皮书讨论了扩?Ajax q接?Jetty 架构Ҏ?<br /> ContinuationsQ了解更多关?Jetty ?Continuations Ҏ的信息?<br /> “pushlet”Q开?comet 框架Q用了观察者模型。浏览器端提供了Z AJAX ?iframe ?JavaScript 库,服务器端使用 Java Servlet?<br /> “How to implement COMET with PHP”Q提供的 comet-iframe.tar.gz 使用 iframe/htmlfile 装了一?JavaScript comet 对象Q支?IE、Mozilla Firefox 览器?<br /> “AFLAX”QAsynchronous Flash and XMLQ提供了强大?Flash、Javascript 库和很多范例?<br /> developerWorks Ajax 技术资源中心:能找到更多关?Ajax 技术的文章和教E?<br /> developerWorks Web 开发技术专区:提供了关?Web 开发和架构斚w的大量文章?<br /> developerWorks Java 技术专区:提供了关?Java ~程各个斚w的数癄文章?<br /> 览 技术书店,查阅有关本文所qC题以及其他技术主题的书籍?nbsp; </p> <p><br />  </p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/335394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2010-10-17 23:45 <a href="http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g SQL 优化再学?/title><link>http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sun, 10 Oct 2010 15:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/334235.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/334235.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/334235.html</trackback:ping><description><![CDATA[<p> </p> <p>?i?0gQOracle不断q化自己的SQL TuningQ一些秘c的优化口诀已经失效?br />    但我喜欢失效Q不用记口诀Q操个Toad for Oracle Xpert Q按照大方向舒舒服服的调优才是爱做的事情?/p> <p>1.Excution Plan<br />      Excution Plan是最基本的调优概念,不管你的调优吹得如何天花乱堕Q结果还是要由Excution plan来显COracle 最l用什么烦引、按什么顺序连接各表,Full Table Scanq是Access by Rowid IndexQ瓶颈在什么地斏V如果没有它的指|一切调优都是蒙的?/p> <p><br /> 2.Toad for Oracle Xpert<br />     用它来调优在真的好舒服。Quest 吞ƈ了Lecco后,它整合CToad 的SQL Tunning里面Q最清晰的执行计划显C,自动生成N条等价SQL、给Z化徏议,不同SQL执行计划的对比,q有实际执行的逻辑诅R物理读数据{等一目了然?/p> <p><br /> 3.索引<br />    大部分的性能问题其实都是索引应用的问题,Where子句、Order By、Group By 都要用到索引?br />    一般开发h员认为将索引建全了就可以下班回家了,实则q有颇多的思量和陷阱?/p> <p>3.1 索引列上不要q行计算<br />       q是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。烦引失效的原因也简单,索引是针对原值徏的二叉树Q你列?3/4+2折腾一番后Q原来的二叉树当然就用不上了。解决的Ҏ:<br />   1. 换成{h语法Q比如trunc(order_date) 换成</p> <p>where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1  2.    特别徏立函数烦?/p> <p>create index Q_XXXX on shop_order(trunc(order_date))    3.    计从{号左边Ud双<br />  q是针对某些无心之失的纠正,把a*2>4 改ؓa>4/2Q把TO_CHAR(zip) = '94002' 改ؓzip = TO_NUMBER('94002');</p> <p>3.2 CBO与烦引选择?br />      Z索引也不一定会被Oracle用的Q就像个挑食的孩子。基于成本的优化?CBO, Cost-Based Optimizer)Q会先看看表的大,q有索引的重复度Q再军_用还是不用。表中有100 条记录而其中有80 个不重复的烦引键? q个索引的选择性就?0/100 = 0.8Q留意Toad里显C烦引的Selective和Cardinailty。实在不听话Ӟp用hints来调教?br />      另外Qwhere语句存在多条索引可用Ӟ只会选择其中一条。所以烦引也不是多好Q)</p> <p>3.3 索引重徏<br />      传说中数据更新频J导致有20%的碎片时QOracle׃攑ּq个索引。宁可信其有之下Q应该时常alter index <INDEXNAME> rebuild一下?/p> <p>3.4 其他要注意的地方<br />       不要使用NotQ如goods_no != 2Q要改ؓ</p> <p>where goods_no>2 or goods_no<2      不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改?/p> <p>WHERE DEPT_CODE >=0;3.5 select 的列如果全是索引列时<br />    又如果没有where 条gQ或者where条g全部是烦引列ӞOracle 直接从索引里获取数据而不去读真实的数据表Q这样子理论上会快很多,比如</p> <p>select order_no,order_time from shop_order where shop_no=4当order_no,order_time,shop_no q三列全为烦引列Ӟ你将看到一个和qx完全不同的执行计划?/p> <p>3.6 位图索引<br />      传说中当数据D,比如某些表示分类、状态的列,应该Z囄引而不是普通的二叉树烦引,否则效率低下。不q看执行计划Q这些位囄引鲜有被Oracle临幸的?br />   </p> <p><br /> 4.减少查询往q和查询的表<br /> q也是很单的大道理,E序与Oracle交互的成本极高,所以一个查询能完成的不要分开两次查,如果一个@环执行1万条查询的,怎么都快不到哪里M?/p> <p>4.1 装PL/SQL存储q程<br />   最高的做法是把@环的操作装到PL/SQL写的存储q程里,因ؓ存储q程都在服务端执行,所以没有数据往q的消耗?/p> <p><br /> 4.2 装PL/SQL内部函数<br />   有机会,一些查询封装到函数里,而在普通SQL里用这些函敎ͼ同样是很有效的优化?/p> <p>4.3 Decode/Case<br />   但存储过E也ȝQ所以有case/decode把几条条件基本相同的重复查询合ƈZ条的用法Q?/p> <p>SELECT<br />  COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,<br />  COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,<br />  COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high<br /> FROM products;4.4 一UWhere/Update语法</p> <p>SELECT TAB_NAME FROM TABLES<br /> WHERE (TAB_NAME,DB_VER) = Q? SELECT TAB_NAME,DB_VER)<br /> FROM TAB_COLUMNS WHERE VERSION = 604)</p> <p>UPDATE EMP<br /> SET (EMP_CAT, SAL_RANGE)<br /> = (SELECT MAX(CATEGORY)FROM EMP_CATEGORIES)<br /> 5.其他优化<br /> 5.1RowID和ROWNUM<br />      qHibernate 新版也支持ROWID了,证明它非常有用。比如号U删除重复数据的最快写法:</p> <p>DELETE FROM EMP E<br /> WHERE E.ROWID > (SELECT MIN(X.ROWID)<br /> FROM EMP X<br /> WHERE X.EMP_NO = E.EMP_NO);6.l极U技 - Hints<br />    q是Oracle DBA的玩P也是l极武器Q比如Oracle在CBO,RBO中所做的选择M合自己心水时Q可以用它来强力调教一下OracleQ结果经常让人喜出望外?br />    如果开发h员没那么多时间来专门学习它,可以依靠Toad SQL opmitzer 来自动生成这些提C,然后Ҏ一下各U提C的实际效果。不q随着10g的进化,hints的惊喜少了?/p> <p>7. 扑և要优化的Top SQL<br />     了q么久的枪,如果找不到敌人是仉L事情?br />     q怺10gq方面做得非常好。进入Web理界面Q就能看到当前或者Q意一天的SQL列表Q按性能排序?br />     有了它,SQL Trace和TKPROF都可以不用了?/p> <p><br /> 本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/calvinxiu/archive/2005/11/15/529756.aspx</p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/334235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2010-10-10 23:52 <a href="http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软g构架师的特点http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334233.html疯狂疯狂Sun, 10 Oct 2010 15:45:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/10/10/334233.htmlhttp://www.aygfsteel.com/freeman1984/comments/334233.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/10/10/334233.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/334233.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/334233.html来自?Rational EdgeQ在电媄制作术语中,软g目l理被称作制作hQ因Z们决定需要做什么事情。而Y件构架师是导演Q他来决定所作的事情是否正确Qƈ且他要保证品符合投资h的要求。下面这文章就是描qY件构架师的?/blockquote>

 q篇文章是关于Y件构架的pd文章Q共四篇Q中的第二篇。上个月Q?a target="_blank">q个pd文章中的W一?/a>l构架作了一个定义。因此现在我们可以把注意力集中到创徏构架的h员——构架师w上。Y件构架师被证明是软g开发项目过E中最h战性的角色。Y件构架师是项目的技术领袖,q且从技术角度来Ԍ他承担了目成|的责仅R?/em>

下面是电气及电子工程师协会给“构架?#8221;做的定义Q?/em>

[构架师是]负责pȝ构架的hQ团队或者组l?a href="#notes"> 1

作ؓ目的技术主,构架师的技术需要非常的q泛Q这比技术深度更加重要(当然构架师在特定的领域需要一定的技术深度)?/em>

软g构架师是技术主?/span>

首先QY件构架师是技术主,q意味着除了他要有技术上的技能外Q还要有很好的领导才能。构架师的领D力在团队中和目质量控制中v着十分重要的作用?/p>

在团队中Q构架师是项目的技术ȝQ他需要有丰富的知识背景,以便作出技术上的决定。相对于构架师来_目l理是来理目的资源,旉q度和花费的。用电影制作来做类比的话,目l理是制片人(他要定工作被完成了Q,而构架师是导演(他需要确定工作被正确的完成)。由于他们在目中所处的位置Q构架师和项目经理是公众人物Q在一个团队中Q他们是整个目所涉及的所有h员的联系枢纽。构架师应该为徏立Y件构架争取投资,q且要明徏立Y件构架能l组l带来的价倹{?/p>

构架师还要把团队l织在构架周_q且要积极地投入到计划活动上Q因把构架{化成为完成Q务的先后序Q这h能及时地定在什么位|需要什么技术。有一炚w要注意,׃构架师能否成功与团队的整体水qx很大关系Q所以构架师应该参与团队新成员录用的面试?/p>

Ҏ构架师所拥有的能力,他可以同时参与其他团队的工作。构架师需要根据具体的实例情况来做领导军_Qƈ且在军_q程中要展现够的自信。一个成功的构架师是以h为导向的Qƈ且像一个教l一L他的团队安排工作旉。这对于组的成员来说是有好处的Q他们可以及时得到帮助。这是整个团队的一个巨大胦富?/p>

构架师还要把_֊攑֜切实工作的交付上Q他是技术方面的推进力量。构架师需要做军_Q经帔R要在压力下做军_Q,q且要保证这些决定是l过成员之间的交的Qƈ且确保它能够执行?/p>

架构师可能是有一个小l来完成?/span>

下面介绍一个h和一个角色的区别。一个h可以扮演很多角色Q例如,Mary是一个开发h员,同时也是一个测试h员)Q同Ӟ一个角色可以有很多的h扮演Q例如,Mary和John都是试人员Q。构架师的角色需要非常广泛的技术,q就Z么构架师的角色经常是很多人同时担当。这样可以技术知识在组中传播开来,每一个h都把他的或者她的经验带到工作中。特别是当某U技术同时被商业部门和技术小l理解的时候,q项技术就会最大程度的传播开来。小l所作的l果Q需要被"q? 贯穿整个文章的术?构架?Q是指的一个h或者整个小l的成员?/p>

[一个小l]是一些拥有各U技术的人的集合Q他们之间有共同需要完成的目标Qƈ且之间相互负责Q?/em> 2

如果一个小l来担当构架师的角色Q那么就需要有一个h作ؓq些构架师的领导Q他要拥有整体的前景Qƈ且需要调节构架师组之间的问题。如果没有这U调节,构架师小l成员之间就会存在危险,他们可能不会建立Z个紧密地构架或者决{不会被成功的完成?/p>

现在有一个新的概念在构架师小l中被提出:Z使成员之间达到共同的目的和目标,团队为构架师组建立q发布了一个章E?a href="#notes"> 3

好的构架师知道自q强项和弱点在哪里。无论构架师的角色被一个hq是一个小l担当,他们背后都有"值得信赖的顾?的支持。他们可以通过和其他构架师协同工作来I补自w在某些技术方面的不。最好的构架通常是被一个构架师组建立的,而不是一个h。原因很单,一个小l的力量总要比一个h的知识丰富的多?/p>

构架师小l的概念有一个缺P他们有时被团队中的其他h认ؓ是在"象牙?里工作,因ؓ他们的品经常是很有智慧的但却没有用h倹{这U误解可以从开始就把它减到最:1)保所有的涉众都能U极地协商,2)不断的交构架和它的价|3)在执行过E中要有l织{略的意识?/p>

构架师应该理解Y件开发过E?/span>

构架师应该对软g开发过E有正确的估计,因ؓq个q程保组中的所有成员用同{的方式工作。一个好的过E需要定义各个角色的工作承担责QQ?产品的徏立,不同角色之间的协同工作等{。由于构架师每天的工作都需要和很多组成员打交道,所以对于他们来说了解工作的职责是非帔R要的。在每天的工作中Q开发小l经常要扑ֈ构架师,了解该做什么工作以及怎么d。这是软g构架师和目l理之间的细微差别?/p>

软g构架师需要有商业领域的知?/span>

管拥有了丰富的软g开发经验,但是我们q期望(或者是要求Q构架师拥有一定商业领域的知识?/p>

[一个领域]是在一个范围内工作的从业h员用一pd特定的概念和术语来表达这个领域内的知识?/em> 4

q种知识会使构架师更好的理解系l的需求,q把_֊投n于其中,保pȝ的需求是合适的——例如,从构架师领域的角度出发,需求是要被准确捕获的。经怼出现q样的情况,一个特定系列的构架样式可以被应用到与它相联pȝ一个特定的领域中。如果构架师知道q种映射关系Q那么对他的工作是很大的帮助?/p>

因此Q一个好的构架师会在Y件开发和商业领域的知识上面做出权衡。如果一个构架师h很好的Y件开发经验但是不了解商业领域Q那么他的解x案可能不会解军_际的问题Q而仅仅只能反映出构架师是多么_N他的专业?/p>

另外一个构架师需要精通商业领域知识的原因是,构架师要能够预见软g构架随时可能出现的变化。由于Y件构架受它被配置的环境的影响非常大,所以对商业领域有正理解的构架师,可以从Y件构架的角度Q对不断变化的情况做出更有远见的决策。例如,如果构架师发觉哪U新的标准在未来很可能成Z,那么他将会自己的Y件构架在可用寿命内符合这U标准?/p>

软g构架师应该拥有技术知?/span>

软g构架的一个特定方面需要有一定的专业知识Q因此一个构架师必须具备q个水^的知识才能够胜Q他的工作。可是构架师不必成ؓ技术专Ӟq体Cq篇文章W一部分的思想——构架师宏观上的决策。因此,构架师只需要了解宏观上的问题,而不必关心细节化的事情。由于技术的变化q于频繁Q所以构架师要随时与q些变化保持同步?/p>

软g构架师应该拥有很好的设计技?/span>

虽然软g构架q不仅仅是设计,但是设计无疑是很重要的一个组成部分。构架师应该拥有很好的设计技巧,因ؓ软g的构架包含整个Y件的关键性设计决{。这U决定包括Y件主要结构的设计决策Q特定部分的选择以及指导的说明文档等{。ؓ了确保系l构架的完整性,上面那些要素都要被特别的应用到设计中Q这Ҏ个系l的成功完成有很大的作用。因此这些要素需要有固定的拥有设计技巧的人来负责——这个h是构架师?/p>

软g构架师需要拥有很好的E序设计技?/span>

开发h员是整个目开发过E中最重要的一个小l之一Q构架师要随时和他们保持联系。毕竟他们要保软g在最后交付用的时候能够成功的执行。如果构架师认ؓ开发h员的工作是十分有价值的Q那么他们之间的交流会很有效用。因此,软g构架师需要拥有一定的E序设计技术,即不需要他们编写程序?/p>

大多数成功的构架师,在一些场合中都是核心E序员,q些场合通常是他们的职业方向。即使是技术发展了Q有新的E序语言出现Q一个好的构架师可以把以前学q的设计语言的概念和新的语言联系hQ以辑ֈҎ语言更加深入的了解。没有这U知识,软g构架师就不能寚w要执行的构架的重要元素做出完的决策Q例如执行的l织和程序标准的采用。这会的Y件构架师和开发h员之间生沟通上的障?/p>

构架师是一个很好的沟通员

和以上提到的几种技术比hQ构架师的沟通能力是最重要的。构架师需要精通所有的沟通手D,特别是需要有一定的语言能力Q包括说Q写和演讲能力。交是双向的,所以构架师q需要是一个很好的聆听者与观察者?/p>

组成员之间有效的沟通是目成功的基本条件。ؓ了更好的理解投资人的需求,与他们的沟通显得尤为重要,同时q能够让所有的投资人在软g构架上达成共识。与目组的沟通同时也很重要,因ؓ构架师的职责不单单是把信息传辄组Q同时还要激׃们工作。构架师q要负责把系l的构想传达l小l成员,使得它们让全lh员了解,而不仅仅是构架师自己理解?/p>

构架师需要做出决{?/span>

构架师不能在自己不了解的环境中做出决{,然而项目的开发周期也没有l他提供充的时间去探烦所有的环境Q所以在很大的压力下做的决策不太可能成功。这U环境是被期望的Q成功的构架师非常满意这U环境,而不愿去改变它。因此构架师需要是厚脸皮的Q因Z们很可能在项目开发过E中更正自己的决定,q且按原路返回查N题。正如Philippe Kruchten所说的Q?#8220;软g构架师的一生是一个O长的Q在黑暗中不断摸索ƈ不断改进自己的决定的q程”?a href="#notes"> 5

一个糟p的决策很可能毁掉一个项目。项目小l中的其他成员会Ҏ架师失去信心Q这旉目经理就要参与进来,因ؓ{待构架的完善不会让目有所q展。最危险的情冉|Q如果构架师没有把自q决策文档化,那么组的其它成员可能会自己制定决策Q而这U决定很可能是错误的?/p>

软g构架师需要觉察组l的政策

一个成功的构架师不会只兛_技术问题,他们q会兛_l织的权力动向,时刻了解团队的决定权在哪里。这可以保证他们正在和正的论项目的决策问题。忽略团队的权力是天真的x。现实往往是这LQ团队经怼目组在规定时间交付系l,q需要构架师正确的评估到q个旉?/p>

软g构架师是一个谈判代?/span>

Z了解软g构架的很多尺度问题,构架师需要随时和投资人沟通。这U沟通常帔R要谈判技巧。例如,构架师需要特别注意的一件事是:最化目中可能出现的风险Q因直接关系到系l构架的E_性。由于风险是和需求紧密相q的Q所以可以通过U除或者减这斚w的需求来降低风险。因此把q种需求取消,需要构架师和投资h达成p的。这需要构架师是一个有效的谈判人员Q来权衡q些问题?/p>

ȝ

q篇文章介绍了Y件构架师的一些工作。这个系列中的下几篇介lY件构架过E的Ҏ,以及把Y件构架作为IT资的基处理的好处?/p>

鸣谢

q篇文章来源于下面这本书Q书名暂定ؓQ?#8220;软g构架构徏的过E?#8221;Q下面我要感谢ؓq篇文章中作注释的h员:Grady BoochQDave BrainesQAlan BrownQMark DicksonQLuan Doan-MinhQHolger HeussQKelli HoustonQPhilippe KruchtenQNick RozanskiQDave Williams以及Eoin Woods?br />
文章来自Q?a >http://www.ibm.com/developerworks/cn/rational/rationaledge/content/apr06/eeles/



疯狂 2010-10-10 23:45 发表评论
]]>
վ֩ģ壺 | İ| ײ| | | | | | ײ| | ޵| ʯȪ| ͬ| | | | | | ɽ| Ϫ| | | | | ˮ| | | ڻ| ͳ| ʦ| | ɳ| | ±| | | ɽ| ɽ| ׷| ʩ| ƽ|