??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲中文字幕久在线,久久久久亚洲AV无码专区网站,久久精品国产亚洲5555http://m.tkk7.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://m.tkk7.com/freeman1984/archive/2015/12/14/428645.html疯狂疯狂Mon, 14 Dec 2015 10:04:00 GMThttp://m.tkk7.com/freeman1984/archive/2015/12/14/428645.htmlhttp://m.tkk7.com/freeman1984/comments/428645.htmlhttp://m.tkk7.com/freeman1984/archive/2015/12/14/428645.html#Feedback0http://m.tkk7.com/freeman1984/comments/commentRss/428645.htmlhttp://m.tkk7.com/freeman1984/services/trackbacks/428645.html阅读全文

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

 

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

 

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

 

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

参数

处理器型?/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如下:(x)

产品

最低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

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

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

 

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

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

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

 

q里是Oracle 11g企业版的销售h(hun)|(x)

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

 

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

 

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

 

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


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

a.如果已安装了(jin)数据库实例,那么直接查看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 视图反应?jin)数据库服务器当前的逻辑CPUL?Q而ȝ核数也是2Q实际的物理CPU Socket?Q那么说明是1个双核的物理CPU?/span>


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

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


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

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双核模块)(j)的power芯片上,一个双核模块(内含2颗物理cpuQ只需要购?.5个license Q?具体的模块类型可以咨询IBM厂家或者集成商?br />
转自Q?a >http://blog.csdn.net/eurasiaxz/article/details/10699869

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

疯狂 2014-10-27 16:43 发表评论
]]>
URL最大长度限??http://m.tkk7.com/freeman1984/archive/2013/05/30/399942.html疯狂疯狂Thu, 30 May 2013 01:29:00 GMThttp://m.tkk7.com/freeman1984/archive/2013/05/30/399942.htmlhttp://m.tkk7.com/freeman1984/comments/399942.htmlhttp://m.tkk7.com/freeman1984/archive/2013/05/30/399942.html#Feedback0http://m.tkk7.com/freeman1984/comments/commentRss/399942.htmlhttp://m.tkk7.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中提刎ͼ(x)

    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的说法也是ؓ(f)?jin)兼?gu)考虑。实际上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有文章提到作ؓ(f)<a>的href属性时QURL不能过1024bytesQ这Ҏ(gu)有详l查?

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

参考:(x)

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

什么是A/B试?

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

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

试哪些东西?

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

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

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

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

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

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

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

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

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

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

注意事项

需要做?/strong>

  • 知道q行试多久。结束太早,可能?x)你花了(jin)时间但是没有得到有意义的结果。结束太晚也不好Q因为效果不佳的面可能影响你的转化和业l。用一?a href="http://visualwebsiteoptimizer.com/ab-split-test-duration/">计算?/a>Q来定试多久以后来结束它?/li>
  • 相同的面呈献l同一个访客。?zhn)的工具应该有一个记忆访问者已l看到的面的功能。这样可以防止向同一用户昄一不同的h(hun)格或不同的促(j)销优惠?/li>
  • 让?zhn)的A / B试在整个网站保持一致。如果你正在试的登录按钮在多个地点出现Q然后一个访问者应在所有的地方看到同样的变化。在面1昄一个样子,在页?昄两外一个样子,?x)试验l果被干扰?/li>
  • 做很多的A / B试。让我们面对现实吧:(x)你的W一个A / B试可能?x)无效。但是不要绝望。一个A / B试只能有三个结果:(x)没有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(hun)格页面的标题。最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的照片:(x)一个o(h)Zo(h)人惊讶的l论QA/B试两张囄Q将真h照片攑֜|站上会(x)获得一倍的转化。研I说明,我们潜意识被照片吸引?jin)?/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个单词增加?jin)注册按钮点(yn)L数的28%, 试l果表明Q在行动召唤上一些很的变化?x)带来o(h)人惊讶的l果?/p>

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

Single page vs. multi-step checkout 如果你有一个在U商店,很常见的是支付?gu)程。这个A / B试发现Q多个支付流E比单个支付?gu)程完成的销售更好?/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结果:(x)他们成功地增?0 Q的总销售额。本案例研究证明?jin)设计对销售的影响?/p>

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

A/B试工具

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

一些深入研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/
转蝲自:(x)http://ucdchina.com/snap/7203



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

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

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

  • 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>

重点解释下上图,下面例子都会(x)讲到。首先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?x)有两次pȝ调用Q但是select能处理多个套接字?/p>

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

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

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

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

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

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

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

5U模型的比较比较清晰?jin),剩下的就是把select,epoll,iocp,kqueue按号入那就O(jin)K?jin)?/p>

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

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

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

windows or *nix QIOCP or kqueue/epollQ?

诚然QW(xu)indows的IOCP非常?gu)Q目前很有支持asynchronous I/O的系l,但是׃其系l本w的局限性,大型服务器还是在UNIX下。而且正如上面所qͼkqueue/epoll ?IOCP相比Q就是多?jin)一层从内核copy数据到应用层的阻塞,从而不能算?strong>asynchronous I/OcR?/strong>但是Q这层小的d无轻重Qkqueue与epoll已经做得很优U?jin)?/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服务器ؓ(f)什么效率还不错。。我也不得而知Q可能是设计得比较好吧。?_-?/p>

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

ȝ一些重点:(x)

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

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



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

疯狂 2011-12-07 10:40 发表评论
]]>
hibernateQspring理事务?transactionQJDBC connectionQHibernate Session的用研I?Q一Q?/title><link>http://m.tkk7.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://m.tkk7.com/freeman1984/archive/2011/11/18/363984.html</guid><wfw:comment>http://m.tkk7.com/freeman1984/comments/363984.html</wfw:comment><comments>http://m.tkk7.com/freeman1984/archive/2011/11/18/363984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/freeman1984/comments/commentRss/363984.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/freeman1984/services/trackbacks/363984.html</trackback:ping><description><![CDATA[如果单独使用hibernate可参考上一文?a href="http://m.tkk7.com/freeman1984/archive/2011/08/04/355808.html">http://m.tkk7.com/freeman1984/archive/2011/08/04/355808.html</a><br /><br /><strong>首先hibernate的Connection release mode有以下几U:(x)<br /></strong>1 after_statement 2 after_transaction 3 on_close 其中after_statement 用在jta?Q?span style="color: red"><strong>on_close ?.1之前遗留的(也许是ؓ(f)spring留的-_-Q,也就?.1之前默认是on_close Q但3.1之后默认如果单独使用hibernate是after_transactionQ?/strong></span>如果有第三方事务理Q就用第三方提供的默认|spring是默认使用?jin)on_close?br /><strong>在spring理事务中我们看看系l启动后默认使用的配|:(x)<br /></strong>1,ransaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory使用spring事务{略<br />2Qhibernate内部 Automatic session close at end of transaction: disabled 因ؓ(f)已经交给spring?br />3   Connection release mode: auto 默认Q也是没有配置hibernate.connection.release_mode的时候,但是q里有地斚w要注意:(x)也就是前面提到的使用W三方策略时的问题:(x)看一下代码:(x) <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://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_246_311_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_320_663_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_494_659_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://m.tkk7.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://m.tkk7.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://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />            }</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />        }</span></span></div>其中U色部分是调用?jin)spring提供的默认|而spring的默认|(x)在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://m.tkk7.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://m.tkk7.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://m.tkk7.com/images/OutliningIndicators/InBlock.gif" />     * Sets connection release mode "on_close" as default.<br /><img alt="" align="top" src="http://m.tkk7.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://m.tkk7.com/images/OutliningIndicators/InBlock.gif" />     * it to "auto" (i.e. "after_statement" or "after_transaction").<br /><img alt="" align="top" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" />     * However, for Spring's resource management (in particular for<br /><img alt="" align="top" src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" />     * HibernateTransactionManager), "on_close" is the better default.<br /><img alt="" align="top" src="http://m.tkk7.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://m.tkk7.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://m.tkk7.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://m.tkk7.com/Images/dot.gif" /></span><span id="Codehighlighter1_384_428_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://m.tkk7.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://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />    }</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://m.tkk7.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或者f(xi)lush.Eagerly) 关闭Q。这U情况hibernate内部q会(x)在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://m.tkk7.com/freeman1984/aggbug/363984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/freeman1984/" target="_blank">疯狂</a> 2011-11-18 11:25 <a href="http://m.tkk7.com/freeman1984/archive/2011/11/18/363984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsessionid 问题分析http://m.tkk7.com/freeman1984/archive/2011/09/02/357833.html疯狂疯狂Fri, 02 Sep 2011 08:33:00 GMThttp://m.tkk7.com/freeman1984/archive/2011/09/02/357833.htmlhttp://m.tkk7.com/freeman1984/comments/357833.htmlhttp://m.tkk7.com/freeman1984/archive/2011/09/02/357833.html#Feedback2http://m.tkk7.com/freeman1984/comments/commentRss/357833.htmlhttp://m.tkk7.com/freeman1984/services/trackbacks/357833.html阅读全文

疯狂 2011-09-02 16:33 发表评论
]]>
raid技?/title><link>http://m.tkk7.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://m.tkk7.com/freeman1984/archive/2011/06/21/352756.html</guid><wfw:comment>http://m.tkk7.com/freeman1984/comments/352756.html</wfw:comment><comments>http://m.tkk7.com/freeman1984/archive/2011/06/21/352756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/freeman1984/comments/commentRss/352756.html</wfw:commentRss><trackback:ping>http://m.tkk7.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: 宋体">实现?jin)带区组Q数据ƈ不是保存在一个硬盘上Q而是分成数据块保存在不同驱动器上。因为将数据分布在不同驱动器上,所以数据吞吐率大大提高Q驱动器的负载也比较q。如果刚好所需要的数据在不同的驱动器上效率最好。它不需要计校验码Q实现容易。它的缺Ҏ(gu)它没有数据差错控Ӟ如果一个驱动器中的数据发生错误Q即使其它盘上的数据正确也无于事了(jin)。不应该它用于Ҏ(gu)据稳定性要求高的场合。如果用戯行图象(包括动画Q编辑和其它要求传输比较大的场合使用</span>RAID0<span style="font-family: 宋体">比较合适。同Ӟ</span>RAID<span style="font-family: 宋体">可以提高数据传输速率Q比如所需d的文件分布在两个盘上,q两个硬盘可以同时读取。那么原来读取同h件的旉被羃短ؓ(f)</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它代表?jin)所?/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被{化ؓ(f)</span>3<span style="font-family: 宋体">Ҏ(gu)作,其中的每一Ҏ(gu)作都对应于一块物理硬盘。我们从图中可以清楚的看到通过建立</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实际的提升速率肯定?x)低于理论|但是Q大量数据ƈ行传输与串行传输比较Q提速效果显著显然毋庸置疑?/span></p> <p><span style="font-family: 宋体">  </span>RAID 0<span style="font-family: 宋体">的缺Ҏ(gu)不提供数据冗余,因此一旦用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构的设备来_(d)</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">控制器必能够同时对两个盘进行读操作和对两个镜象盘进行写操作。通过下面的结构图(zhn)也可以看到必须有两个驱动器。因为是镜象l构在一l盘出现问题Ӟ可以使用镜象Q提高系l的定w能力。它比较Ҏ(gu)设计和实现。每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(fng)实现Ҏ(gu)在服务器负蝲比较重的时候会(x)大大影响服务器效率。当(zhn)的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不?x)造成用户工作d的中断。当?dng)我们应当及(qing)时地更换损坏的盘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׃数据的百分之癑֤份,备䆾数据占了(jin)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(fng)数据安全保障的同Ӟ也提供了(jin)?/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如银行、金融、商业超?jng)、仓储库ѝ各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">使用一定的~码技术来提供错误(g)查及(qing)恢复。这U编码技术需要多个磁盘存放检查及(qing)恢复信息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对于控制器的设计来_(d)它又?/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写入速率与读出速率都很高,因ؓ(f)校验位比较少Q因此计时间相对而言比较?yu)。用软g实现RAID控制是十分困难的,控制器的实现也不是很Ҏ(gu)。它主要用于囑ŞQ包括动画)(j){要求吞吐率比较高的场合。不同于RAID 2QRAID 3使用单块盘存放奇偶校验信息。如果一块磁盘失效,奇偶盘及(qing)其他数据盘可以重C生数据。如果奇偶盘失效Q则不媄(jing)响数据用。RAID 3对于大量的连l数据可提供很好的传输率Q但对于随机数据Q奇偶盘?x)成为写操作的瓶颈。利用单独的校验盘来保护数据虽然没有镜像的安全性高Q但是硬盘利用率得到?jin)很大的提高Qؓ(f)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: 宋体">大得多了(jin)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: 宋体">的读出效率很高,写入效率一般,块式的集体访问效率不错。因为奇偶校验码在不同的盘上,所以提高了(jin)可靠性,允许单个盘出错?/span>RAID 5<span style="font-family: 宋体">也是以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位Q而是数据段的校验位交互存放于各个硬盘上。这PM一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据。硬盘的利用率ؓ(f)</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: 宋体">每进行一ơ数据传输,需涉及(qing)到所有的阵列盘。而对?/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的数据及(qing)奇偶信息Q两ơ写新的数据?qing)奇偶信息?/span> RAID-5<span style="font-family: 宋体">的话Q优Ҏ(gu)提供?jin)冗余性(支持一块盘掉线后仍然正常运行)(j)Q磁盘空间利用率较高Q?/span>N-1/N<span style="font-family: 宋体">Q,d速度较快Q?/span>N-1<span style="font-family: 宋体">倍)(j)?/span>RAID5<span style="font-family: 宋体">最大的好处是在一块盘掉线的情况下Q?/span>RAID<span style="font-family: 宋体">照常工作Q相对于</span>RAID0<span style="font-family: 宋体">必须每一块盘都正常才可以正常工作的状况容错性能好多?jin)。因?/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: 宋体">求得的。计公式ؓ(f)</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: 宋体">为异或运)(j)</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: 宋体">值就代表?jin)两个位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: 宋体">和存储成本兼儡存储解决Ҏ(gu)?/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只是多?jin)一个奇偶校验信息,写入数据的速度比对单个盘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据就?x)无法挽回。出现故障以后只要不寚w列作初始化操作,有Z(x)恢复出故障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验的专业数据恢复中?j)提供数据恢复帮助。判断专业数据恢复中?j)的标准包括数据恢复中?j)所使用?/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://m.tkk7.com/freeman1984/aggbug/352756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/freeman1984/" target="_blank">疯狂</a> 2011-06-21 17:07 <a href="http://m.tkk7.com/freeman1984/archive/2011/06/21/352756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx tomcat负蝲配置http://m.tkk7.com/freeman1984/archive/2011/02/15/344398.html疯狂疯狂Tue, 15 Feb 2011 15:08:00 GMThttp://m.tkk7.com/freeman1984/archive/2011/02/15/344398.htmlhttp://m.tkk7.com/freeman1984/comments/344398.htmlhttp://m.tkk7.com/freeman1984/archive/2011/02/15/344398.html#Feedback0http://m.tkk7.com/freeman1984/comments/commentRss/344398.htmlhttp://m.tkk7.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://m.tkk7.com/freeman1984/archive/2011/02/15/344326.html疯狂疯狂Tue, 15 Feb 2011 03:07:00 GMThttp://m.tkk7.com/freeman1984/archive/2011/02/15/344326.htmlhttp://m.tkk7.com/freeman1984/comments/344326.htmlhttp://m.tkk7.com/freeman1984/archive/2011/02/15/344326.html#Feedback1http://m.tkk7.com/freeman1984/comments/commentRss/344326.htmlhttp://m.tkk7.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://m.tkk7.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://m.tkk7.com/freeman1984/archive/2011/02/15/344325.html</guid><wfw:comment>http://m.tkk7.com/freeman1984/comments/344325.html</wfw:comment><comments>http://m.tkk7.com/freeman1984/archive/2011/02/15/344325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/freeman1984/comments/commentRss/344325.html</wfw:commentRss><trackback:ping>http://m.tkk7.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情形:(x)部分?rn)态页面需要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情形:(x)所有请求{发到后端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(fng)处理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合使用的较多,静(rn)态内容交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://m.tkk7.com/freeman1984/aggbug/344325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/freeman1984/" target="_blank">疯狂</a> 2011-02-15 10:53 <a href="http://m.tkk7.com/freeman1984/archive/2011/02/15/344325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache 集群tomcat配置参数说明http://m.tkk7.com/freeman1984/archive/2011/02/15/344322.html疯狂疯狂Tue, 15 Feb 2011 02:37:00 GMThttp://m.tkk7.com/freeman1984/archive/2011/02/15/344322.htmlhttp://m.tkk7.com/freeman1984/comments/344322.htmlhttp://m.tkk7.com/freeman1984/archive/2011/02/15/344322.html#Feedback0http://m.tkk7.com/freeman1984/comments/commentRss/344322.htmlhttp://m.tkk7.com/freeman1984/services/trackbacks/344322.htmlTomcat 集群配置
打开Server.xmlQshutdown, ajp, httpq三个端口就不多说了(jin)Q解开下面注释
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
jvmRoute的DҎ(gu)a(chn)pache的配|,不能冲突?br /> 接着是最重要的一点,tomcat默认集群配置Q?lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>Q时Q配|的l节实际上被省略?jin),对于大多数应用而言Q用默认配|已l够,完整的默认配|应该是q样Q?

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


<!--同步异步模式由channelSendOptions参数控制Q默认值是8Qؓ(f)异步模式Q?是同步模式。在异步模式下,可以通过加上拯认QAcknowledgeQ来提高可靠性,此时channelSendOptions设ؓ(f)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了(jin)解更多组播地址详情请参见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?x)?000-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可以实现ƈ行发送,即集中的多个节点可以同时向其他所有节点发送数据而互不媄(jing)?->  
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
        </Sender>  
        <!---Interceptor有点cM下面要解释的ValveQvC个阀门的作用Q在数据到达目的节点前进行检或其他操作Q如TcpFailureDetector用于(g)在数据的传输过E中是否发生?jin)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行(g)或q行某些操作QReplicationValve是用于用于(g)当前的响应是否涉及(qing)Session数据的更斎ͼ如果是则启动Session拯操作Qfilter用于qo(h)hQ如客户端对囄QcssQjs的请求就不会(x)涉及(qing)SessionQ因此不需(g),默认状态下不进行过滤,监测所有的响应.JvmRouteBinderValve?x)在前端的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?x)监到q一操作q把q一文g拯到集中其他节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能Q不q很遗憾Qtomcat集群目前q不能做到这一点,开发h员正在努力实现它Q这里的配置只是预留?jin)一个接?->  
    <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官Ҏ(gu)档没有这个,但我觉得q是应该加上Q因为按照标准的tomcat启动Q当Host对象被创建时Q一个Cluster对象Q默认配|下是SimpleTcpClusterQ也同时被关联到q个Host对象。当某个应用在web.xml中设|了(jin)distributableӞTomcatؓ(f)此应用的上下文环境创Z个DeltaManager。SimpleTcpCluster启动membership服务和Replication服务?br />
---

extra/httpd-mpm.conf 模块  

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

# WinNT MPM

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

# MaxRequestsPerChild: maximum  number of requests a server process serves

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

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

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

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

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

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

<IfModule mpm_winnt_module>

    ThreadLimit            2000

    ThreadsPerChild        2000

    MaxRequestsPerChild    2000

</IfModule>



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

(文:(x)包一?/span>)

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

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

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

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

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

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

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

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

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

客户端的~程中,?/span>DOM对象的操作往往是最Ҏ(gu)占用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”之间的差别在于在创徏表格单元时用了(jin)不同?/span>APIҎ(gu)。?#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优于对象Ҏ(gu)?/span>API。徏议大家在需要频J调用某一APIӞ对其性能表现做一些基本的试?/span>

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

提高字符串篏加的速度

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

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

var str = "";

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

       str += "xxxxxx";

}

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

/* 试代码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一些较?yu)的字符串然后再l装成更大的字符丌Ӏ这U做法可以有效的在字W串D的后期减内存复制的数据量。知道了(jin)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代买组装一个长度ؓ(f)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它?x)导?/span>IE的内存占用量持箋上升Qƈ且浏览器的整体运行速度明显下降。对于一些泄露比较严重的|页Q甚臛_要刷新几ơ,q行速度׃(x)降低一倍?/span>

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

有关内存泄漏的模型的更多介绍可以通过Google很快的查刎ͼ本文不做q多的阐q。不q,q里我向(zhn)推荐一个可用于查找和分析网内存泄露的工?/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>

除了(jin)上面提到的这些代码的改良之外,我们q可以利?/span>GZIP来有效的降低|络量。目前常见的L览器已l全部支?/span>GZIP法Q我们往往只需要编写少量的代码可以支?/span>GZIP?jin)。例如在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(fng)的性能损耗几乎是可以忽略的。结合其他因素,支持GZIP的网站有可能为我们节U?/span>50%的网l流量。因?/span>GZIP的用可以ؓ(f)那些|络环境不是特别好的应用带来显著的性能提升。?/span>Http的监视工?/span>Fiddler可以方便的检出|页在?/span>GZIP前后的通讯数据量?/span>Fiddler的下载地址?/span>http://www.fiddlertool.com/fiddler/

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



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


 转蝲自:(x)http://m.tkk7.com/BlueDavy/archive/2007/10/11/151907.html

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

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

下面是电(sh)气及(qing)?sh)子工程师协会(x)?#8220;构架?#8221;做的定义Q?/em>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ȝ

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

鸣谢

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



疯狂 2010-10-10 23:45 发表评论
]]>
վ֩ģ壺 þþƷ| ڵɫƵƵ| Ļһ| aëƬѸƵ| һAvëƬþþƷ| Ůվ| ɫþþ99Ʒ91| ѹۿ| AVרAVëվ| AVƬ߹ۿ| av뾫ƷװƬ| պ尡Ƶ߹ۿ| Ů18ëƬˮ| Ļavѷ| ߲޾Ʒ| ۺav뾫Ʒһ| ѿƵ| 츾avһ| 鶹Ƶѹۿ| ޹Ʒ۲ӰԺ| þ޸ۺ| þ99ۺϾƷ| Ʒպþ| ޹˾þۺ| aëƬa| þ99ڹ| ëƬѹۿƵ| ߹ۿר| ޴Ƭ߹ۿ| ձ˻ʿxxxxƵ| 91Ƶѹۿۿ| ޹ղ뾫Ʒ| ƷƵ| ƷѹۿƵ| ŮԸ߰վ| һػɫƬ| 99ƷƵ߹ۿ| avպۺһ| ޾ƷԴ26u| ŮƵ| պAVһ|