ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>性色av一区,国产精品三级,国产日韩欧美一区二区三区四区 http://www.aygfsteel.com/freeman1984/category/46575.htmlSTANDING ON THE SHOULDERS OF GIANTS zh-cnMon, 14 Dec 2015 10:38:24 GMTMon, 14 Dec 2015 10:38:24 GMT60JAVA Thread Dump 分析¾lÆD¿°http://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html疯狂疯狂Mon, 14 Dec 2015 10:04:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.htmlhttp://www.aygfsteel.com/freeman1984/comments/428645.htmlhttp://www.aygfsteel.com/freeman1984/archive/2015/12/14/428645.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/428645.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/428645.html阅读全文

疯狂 2015-12-14 18:04 发表评论
]]>
(è½?Oracle数据库如何授权收费(Database LicensingåQ?http://www.aygfsteel.com/freeman1984/archive/2014/10/27/419097.html疯狂疯狂Mon, 27 Oct 2014 08:43:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2014/10/27/419097.htmlhttp://www.aygfsteel.com/freeman1984/comments/419097.htmlhttp://www.aygfsteel.com/freeman1984/archive/2014/10/27/419097.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/419097.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/419097.html
说白了,Oracle Licensež®±æ˜¯ä¸€å¼ çº¸åQŒä¸€å¼ è®¸å¯è¯ã€‚这跟许多èÊYä»¶äñ”品是一æ ïLš„åQŒæœ‰æ²¡æœ‰è®¸å¯è¯çš„产品在功能上是没有区别的åQŒä»…仅是一个法律问题。也ž®±æ˜¯è¯ß_¼Œéšä¾¿åˆ°ç½‘上下的Oracle都可以免è´ÒŽ­£å¸æ€‹É用,只不˜q‡è¿™ä¸ªä‹É用是有区别的åQŒå¦‚果是‹¹‹è¯•或研发,那没关系åQŒéšä¾¿ç”¨åQ›å¦‚果是用于商业用途,那就是违法的了,Oracle公司有权赯‚¯‰åQ?/span>

 

与免费的下蝲版本不同åQŒæ­£å¼ç‰ˆçš„Oracle在购买后åQŒç”¨æˆ·ä¼šå¾—到一个äñ”品服务码åQŒå‡­æ­¤Oracle服务码,可以得到Oracle的在¾U¿å‡¾U§ç­‰æœåŠ¡åQŒOracle的服务分为好多çñ”åQŒä¸åŒçñ”别提供相对应的在¾U¿æˆ–是现场服务ã€?/span>

 

现在Oracle有两¿UæŽˆæƒæ–¹å¼ï¼ŒæŒ‰CPU(Process)数和按用æˆäh•°(NamedUser Plus)ã€?/strong>前一¿Uæ–¹å¼ä¸€èˆ¬ç”¨äºŽç”¨æˆäh•°ä¸ç¡®å®šæˆ–者用æˆäh•°é‡å¾ˆå¤§çš„æƒ…况åQŒå…¸åž‹çš„如互联网环境åQŒè€ŒåŽä¸€¿Uåˆ™é€šå¸¸è¢«ç”¨äºŽç”¨æˆäh•°¼‹®å®šæˆ–者较ž®‘的情况ã€?/span>

 

按CPUåQ?/strong>Licenseæ•?CPUæ•?¾pÀL•°ã€‚系数来自Oracle的一个参数表åQŒå¦‚IBM Power6的处理器ä¸?åQŒAMDå’ŒIntel的处理器ä¸?.5åQŒè¯¦¾l†æƒ…况见下:

参数

处理器型�/span>

0.25

Sun UltraSPARC T1 处理�/span>

0.50

Sun UltraSPARC T1处理�/span>

0.50

Intel、AMD处理�/span>

0.50

Sun UltraSPARC T2+ 处理�/span>

1.00

IBM POWER6、POWER7 处理�/span>

0.75

其他多核处理�/span>

1.00

单核处理�/span>

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

 

按用æˆäh•°åQ?/strong>Oracle数据库按照用æˆäh•°æŽˆæƒåQŒæ˜¯æŒ‡æœ€¾lˆç«¯çš„连接到Oracle数据库的用户数。按照用æˆäh•°æ¥ä¹°çš„æ—¶å€™åªèƒ½ç”¨äºŽä¸€ä¸ªç³»¾lŸï¼Œä¸å…è®¸åœ¨å¤šå°æœºå™¨ä¸Šå®‰è£…。每一个访问Oracle数据库的用户åQŒæ— è®ºæ˜¯è‡ªç„¶äºø™¿˜æ˜¯è®¾å¤‡ï¼Œéƒ½ç®—作一个用æˆ?(Named User)。如果是B/Sæž¶æž„åQŒé‚£ä¹ˆæ˜¯æŒ‡è¿žæŽ¥åˆ°ä¸­é—´ä»¶ä¸Šçš„用æˆäh•°ã€?/span>

 

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

 

按用æˆäh•°è´­ä¹°åˆ™å¯¹åº”相应的产品有对应的License的最低购买量限制åQŒå¦‚下:

产品

最低License�/span>

Oracle Database Standard Edition ONE

5 Named User Plus licenses

Oracle Database Standard Edition

5 Named User Plus licenses

Oracle Database Enterprise Edition

25 Named User Plus licenses per CPU

Oracle Application Server Standard Edition ONE

5 Named User Plus licenses

All other Oracle Application Server products

10 Named User Plus licenses per CPU

当然用户应该æ ÒŽ®è‡ªå·±çš„实际用æˆäh•°è®¢è´­åQŒä¸”不少于相应版本所要求的最低用æˆäh•°ã€?/span>

一般情况下åQ?CPU的费用约½{‰äºŽ50user的费用,所以如果用æˆäh•°>CPUæ•?¾pÀL•°*50åQŒåˆ™æŒ‰CPU订购反而更为经‹¹Žã€?/strong>

 

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

如果用户是按照用æˆäh•°è´­ä¹°çš„OracleåQŒæ›´æ”¹ç¡¬ä»¶ä¸éœ€è¦é‡æ–°è´­ä¹°LicenseåQ?/span>

如果是按照CPU个数乎ͼŒæœ‰ç›¸åº”的换算æ–ÒŽ³•åQŒå…·ä½“请咨询Oracle公司ã€?/span>

 

˜q™é‡Œæ˜¯Oracle 11g企业版的销售ä­hæ û|¼š

每个License˜q˜æœ‰æœ‰æ•ˆæœŸçš„分类åQˆä¸è®ºæ˜¯User License˜q˜æ˜¯CPU LicenseåQ‰ï¼Œåˆ†åˆ«ä¸ºï¼š1òq´ã€?òq´ã€?òq´ã€?òq´ã€?òq´ã€æ°¸ä¹…。当然ä­hæ ég¹Ÿæ˜¯ä¾‹Æ¡å¢žåŠ ã€?/span>

 

当前Oracle 11Gçš„User License无限使用期的ä»äh ¼ä¸ÞZh民币3å?左右åQŒæŒ‰50个User License无限使用期的购买量则ä»äh ¼ä¸?7.5ä¸?每个CPU License无限使用期的ä»äh ¼ä¸?7ä¸?千,按IBMž®æœºçš„系数计½Ž—,则购ä¹îC­hæ égØ“17ä¸?千,å’?0个User Licenseçš„ä­h格相˜q‘ã€?/span>

 

关于服务ä»äh ¼åQšä¸€èˆ¬åœ°åQŒè´­ä¹°Oracleçš„License都包含首òq´çš„æœåŠ¡è´¹ï¼Œä»¥åŽçš„è´¹ç”¨æŒ‰æ¯å¹´åŽŸä­hçš?2%计算ã€?/span>

 

更多的äñ”品ä­h格可以访问http://shop.oracle.com查看ã€?/span>


˜q™é‡Œæˆ‘们再介¾lä¸€ä¸‹å¦‚何查看服务器上物理CPUæ€ÀL•°ä»¥åŠæ ¸æ•°åQ?/strong>

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

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

CPU_COUNT_CURRENT CPU_CORE_COUNT_CURRENT CPU_SOCKET_COUNT_CURRENT
----------------- ---------------------- ------------------------
                2                      2                        1
以上通过v$license 视图反应了数据库服务器当前的逻辑CPUæ€ÀL•°ä¸?åQŒè€Œæ€Èš„核数也是2åQŒå®žé™…的物理CPU Socketæ˜?åQŒé‚£ä¹ˆè¯´æ˜Žæ˜¯1个双核的物理CPUã€?/span>


b. 如果服务器上ž®šæ²¡æœ‰éƒ¨¾|²å®žä¾‹åˆ™ä¸èƒ½ä½¿ç”¨v$license视图åQŒé‚£ä¹ˆå¯ä»¥é€šè¿‡OS 命ä×o来获取必要的信息ã€?/span>

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


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

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

列出单个物理CPU的核�

grep "cpu cores" /proc/cpuinfo |uniq

 

 

在Power¾pÕdˆ—çš„IBMž®æœºä¸ŠæŒ‰ç…§cpu模块方式来购乎ͼŒåœ¨IBM Dual-Core ModuleåQˆåŒæ ¸æ¨¡å—)的power芯片上,一个双核模块(内含2颗物理cpuåQ‰åªéœ€è¦è´­ä¹?.5个license åQ?具体的模块类型可以咨询IBM厂家或者集成商ã€?br />
转自åQ?a >http://blog.csdn.net/eurasiaxz/article/details/10699869

当然随着cpu计算能力的提高,cpuä¸ªæ•°æœ‰å¯èƒ½åÆˆä¸éœ€è¦å¤ªå¤šã€‚oracle的收è´Òލ¡å¼è‚¯å®šä¼šå˜åŒ–ã€?/p>

]]>
URL最大长度限��http://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html疯狂疯狂Thu, 30 May 2013 01:29:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.htmlhttp://www.aygfsteel.com/freeman1984/comments/399942.htmlhttp://www.aygfsteel.com/freeman1984/archive/2013/05/30/399942.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/399942.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/399942.html

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

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

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

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

  2. 从上一点也可以看出åQ?55bytesçš„è¯´æ³•ä¹Ÿæ˜¯äØ“äº†å…¼å®ÒŽ€§è€ƒè™‘。实际上çŽîC»£‹¹è§ˆå™¨çš„限制如下åQ?br />

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

  3. 另外值得注意的是åQŒæœ‰æ–‡ç« æåˆ°ä½œäØ“<a>çš„href属性时åQŒURL不能­‘…过1024bytesåQŒè¿™ç‚ÒŽ²¡æœ‰è¯¦¾l†æŸ¥è¯?

¾lég¸ŠåQŒURL˜q˜æ˜¯ä¸é€‚合太长åQŒä¸æ˜¯ä¸å¾—å·²åQŒå°½é‡ä¸è¦é€šè¿‡GET方式提交大量参数åQŒå¯ä»¥è€ƒè™‘用POST方式åQˆå¤§¾U¦åœ¨2M左右åQŒåº”该是和服务器及设定有养I¼‰ã€‚另外这么长的URL在访问和收藏åQˆæœ‰æ–‡ç« æåˆ°æœ‰äº›‹¹è§ˆå™¨åœ¨æ”¶è—­‘…长地址时也是会出现问题åQ‰æ—¶ä¹Ÿæ˜¯ç›¸å½“不友好的。当ç„Óž¼Œä¹‹å‰æ•°æ®åº“å­—ŒDµè®¾¾|®æ—¶˜q˜æ˜¯ä½œäØ“255bytes处理åQŒçŽ°åœ¨å¯èƒ½è¦è€ƒè™‘æ‰©å……ä¸€ä¸‹äº†ã€?/p>

参考:

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


]]>
关于tomcatå’ŒsessionCookieNameå’ŒSESSION_PARAMETER_NAME以及disableURLRewriting参数原理和ä‹Éç”?/title><link>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 24 Dec 2012 07:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/393402.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/393402.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/393402.html</trackback:ping><description><![CDATA[     摘要: 关于tomcatå’ŒsessionCookieNameå’ŒSESSION_PARAMETER_NAME以及disableURLRewriting参数原理和ä‹Éç”?nbsp; <a href='http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html'>阅读全文</a><img src ="http://www.aygfsteel.com/freeman1984/aggbug/393402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2012-12-24 15:16 <a href="http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A/B‹¹‹è¯•(转蝲)http://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html疯狂疯狂Tue, 28 Aug 2012 03:41:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.htmlhttp://www.aygfsteel.com/freeman1984/comments/386419.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/08/28/386419.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/386419.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/386419.htmlA / B‹¹‹è¯•不是一个时髦名词。现在很多有¾léªŒçš„è¥é”€å’Œè®¾è®¡å·¥ä½œè€…ç”¨å®ƒæ¥èŽ·å¾—è®¿å®¢è¡ŒäØ“ä¿¡æ¯åQŒæ¥æé«˜è½¬æ¢çŽ‡ã€‚ç„¶è€Œï¼Œ A / B‹¹‹è¯•与SEO不同的是åQŒäh们都不太知道徒河˜q›è¡Œ¾|‘ç«™åˆ†æžå’Œå¯ç”¨æ€§åˆ†æžã€‚ä»–ä»¬åÆˆä¸å®Œå…¨æ˜Žç™½å®ƒæ˜¯ä»€ä¹ˆæˆ–å¦‚ä½•æ›´æœ‰æ•ˆçš„ä½¿ç”¨å®ƒã€‚æœ¬æ–‡å°†ä¸ÞZ½ æä¾›æœ‰å²ä»¥æ¥æœ€å¥½çš„A / B‹¹‹è¯•教程ã€?/p>

什么是A/B‹¹‹è¯•?

A / B‹¹‹è¯•的核心就是:¼‹®å®šä¸¤ä¸ªå…ƒç´ æˆ–版本(Aå’ŒBåQ‰å“ªä¸ªç‰ˆæœ¬æ›´å¥½ï¼Œä½ éœ€è¦åŒæ—¶å®žéªŒä¸¤ä¸ªç‰ˆæœ¬ã€‚最后,选择最好的版本使用ã€?/p>

¾|‘络上的A / B‹¹‹è¯•åQŒå³ä½ è®¾è®¡çš„™åµé¢æœ‰ä¸¤ä¸ªç‰ˆæœ¬ï¼ˆAå’ŒBåQ‰ï¼ŒA为现行的设计åQˆç§°ä¸ºæŽ§åˆÓž¼‰ åQ?B是新的设计。比较这两个版本之间你所兛_¿ƒçš„æ•°æ®ï¼ˆè½¬åŒ–率,业ç‡WåQŒèŸ©å‡ºçއ½{‰ï¼‰ 。最后,您选择效果最好的版本ã€?/p>

‹¹‹è¯•哪些东西?

你要选择什么去‹¹‹è¯•取决于你的目标。例如,如果你的目标是增加顾客数量,那么您可能测试下列内容:注册表单数量åQŒå­—ŒD늱»åž‹è¦æ±‚,隐私政策½{‰ã€‚在˜q™ç§æƒ…况下A / B‹¹‹è¯•的目标是要弄清楚什么阻止了游客注册。需要填写的表单的数量?用户的隐¿Uï¼Ÿ˜q˜æ˜¯è¯¥ç½‘站做了让游客不信ä»Èš„事情åQŸæ‰€æœ‰è¿™äº›é—®é¢˜éƒ½å¯ä»¥é€šè¿‡ä¸€ä¸ªä¸ªA/B ‹¹‹è¯•获得½{”案ã€?/p>

每一个A / B‹¹‹è¯•内容都是独一无二的,单通常‹¹‹è¯•一下这些内容:

  • 行动按钮的措辞,大小åQŒé¢œè‰²å’Œä½ç½®åQ?/li>
  • 标题或äñ”品说明,
  • 表单的数量和字段¾cÕdž‹åQ?/li>
  • ¾|‘站的布局和风æ û|¼Œ
  • 产品定ä­h和促销‹zÕdЍåQ?/li>
  • 着陆和产品™åµé¢ä¸Šçš„囄¡‰‡åQ?/li>
  • ™åµé¢ä¸Šæ–‡å­—的长度åQˆå°‘Vs多)ã€?/li>

一旦你军_®šè¦æµ‹è¯•什么,下一步当然是要选择一个合适的‹¹‹è¯•工具。如果你惌™¦ä¸€ä¸ªåŸº¼‹€çš„å…è´¹å·¥å…øP¼Œå¯ä»¥ä½¿ç”¨Google Website Optimizer。如果你惌™¦åŠŸèƒ½æ›´åŠ å¼ºå¤§çš„å·¥å…øP¼Œå¯ä»¥ä½¿ç”¨Visual Website Optimizer  ã€‚å…¶ä»–çš„ä¸€äº›é€‰æ‹©éƒ½æ˜¯å¯ä»¥çš„ï¼Œå»ºç«‹è¯•éªŒåœ¨æ‰€æœ‰å·¥å…·ä¸­éƒ½å¾ˆç›æ€¼¼åQŒæ‰€ä»¥æˆ‘们只需讨论一¿Uå³å¯ã€?/p>

你可以通过两种æ–ÒŽ³•建立A / B‹¹‹è¯•åQ?/p>

  • 在页面测试加载前替换元素
    如果你测试的是页面上的单个元素,如注册按钮,然后需要在‹¹‹è¯•工具中设¾|®æŒ‰é’®ã€‚当‹¹‹è¯•æ—Óž¼Œåœ¨A / B工具ž®†åœ¨™åµé¢¾l™ç”¨æˆ·å‰éšæœºæ›¿æ¢æŒ‰é’®ã€?/li>
  • 重定向到另一™åµé¢
    如果你想通过A / B‹¹‹è¯•整个™åµé¢åQŒæ¯”如说åQŒä¸€ä¸ªç»¿è‰²çš„主题和一个红色主题,那么你就需要创建和上传新的™åµé¢ã€‚例如,如果您的主页æ˜?http://www.example.com/index.htmlåQŒé‚£ä¹ˆä½ éœ€è¦åˆ›å»ºå¦å¤–一个页é?http://www.example.com/index1.html。当‹¹‹è¯•˜qè¡Œæ—Óž¼Œæ‚¨çš„‹¹‹è¯•工具ž®†ä¸€éƒ¨åˆ†è®‰K—®è€…重定向到第二个¾|‘址ã€?/li>

一旦您使用了上面的两种变换æ–ÒŽ³•åQŒä¸‹ä¸€æ­¥æ˜¯å»ºç«‹æ‚¨çš„转换目标。通常åQŒä½ ä¼šå¾—åˆîC¸€ä¸ªJavaScript代码åQŒæ‚¨å¯ä»¥å¤åˆ¶òq¶ç²˜è´´åˆ°ä¸€ä¸ªéœ€è¦æ¸¸å®¢åˆ°è¾„¡š„目标¾|‘页。例如,如果您有一个电子商务网站,你正在测试的“立即购买“按钮的颜è‰ÔŒ¼Œç„¶åŽæ‚¨çš„转换目标ž®†æ˜¯è´­ä¹°æˆåŠŸåŽçš„“谢谢æ‚?#8220;™åµé¢ã€?/p>

在è{换事件发生的同时åQŒåœ¨A / B‹¹‹è¯•工具åQŒè®°å½•了哪种™åµé¢æ˜„¡¤º¾l™äº†è®‰K—®è€…。经˜q‡èƒö够数量的游客åQŒæ‚¨å¯ä»¥¼‹®å®šå“ªä¸ª™åµé¢å¸¦æ¥äº†æœ€å¤šçš„转化åQå¾ç«‹å’Œ˜qè¡Œçš„A / B‹¹‹è¯•åQŒå…¶å®žå¾ˆ½Ž€å•ã€?/p>

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

虽然A / B‹¹‹è¯•是超¾U§ç®€å•的概念åQŒä½†æ˜¯è¯·è®îC½åQŒä»¥ä¸‹è¿™äº›éƒ½åªæ˜¯æˆ‘自å·Þqš„¾léªŒã€?/p>

注意事项

需要做�/strong>

  • 知道˜qè¡Œ‹¹‹è¯•多久。结束太早,可能会ä‹É你花了时间但是没有得到有意义的结果。结束太晚也不好åQŒå› ä¸ºæ•ˆæžœä¸ä½³çš„™åµé¢å¯èƒ½å½±å“ä½ çš„转化和业¾l©ã€‚ä‹É用一ä¸?a href="http://visualwebsiteoptimizer.com/ab-split-test-duration/">计算å™?/a>åQŒæ¥¼‹®å®š‹¹‹è¯•多久以后来结束它ã€?/li>
  • ž®†ç›¸åŒçš„™åµé¢å‘ˆçŒ®¾l™åŒä¸€ä¸ªè®¿å®¢ã€‚您的工具应该有一个记忆访问者已¾lçœ‹åˆ°çš„™åµé¢çš„功能。这样可以防止向同一用户昄¡¤ºä¸€ä¸åŒçš„ä­h格或不同的促销优惠ã€?/li>
  • 让您的A / B‹¹‹è¯•在整个网站保持一致。如果你正在‹¹‹è¯•的登录按钮在多个地点出现åQŒç„¶åŽä¸€ä¸ªè®¿é—®è€…应在所有的地方看到同样的变化。在™åµé¢1昄¡¤ºä¸€ä¸ªæ ·å­ï¼Œåœ¨é¡µé?昄¡¤ºä¸¤å¤–一个样子,会ä‹É试验¾l“果被干扰ã€?/li>
  • 做很多的A / B‹¹‹è¯•。让我们面对现实吧:你的½W¬ä¸€ä¸ªA / B‹¹‹è¯•可能会无效。但是不要绝望。一个A / B‹¹‹è¯•只能有三个结果:没有¾l“æžœåQŒä¸å¥½çš„¾l“果和好的结果。优化è{换率的关键是要做大量的A / B‹¹‹è¯•åQŒæŠŠæ‰€æœ‰çš„好的¾l“果拼接èµäh¥åQŒæœ€¾lˆæŽ¨åŠ¨ä¸š¾l©ã€?/li>

¾lå…¸A/B‹¹‹è¯•案例研究

˜q™é‡Œæœ‰ä¸€äº›å¦‚何进行A/B‹¹‹è¯•的案例研½I¶ã€?/p>

Writing Decisions: Headline Tests on the Highrise Sign-Up Page 37Signals‹¹‹è¯•他们的ä­h格页面的标题。最¾lˆå‘玎ͼŒ “30-Day Free Trial on All Accounts “比原来的“Start a Highrise Account. “多äñ”ç”?0 åQ…以上的订单ã€?/p>

“You Should Follow Me on Twitter Here” (Dustin Curtis) ˜q™æ˜¯ä¸€ä¸ªç”¨æ¥æµ‹è¯•召唤用户在Twitter上关注自å·Þqš„试验ã€? Dustin 发现提示文字æ˜?#8220;You should follow me on Twitter here” 的效果是“I’m on Twitter.” 173%

Human Photos Double Conversion Rates ä»Žä¸¤ä¸ªä¸åŒçš„A / B‹¹‹è¯•ž®†åœ¨¾|‘站上增加è{换率的äh的照片:一个ä×oäºÞZ×o人惊讶的¾l“论åQŒA/B‹¹‹è¯•两张囄¡‰‡åQŒå°†çœŸäh照片攑֜¨¾|‘站上会获得一倍的转化。研½I¶è¯´æ˜Žï¼Œæˆ‘们潜意识被照片吸引了ã€?/p>

Google Website Optimizer Case Study: Daily Burn, 20%+ Improvement (Tim Ferriss) 一个将用户选择减少的变化ä‹É转化提高äº?0%åQŒæœ€¾lˆçš„版本在细节和文字上更易吸引目光ã€?/p>

Two Magical Words Increased Conversion Rate by 28% “It’s free” ˜q™ä¸ªå•词增加了注册按钮点å‡ÀL¬¡æ•°çš„28%, ‹¹‹è¯•¾l“果表明åQŒåœ¨è¡ŒåŠ¨å¬å”¤ä¸Šä¸€äº›å¾ˆž®çš„变化会带来ä×o人惊讶的¾l“æžœã€?/p>

Changing the Sign-Up Button from Green to Red ä¾é A / B‹¹‹è¯•åQ?CareLogger把注册按钮从¾l¿è‰²ä¿®æ”¹ä¸ºçº¢è‰²å¢žåŠ äº†34åQ…è{换率åQ?/p>

Single page vs. multi-step checkout å¦‚果你有一个在¾U¿å•†åº—,很常见的ž®±æ˜¯æ”¯ä»˜‹¹ç¨‹ã€‚这个A / B‹¹‹è¯•发现åQŒå¤šä¸ªæ”¯ä»˜æµ½E‹æ¯”单个支付‹¹ç¨‹å®Œæˆçš„销售更好ã€?/p>

“Mad Libs” style form increases conversion 25-40% æ‰“èÓ|传统的智慧,此A / B‹¹‹è¯•发现一ŒDµé£Žæ ?/em>形式输入字段比传¾lŸåŞ式的布局更好ã€?/p>

Complete redesign of product page increased sales by 20% ä¸€ä¸ªèÊYä»¶äñ”品的公司重新设计他们的äñ”品页¾l™å®ƒä¸€ä¸ªçŽ°ä»£çš„å¤–è§‚å’Œå¢žåŠ ä¿¡ä»ÀL¨¡å—。最¾lˆç»“果:他们成功地增åŠ?0 åQ…的总销售额。本案例研究证明了设计对销售的影响ã€?/p>

Marketing Experiments response capture case study – triple digit increase in conversions é€šè¿‡ä¼˜åŒ–é‚®äšg地址获取提高äº?58 åQ…。重ç‚ÒŽ˜¯æ¶ˆé™¤æ‰€æœ‰çš„òq²æ‰°åQŒåƈ要求游客只需提供电子邮äšg地址。ä‹É用亚马逊礼品卡让他/她的完成个äh资料ã€?/p>

A/B‹¹‹è¯•工具

有许多侧重点åQŒä­h位和功能不同的A / B‹¹‹è¯•工具åQŒè¿™é‡Œæ˜¯ä¸€äº›ï¼š

  • Google Website Optimizer
    搜烦巨头提供的免费A/B‹¹‹è¯•工具。一个很好的入门¾U§å·¥å…øP¼Œä½†æ˜¯æ²¡æœ‰ä¸€äº›å…ˆ˜q›çš„功能ã€?/li>
  • A/Bingo and Vanity
    åŸÞZºŽRuby on Rails开发的服务器组件。需要编½E‹å’Œä»£ç é›†æˆã€?/li>
  • Visual Website Optimizer
    一个易于ä‹É用的A / B‹¹‹è¯•工具åQŒåŒ…含一些先˜q›çš„功能åQŒå¦‚所见即所得的¾~–辑器,单击地图åQŒè®¿é—®è€…分割和标签½{‰ã€?/li>
  • Unbounce and Performable
    集成着陆页设计的A / B‹¹‹è¯•工具ã€?/li>
  • Vertster, SiteSpect, Webtrends Optimize and Omniture’s Test&Target
    企业¾U§æµ‹è¯•工兗÷€?/li>

一些深入研½I¶çš„A/B‹¹‹è¯•资料

如果你已¾lè¯»åˆ°è¿™é‡Œï¼Œé‚£ä¹ˆA / B‹¹‹è¯•大概已经‹È€èµ·ä½ çš„å…´­‘£ã€‚在˜q™é‡ŒåQŒæœ‰ä¸€äº›éžå¸¸å¥½çš„A/B‹¹‹è¯•资源ã€?/p>

å¯ÀL‰¾ä½ ä¸‹ä¸€ä¸ªA/B‹¹‹è¯•的灵æ„?/strong>

  • Which Test Won?
    一个猜‹¹‹é‚£¿Uæƒ…况会最¾lˆèƒœåˆ©çš„æ¸¸æˆã€?/li>
  • 101 A/B Testing Tips
    大量的A/B‹¹‹è¯•技巧和æ–ÒŽ³•ã€?/li>
  • ABtests.com
    一个可以分享和阅读A/B‹¹‹è¯•¾l“果的地斏V€?/li>
  • A/B Ideafox
    搜烦引擎的A / B和多变量的案例研½I¶ã€?/li>

一些介¾læ€§æ–‡ç«?/strong>

A/B‹¹‹è¯•中的数学

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



]]>
数字证书原理(�http://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.html疯狂疯狂Tue, 24 Jul 2012 02:35:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.htmlhttp://www.aygfsteel.com/freeman1984/comments/383817.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/383817.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/383817.html阅读全文

]]>
Quartz+Spring的集¾Ÿ¤é…¾|?è½?http://www.aygfsteel.com/freeman1984/archive/2012/05/11/377882.html疯狂疯狂Fri, 11 May 2012 03:02:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/05/11/377882.htmlhttp://www.aygfsteel.com/freeman1984/comments/377882.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/05/11/377882.html#Feedback1http://www.aygfsteel.com/freeman1984/comments/commentRss/377882.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/377882.html阅读全文

]]>
select, iocp, epoll,kqueue及各¿UI/O复用机制http://www.aygfsteel.com/freeman1984/archive/2011/12/07/365746.html疯狂疯狂Wed, 07 Dec 2011 05:45:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365746.htmlhttp://www.aygfsteel.com/freeman1984/comments/365746.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365746.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/365746.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/365746.html首先åQŒä»‹¾lå‡ ¿Uå¸¸è§çš„I/O模型及其区别åQŒå¦‚下:

  • blocking I/O

  • nonblocking I/O

  • I/O multiplexing (select and poll)

  • signal driven I/O (SIGIO)

  • asynchronous I/O (the POSIX aio_functions)

blocking I/O
˜q™ä¸ªä¸ç”¨å¤šè§£é‡Šå§åQŒé˜»å¡žå¥—接字。下图是它调用过½E‹çš„囄¡¤ºåQ?/p>

重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernelåQŒæ³¨æ„kernelæœ?个过½E‹ï¼Œwait for dataå’Œcopy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此˜q‡ç¨‹ä¸€ç›´æ˜¯é˜Õd¡žçš„ã€?/p>

nonblocking I/OåQ?/strong>
与blocking I/O对立的,非阻塞套接字åQŒè°ƒç”¨è¿‡½E‹å›¾å¦‚下åQ?/p>

可以看见åQŒå¦‚果直接操作它åQŒé‚£ž®±æ˜¯ä¸ªè½®è¯¢ã€‚。直到内核缓冲区有数据ã€?/p>

I/O multiplexing (select and poll)
最常见的I/O复用模型åQŒselectã€?/p>

select先阻塞,有活动套接字才返回。与blocking I/O相比åQŒselect会有两次¾pȝ»Ÿè°ƒç”¨åQŒä½†æ˜¯select能处理多个套接字ã€?/p>

signal driven I/O (SIGIO)
只有UNIX¾pȝ»Ÿæ”¯æŒåQŒæ„Ÿå…´è¶£çš„课查阅相关资料

ä¸?strong>I/O multiplexing (select and poll)相比åQŒå®ƒçš„优势是åQŒå…åŽÖMº†select的阻塞与轮询åQŒå½“有活跃套接字æ—Óž¼Œç”±æ³¨å†Œçš„handler处理ã€?/p>

asynchronous I/O (the POSIX aio_functions)
很少æœ?nix¾pȝ»Ÿæ”¯æŒåQŒwindowsçš„IOCP则是此模åž?/p>

完全异步的I/O复用机制åQŒå› ä¸ºçºµè§‚上面其它四¿Uæ¨¡åž‹ï¼Œè‡›_°‘都会在由kernel copy data to applictionæ—‰™˜»å¡žã€‚而该模型是当copy完成后才通知applicationåQŒå¯è§æ˜¯¾U¯å¼‚æ­?/font>的。好像只有windowsçš?font color="#ff0000">å®Œæˆç«¯å£æ˜¯è¿™ä¸ªæ¨¡åž‹ï¼Œæ•ˆçŽ‡ä¹Ÿå¾ˆå‡ø™‰²ã€?/p>

下面是以上五¿Uæ¨¡åž‹çš„æ¯”较

可以看出åQŒè¶Šå¾€åŽï¼Œé˜Õd¡ž­‘Šå°‘åQŒç†è®ÞZ¸Šæ•ˆçŽ‡ä¹Ÿæ˜¯æœ€ä¼˜ã€?/p>

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

5¿Uæ¨¡åž‹çš„æ¯”较比较清晰了,剩下的就是把select,epoll,iocp,kqueue按号入åñ”那就OK了ã€?/p>

selectå’Œiocp分别对应½W?¿Uä¸Ž½W?¿Uæ¨¡åž‹ï¼Œé‚£ä¹ˆepoll与kqueue呢?其实也于select属于同一¿Uæ¨¡åž‹ï¼Œåªæ˜¯æ›´é«˜¾U§ä¸€äº›ï¼Œå¯ä»¥çœ‹ä½œæœ‰äº†½W?¿Uæ¨¡åž‹çš„æŸäº›ç‰ÒŽ€§ï¼Œå¦‚callback机制ã€?/p>

那么åQŒäؓ什么epoll,kqueue比select高çñ”åQ?

½{”案是,他们æ—?font color="#ff0000">轮询。因ä¸ÞZ»–们用callback取代了。想想看åQŒå½“套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调åº?不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPUæ—‰™—´ã€‚如果能¾l™å¥—接字注册某个回调函数åQŒå½“他们‹z»è·ƒæ—Óž¼Œè‡ªåŠ¨å®Œæˆç›¸å…³æ“ä½œåQŒé‚£ž®±é¿å…äº†è½®è¯¢åQŒè¿™æ­£æ˜¯epoll与kqueue做的ã€?/p>

windows or *nix åQˆIOCP or kqueue/epollåQ‰ï¼Ÿ

诚然åQŒWindowsçš„IOCPéžå¸¸å‡ø™‰²åQŒç›®å‰å¾ˆž®‘有支持asynchronous I/O的系¾lŸï¼Œä½†æ˜¯ç”׃ºŽå…¶ç³»¾lŸæœ¬íw«çš„局限性,大型服务器还是在UNIX下。而且正如上面所˜qŽÍ¼Œkqueue/epoll ä¸?IOCP相比åQŒå°±æ˜¯å¤šäº†ä¸€å±‚从内核copy数据到应用层的阻塞,从而不能算ä½?strong>asynchronous I/O¾c…R€?/strong>但是åQŒè¿™å±‚小ž®çš„é˜Õd¡žæ— èƒö轻重åQŒkqueue与epoll已经做得很优¿U€äº†ã€?/p>

提供一致的接口åQŒIO Design Patterns

实际上,不管是哪¿Uæ¨¡åž‹ï¼Œéƒ½å¯ä»¥æŠ½è±¡ä¸€å±‚出来,提供一致的接口åQŒå¹¿ä¸ÞZh知的有ACE,Libevent˜q™äº›åQŒä»–们都是跨òq›_°çš„,而且他们自动选择最优的I/O复用机制åQŒç”¨æˆ·åªéœ€è°ƒç”¨æŽ¥å£å›_¯ã€‚说到这里又得说è¯?个设计模式,Reactor and Proactorã€?/strong>有一½‹‡ç»å…¸æ–‡ç«?a >http://www.artima.com/articles/io_design_patterns.html值得阅读åQŒLibeventæ˜?strong>Reactor模型åQŒACE提供Proactor模型。实际都是对各种I/O复用机制的封装ã€?/p>

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

我曾天真的认为java niož®è£…的是IOCP。。现在可以确定,目前的java本质是select()模型åQŒå¯ä»¥æ£€æŸ?jre/bin/nio.dll得知。至于javaæœåŠ¡å™¨äØ“ä»€ä¹ˆæ•ˆçŽ‡è¿˜ä¸é”™ã€‚ã€‚æˆ‘ä¹Ÿä¸å¾—è€ŒçŸ¥åQŒå¯èƒ½æ˜¯è®¾è®¡å¾—比较好吧。ã€?_-ã€?/p>

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

æ€È»“一些重点:

  1. 只有IOCP是asynchronous I/OåQŒå…¶ä»–机制或多或ž®‘都会有一炚w˜»å¡žã€?
  2. select低效是因为每‹Æ¡å®ƒéƒ½éœ€è¦è½®è¯¢ã€‚但低效也是相对的,视情况而定åQŒä¹Ÿå¯é€šè¿‡è‰¯å¥½çš„设计改å–?
  3. epoll, kqueue是Reacor模式åQŒIOCP是Proactor模式ã€?
  4. java nio包是select模型。�

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



]]>
nginxå’Œtomcat负蝲½Ž€å•配¾|?windows环境)http://www.aygfsteel.com/freeman1984/archive/2011/12/07/365726.html疯狂疯狂Wed, 07 Dec 2011 02:40:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365726.htmlhttp://www.aygfsteel.com/freeman1984/comments/365726.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/12/07/365726.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/365726.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/365726.html阅读全文

]]>
hibernateåQŒspring½Ž¡ç†äº‹åŠ¡ä¸?transactionåQŒJDBC connectionåQŒHibernate Sessionçš„ä‹É用研½I?åQˆä¸€åQ?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 18 Nov 2011 03:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/363984.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/363984.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/363984.html</trackback:ping><description><![CDATA[如果单独使用hibernate可参考上一½‹‡æ–‡ç«?a href="http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html">http://www.aygfsteel.com/freeman1984/archive/2011/08/04/355808.html</a><br /><br /><strong>首先hibernateçš„Connection release mode有以下几¿Uï¼š<br /></strong>1 after_statement 2 after_transaction 3 on_close 其中after_statement 用在jtaä¸?åQ?span style="color: red"><strong>on_close æ˜?.1ä¹‹å‰é—ç•™çš„ï¼ˆä¹Ÿè®¸æ˜¯äØ“spring留的-_-åQ‰ï¼Œä¹Ÿå°±æ˜?.1之前默认是on_close åQŒä½†3.1之后默认如果单独使用hibernate是after_transactionåQ?/strong></span>如果有第三方事务½Ž¡ç†åQŒå°±ç”¨ç¬¬ä¸‰æ–¹æä¾›çš„默认å€û|¼Œspringž®±æ˜¯é»˜è®¤ä½¿ç”¨äº†on_closeã€?br /><strong>在spring½Ž¡ç†äº‹åŠ¡ä¸­æˆ‘ä»¬çœ‹çœ‹ç³»¾lŸå¯åŠ¨åŽé»˜è®¤ä½¿ç”¨çš„é…¾|®ï¼š<br /></strong>1,ransaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory使用spring事务½{–ç•¥<br />2åQŒhibernate内部 Automatic session close at end of transaction: disabled å› äØ“å·²ç»äº¤ç»™springäº?br />3   Connection release mode: auto 默认åQŒä¹Ÿž®±æ˜¯æ²¡æœ‰é…ç½®hibernate.connection.release_mode的时候,但是˜q™é‡Œæœ‰åœ°æ–šwœ€è¦æ³¨æ„ï¼šä¹Ÿå°±æ˜¯å‰é¢æåˆ°çš„使用½W¬ä¸‰æ–¹ç­–略时的问题:看一下代码: <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">String releaseModeName </span><span style="color: #000000">=</span><span style="color: #000000"> PropertiesHelper.getString( Environment.RELEASE_CONNECTIONS, properties, </span><span style="color: #000000">"</span><span style="color: #000000">auto</span><span style="color: #000000">"</span><span style="color: #000000"> );<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />        log.info( </span><span style="color: #000000">"</span><span style="color: #000000">Connection release mode: </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> releaseModeName );<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />        ConnectionReleaseMode releaseMode;<br /><img id="Codehighlighter1_246_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_311_Open_Text.style.display='none'; Codehighlighter1_246_311_Closed_Image.style.display='inline'; Codehighlighter1_246_311_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_246_311_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_246_311_Closed_Text.style.display='none'; Codehighlighter1_246_311_Open_Image.style.display='inline'; Codehighlighter1_246_311_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif">        </span><span style="color: #0000ff">if</span><span style="color: #000000"> ( </span><span style="color: #000000">"</span><span style="color: #000000">auto</span><span style="color: #000000">"</span><span style="color: #000000">.equals(releaseModeName) ) </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_246_311_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_246_311_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />            </span><span style="color: red">releaseMode </span><span style="color: red">=</span><span style="color: red"> transactionFactory.getDefaultReleaseMode();        }</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" /></span></span><span style="color: #000000"><br /><img id="Codehighlighter1_320_663_Open_Image" onclick="this.style.display='none'; Codehighlighter1_320_663_Open_Text.style.display='none'; Codehighlighter1_320_663_Closed_Image.style.display='inline'; Codehighlighter1_320_663_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_320_663_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_320_663_Closed_Text.style.display='none'; Codehighlighter1_320_663_Open_Image.style.display='inline'; Codehighlighter1_320_663_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif">        </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_320_663_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_320_663_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />            releaseMode </span><span style="color: #000000">=</span><span style="color: #000000"> ConnectionReleaseMode.parse( releaseModeName );<br /><img id="Codehighlighter1_494_659_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_659_Open_Text.style.display='none'; Codehighlighter1_494_659_Closed_Image.style.display='inline'; Codehighlighter1_494_659_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_494_659_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_494_659_Closed_Text.style.display='none'; Codehighlighter1_494_659_Open_Image.style.display='inline'; Codehighlighter1_494_659_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif">            </span><span style="color: #0000ff">if</span><span style="color: #000000"> ( releaseMode </span><span style="color: #000000">==</span><span style="color: #000000"> ConnectionReleaseMode.AFTER_STATEMENT </span><span style="color: #000000">&&</span><span style="color: #000000"> </span><span style="color: #000000">!</span><span style="color: #000000">connections.supportsAggressiveRelease() ) </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_494_659_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_494_659_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />                log.warn( </span><span style="color: #000000">"</span><span style="color: #000000">Overriding release mode as connection provider does not support 'after_statement'</span><span style="color: #000000">"</span><span style="color: #000000"> );<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />                releaseMode </span><span style="color: #000000">=</span><span style="color: #000000"> ConnectionReleaseMode.AFTER_TRANSACTION;<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />            }</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />        }</span></span></div>其中¾U¢è‰²éƒ¨åˆ†ž®±æ˜¯è°ƒç”¨äº†spring提供的默认å€û|¼Œè€Œspring的默认å€û|¼šåœ¨jtaå’Œcmt中都默认使用的是after_statement<br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_0_328_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_328_Open_Text.style.display='none'; Codehighlighter1_0_328_Closed_Image.style.display='inline'; Codehighlighter1_0_328_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_328_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_328_Closed_Text.style.display='none'; Codehighlighter1_0_328_Open_Image.style.display='inline'; Codehighlighter1_0_328_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_328_Closed_Text">/** */</span><span id="Codehighlighter1_0_328_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * Sets connection release mode "on_close" as default.<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * <p>This was the case for Hibernate 3.0; Hibernate 3.1 changed<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * it to "auto" (i.e. "after_statement" or "after_transaction").<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * However, for Spring's resource management (in particular for<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />     * HibernateTransactionManager), "on_close" is the better default.<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />     </span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_384_428_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_428_Open_Text.style.display='none'; Codehighlighter1_384_428_Closed_Image.style.display='inline'; Codehighlighter1_384_428_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_384_428_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_384_428_Closed_Text.style.display='none'; Codehighlighter1_384_428_Open_Image.style.display='inline'; Codehighlighter1_384_428_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> ConnectionReleaseMode getDefaultReleaseMode() </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_384_428_Closed_Text"><img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /></span><span id="Codehighlighter1_384_428_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> ConnectionReleaseMode.ON_CLOSE;<br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />    }</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span></div><br />而springä¸ÞZ»€ä¹ˆè¦ä½¿ç”¨on_close åQŒè€Œä¸æ˜¯ç”¨after_transaction ,我们æƒÏxƒ³opensessioninview的原理也许能明白åQŒsession在view成还要ä‹É用,所以不能再transactio<span>n使用完后关闭JDBC connectionåQŒå¿…™å»è¦åœ¨session之后åQŒæ‰€ä»¥è¦ä½¿ç”¨on<strong>_close</strong></span><strong><span>åQ?/span><span>也就是在on session(flush.autoåQŒæˆ–者flush.Eagerly) 关闭åQ‰ã€‚è¿™¿Uæƒ…况hibernate内部˜q˜ä¼šåœ¨spring关闭JDBC connection后提½C?费解åQŒå› ä¸ºafter transaction之后session没有关闭åQŒä½†æ˜?nbsp;Connection release mode配置的是on_close,session的关闭和 Connection 的关闭都由spring来管理,hibernatež®×ƒ¸çŸ¥é“äº?åQŒæ‰€ä»¥hibernate有好的提½Cºå¦‚ä¸?其实sessionåQŒå·²¾lå…³é—­ã€‚当焉™šç€session的关闭jdbc链接释放回连接池)åQ?/span><br /><span style="color: red">transaction completed on session with on_close connection release mode; be sure to cl</span></strong>ose the session to release JDBC resources!åQ?br /><br />。当然我们也可以使用after_transaction åQŒè¿™¿Uæƒ…况对使用¾~–程式事务非帔R€‚用ã€?br />     <img src ="http://www.aygfsteel.com/freeman1984/aggbug/363984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-11-18 11:25 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/11/18/363984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsessionid 问题分析http://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html疯狂疯狂Fri, 02 Sep 2011 08:33:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.htmlhttp://www.aygfsteel.com/freeman1984/comments/357833.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/09/02/357833.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/357833.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/357833.html阅读全文

]]>
raid技æœ?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 21 Jun 2011 09:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/352756.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/352756.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/352756.html</trackback:ping><description><![CDATA[<h3><span style="letter-spacing: 0.25pt">RAID 0</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQšæ— å·®é”™æŽ§åˆ¶çš„å¸¦åŒºç»„</span><span style="letter-spacing: 0.25pt"></span></h3> <p><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p style="text-indent: 15.75pt"><span style="font-family: 宋体">要实çŽ?/span>RAID0<span style="font-family: 宋体">必须要有两个以上¼‹¬ç›˜é©±åŠ¨å™¨ï¼Œ</span>RAID0<span style="font-family: 宋体">实现了带区组åQŒæ•°æ®åƈ不是保存在一个硬盘上åQŒè€Œæ˜¯åˆ†æˆæ•°æ®å—保存在不同驱动器上。因为将数据分布在不同驱动器上,所以数据吞吐率大大提高åQŒé©±åŠ¨å™¨çš„è´Ÿè½½ä¹Ÿæ¯”è¾ƒòqŒ™¡¡ã€‚如果刚好所需要的数据在不同的驱动器上效率最好。它不需要计½Ž—校验码åQŒå®žçŽ°å®¹æ˜“ã€‚å®ƒçš„ç¼ºç‚ÒŽ˜¯å®ƒæ²¡æœ‰æ•°æ®å·®é”™æŽ§åˆÓž¼Œå¦‚果一个驱动器中的数据发生错误åQŒå³ä½¿å…¶å®ƒç›˜ä¸Šçš„æ•°æ®æ­£ç¡®ä¹Ÿæ— ‹¹ŽäºŽäº‹äº†ã€‚不应该ž®†å®ƒç”¨äºŽå¯ÒŽ•°æ®ç¨³å®šæ€§è¦æ±‚高的场合。如果用戯‚¿›è¡Œå›¾è±¡ï¼ˆåŒ…括动画åQ‰ç¼–辑和其它要求传输比较大的场合使用</span>RAID0<span style="font-family: 宋体">比较合适。同æ—Óž¼Œ</span>RAID<span style="font-family: 宋体">可以提高数据传输速率åQŒæ¯”如所需è¯Õd–的文件分布在两个¼‹¬ç›˜ä¸Šï¼Œ˜q™ä¸¤ä¸ªç¡¬ç›˜å¯ä»¥åŒæ—¶è¯»å–。那么原来读取同æ äh–‡ä»¶çš„æ—‰™—´è¢«ç¾ƒçŸ­äØ“</span>1/2<span style="font-family: 宋体">。在所有的¾U§åˆ«ä¸­ï¼Œ</span>RAID 0<span style="font-family: 宋体">的速度是最快的。但æ˜?/span>RAID 0<span style="font-family: 宋体">没有冗余功能的,如果一个磁盘(物理åQ‰æŸåï¼Œåˆ™æ‰€æœ‰çš„æ•°æ®éƒ½æ— æ³•ä‹É用ã€?/span></p> <p style="text-indent: 21pt">RAID0<span style="font-family: 宋体">又称ä¸?/span>Stripe<span style="font-family: 宋体">æˆ?/span>Striping<span style="font-family: 宋体">åQŒå®ƒä»£è¡¨äº†æ‰€æœ?/span>RAID<span style="font-family: 宋体">¾U§åˆ«ä¸­æœ€é«˜çš„</span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">性能ã€?/span>RAID 0<span style="font-family: 宋体">提高存储性能的原理是把连¾l­çš„æ•°æ®åˆ†æ•£åˆ°å¤šä¸ªç£ç›˜ä¸Šå­˜å–åQŒè¿™æ øP¼Œ¾pȝ»Ÿæœ‰æ•°æ®è¯·æ±‚å°±å¯ä»¥è¢«å¤šä¸ªç£ç›˜åÆˆè¡Œçš„æ‰§è¡ŒåQŒæ¯ä¸ªç£ç›˜æ‰§è¡Œå±žäºŽå®ƒè‡ªå·±çš„那部分数据è¯äh±‚。这¿Uæ•°æ®ä¸Šçš„åÆˆè¡Œæ“ä½œå¯ä»¥å……åˆ†åˆ©ç”¨æ€Èº¿çš„带宽,显著提高¼‚ç›˜æ•´ä½“存取性能ã€?/span></p> <p><span style="font-family: 宋体">  如图所½C?/span>:<span style="font-family: 宋体">¾pȝ»Ÿå‘三个磁盘组成的逻辑¼‹¬ç›˜</span>(RADI 0 <span style="font-family: 宋体">¼‚ç›˜¾l?/span>)<span style="font-family: 宋体">发出çš?/span>I/O<span style="font-family: 宋体">数据è¯äh±‚被è{åŒ–äØ“</span>3<span style="font-family: 宋体">™åÒŽ“ä½œï¼Œå…¶ä¸­çš„æ¯ä¸€™åÒŽ“ä½œéƒ½å¯¹åº”于一块物理硬盘。我们从图中可以清楚的看到通过建立</span>RAID 0<span style="font-family: 宋体">åQŒåŽŸå…ˆé¡ºåºçš„æ•°æ®è¯äh±‚被分散到所有的三块¼‹¬ç›˜ä¸­åŒæ—¶æ‰§è¡Œã€?/span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p><span style="font-family: 宋体">  从理è®ÞZ¸Šè®ÔŒ¼Œä¸‰å—¼‹¬ç›˜çš„åÆˆè¡Œæ“ä½œä‹É同一旉™—´å†…磁盘读写速度提升äº?/span>3<span style="font-family: 宋体">倍ã€?/span> <span style="font-family: 宋体">但由于æ€Èº¿å¸¦å®½½{‰å¤š¿Uå› ç´ çš„影响åQŒå®žé™…的提升速率肯定会低于理论å€û|¼Œä½†æ˜¯åQŒå¤§é‡æ•°æ®åƈ行传输与串行传输比较åQŒæé€Ÿæ•ˆæžœæ˜¾è‘—显然毋庸置疑ã€?/span></p> <p><span style="font-family: 宋体">  </span>RAID 0<span style="font-family: 宋体">的缺ç‚ÒŽ˜¯ä¸æä¾›æ•°æ®å†—余,因此一旦用æˆäh•°æ®æŸåï¼ŒæŸåçš„æ•°æ®å°†æ— æ³•得到恢复ã€?/span></p> <p><span style="font-family: 宋体">  </span>RAID 0<span style="font-family: 宋体">å…ähœ‰çš„特点,使其特别适用于对性能要求较高åQŒè€Œå¯¹æ•°æ®</span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">不太在乎的领域,如图形工作站½{‰ã€‚å¯¹äºŽä¸ªäººç”¨æˆøP¼Œ</span>RAID 0<span style="font-family: 宋体">也是提高¼‹¬ç›˜å­˜å‚¨æ€§èƒ½çš„绝佳选择ã€?/span></p> <p> </p> <h3><span style="letter-spacing: 0.25pt">RAID 1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQšé•œè±¡ç»“æž?/span></h3> <p style="text-align: center; margin: 1.5pt 0cm 0pt;background: #f6f6f6; word-break: break-all" align="center"><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p style="text-indent: 22pt"><span style="font-family: 宋体; letter-spacing: 0.25pt">对于使用˜q™ç§</span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">¾l“构的设备来è¯ß_¼Œ</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">控制器必™å»èƒ½å¤ŸåŒæ—¶å¯¹ä¸¤ä¸ªç›˜è¿›è¡Œè¯»æ“ä½œå’Œå¯¹ä¸¤ä¸ªé•œè±¡ç›˜è¿›è¡Œå†™æ“ä½œã€‚通过下面的结构图您也可以看到必须有两个驱动器。因为是镜象¾l“构在一¾l„盘出现问题æ—Óž¼Œå¯ä»¥ä½¿ç”¨é•œè±¡åQŒæé«˜ç³»¾lŸçš„定w”™èƒ½åŠ›ã€‚å®ƒæ¯”è¾ƒå®ÒŽ˜“设计和实现。每è¯ÖM¸€‹Æ¡ç›˜åªèƒ½è¯Õd‡ºä¸€å—数据,也就是说数据块传送速率与单独的盘的è¯Õd–速率相同。因ä¸?/span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">的校验十分完备,因此对系¾lŸçš„处理能力有很大的影响åQŒé€šå¸¸çš?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">功能ç”ÞpÊY件实玎ͼŒè€Œè¿™æ ïLš„实现æ–ÒŽ³•在服务器负蝲比较重的时候会大大影响服务器效率。当您的¾pȝ»Ÿéœ€è¦æžé«˜çš„可靠性时åQŒå¦‚˜q›è¡Œæ•°æ®¾lŸè®¡åQŒé‚£ä¹ˆä‹Éç”?/span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">比较合适。而且</span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">技术支æŒ?/span><span style="letter-spacing: 0.25pt">“</span><span style="font-family: 宋体; letter-spacing: 0.25pt">热替æ?/span><span style="letter-spacing: 0.25pt">”</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQŒå³ä¸æ–­ç”늚„情况下对故障¼‚ç›˜˜q›è¡Œæ›´æ¢åQŒæ›´æ¢å®Œæ¯•只要从镜像盘上恢复数据卛_¯ã€‚当ä¸È¡¬ç›˜æŸåæ—¶åQŒé•œåƒç¡¬ç›˜å°±å¯ä»¥ä»£æ›¿ä¸È¡¬ç›˜å·¥ä½œã€‚镜像硬盘相当于一个备份盘åQŒå¯æƒŒ™€ŒçŸ¥åQŒè¿™¿Uç¡¬ç›˜æ¨¡å¼çš„安全性是非常高的åQ?/span><span style="letter-spacing: 0.25pt">RAID 1</span><span style="font-family: 宋体; letter-spacing: 0.25pt">的数据安全性在所有的</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">¾U§åˆ«ä¸Šæ¥è¯´æ˜¯æœ€å¥½çš„。但是其¼‚ç›˜çš„利用率却只æœ?/span><span style="letter-spacing: 0.25pt">50%</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQŒæ˜¯æ‰€æœ?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">¾U§åˆ«ä¸­æœ€ä½Žçš„ã€?/span></p> <p><span style="font-family: 宋体"> </span><span style="letter-spacing: 0.25pt">RAID1</span><span style="font-family: 宋体">又称ä¸?/span>Mirror<span style="font-family: 宋体">æˆ?/span>Mirroring<span style="font-family: 宋体">åQŒå®ƒçš„宗旨是最大限度的保证用户数据的可用性和可修复性ã€?/span> RAID 1<span style="font-family: 宋体">的操作方式是把用户写入硬盘的数据癑ֈ†ä¹‹ç™¾åœ°è‡ªåŠ¨å¤åˆ¶åˆ°å¦å¤–ä¸€ä¸ªç¡¬ç›˜ä¸Šã€?/span></p> <p><span style="font-family: 宋体">  当读取数据时åQŒç³»¾lŸå…ˆä»?/span>RAID 0<span style="font-family: 宋体">的源盘读取数据,如果è¯Õd–数据成功åQŒåˆ™¾pȝ»Ÿä¸åŽ»½Ž¡å¤‡ä»½ç›˜ä¸Šçš„æ•°æ®</span>;<span style="font-family: 宋体">如果è¯Õd–源盘数据å¤ÞpÓ|åQŒåˆ™¾pȝ»Ÿè‡ªåŠ¨è½¬è€Œè¯»å–å¤‡ä»½ç›˜ä¸Šçš„æ•°æ®åQŒä¸ä¼šé€ æˆç”¨æˆ·å·¥ä½œä»ÕdŠ¡çš„ä¸­æ–­ã€‚å½“ç„Óž¼Œæˆ‘们应当及时地更换损坏的¼‹¬ç›˜òq¶åˆ©ç”¨å¤‡ä»½æ•°æ®é‡æ–°å¾ç«?/span>Mirror<span style="font-family: 宋体">åQŒé¿å…å¤‡ä»½ç›˜åœ¨å‘生损坏时åQŒé€ æˆä¸å¯æŒ½å›žçš„æ•°æ®æŸå¤±ã€?/span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p><span style="font-family: 宋体">  ç”׃ºŽå¯?/span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">的数据进行百分之癄¡š„备䆾åQŒåœ¨æ‰€æœ?/span>RAID<span style="font-family: 宋体">¾U§åˆ«ä¸­ï¼Œ</span>RAID 1<span style="font-family: 宋体">提供最高的数据</span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">ä¿éšœã€‚åŒæ øP¼Œç”׃ºŽæ•°æ®çš„百分之癑֤‡ä»½ï¼Œå¤‡ä†¾æ•°æ®å äº†æ€Õd­˜å‚¨ç©ºé—´çš„一半,因而,</span>Mirror<span style="font-family: 宋体">的磁盘空间利用率低,存储成本高ã€?/span></p> <p><span style="font-family: 宋体">  </span>Mirror<span style="font-family: 宋体">虽不能提高存储性能åQŒä½†ç”׃ºŽå…¶å…·æœ‰çš„高数据安全性,使其ž®¤å…¶é€‚用于存æ”ùN‡è¦æ•°æ®ï¼Œå¦?/span><span style="font-family: 宋体"><span>服务å™?/span></span><span style="font-family: 宋体">和数据库存储½{‰é¢†åŸŸã€?/span></p> <p> </p> <h3>RAID 0+1</h3> <p>RAID 0+1:<span style="font-family: 宋体">正如其名字一æ ?/span>RAID 0+1<span style="font-family: 宋体">æ˜?/span>RAID 0<span style="font-family: 宋体">å’?/span>RAID 1<span style="font-family: 宋体">的组合åŞ式,也称ä¸?/span>RAID 10<span style="font-family: 宋体">ã€?/span></p> <p><span style="font-family: 宋体">  以四个磁盘组成的</span>RAID 0+1<span style="font-family: 宋体">ä¸ÞZ¾‹åQŒå…¶æ•°æ®</span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">方式如图所½C?/span>:RAID 0+1<span style="font-family: 宋体">是存储性能和数æ?/span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">兼顾的方案。它在提供与</span>RAID 1<span style="font-family: 宋体">一æ ïLš„æ•°æ®å®‰å…¨ä¿éšœçš„同æ—Óž¼Œä¹Ÿæä¾›äº†ä¸?/span>RAID 0<span style="font-family: 宋体">˜q‘似的存储性能ã€?/span></p> <p><span style="font-family: 宋体">  ç”׃ºŽ</span>RAID 0+1<span style="font-family: 宋体">也通过数据çš?/span>100%<span style="font-family: 宋体">备䆾提供数据安全保障åQŒå› æ­?/span>RAID 0+1<span style="font-family: 宋体">的磁盘空间利用率ä¸?/span>RAID 1<span style="font-family: 宋体">相同åQŒå­˜å‚¨æˆæœ¬é«˜ã€?/span></p> <p style="text-align: center; line-height: 160%" align="center"></p> <p>RAID 0+1<span style="font-family: 宋体">的特点ä‹É其特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域åQŒå¦‚银行、金融、商业超市、仓储库æˆÑ€å„¿Uæ¡£æ¡ˆç®¡ç†ç­‰ã€?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID2</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQšå¸¦‹¹äh˜Žç æ ¡éª?/span></h3> <p><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p><span style="font-family: 宋体; letter-spacing: 0.25pt">从概念上è®ÔŒ¼Œ</span><span style="letter-spacing: 0.25pt">RAID 2 </span><span style="font-family: 宋体; letter-spacing: 0.25pt">å?/span><span style="letter-spacing: 0.25pt">RAID 3</span><span style="font-family: 宋体; letter-spacing: 0.25pt">¾cÖM¼¼åQ?/span> <span style="font-family: 宋体; letter-spacing: 0.25pt">两者都是将数据条块化分布于不同的硬盘上åQ?/span> <span style="font-family: 宋体; letter-spacing: 0.25pt">条块单位ä¸ÞZ½æˆ–字节。然è€?/span><span style="letter-spacing: 0.25pt">RAID 2 </span><span style="font-family: 宋体; letter-spacing: 0.25pt">使用一定的¾~–码技术来提供错误‹‚€æŸ¥åŠæ¢å¤ã€‚è¿™¿Uç¼–码技术需要多个磁盘存放检查及恢复信息åQŒä‹Éå¾?/span><span style="letter-spacing: 0.25pt">RAID 2</span><span style="font-family: 宋体; letter-spacing: 0.25pt">技术实施更复杂。因此,在商业环境中很少使用。下囑ַ¦è¾¹çš„各个¼‚ç›˜ä¸Šæ˜¯æ•°æ®çš„各个位åQŒç”±ä¸€ä¸ªæ•°æ®ä¸åŒçš„位运½Ž—得到的‹¹äh˜Žæ ¡éªŒç å¯ä»¥ä¿å­˜å¦ä¸€¾l„磁盘上åQŒå…·ä½“情况请见下图。由于æ“v明码的特点,它可以在数据发生错误的情况下ž®†é”™è¯¯æ ¡æ­£ï¼Œä»¥ä¿è¯è¾“出的正确。它的数据传送速率相当高,如果希望辑ֈ°æ¯”较理想的速度åQŒé‚£æœ€å¥½æé«˜ä¿å­˜æ ¡éªŒç </span><span style="letter-spacing: 0.25pt">ECC</span><span style="font-family: 宋体; letter-spacing: 0.25pt">码的¼‹¬ç›˜åQŒå¯¹äºŽæŽ§åˆ¶å™¨çš„设计来è¯ß_¼Œå®ƒåˆæ¯?/span><span style="letter-spacing: 0.25pt">RAID3</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQ?/span><span style="letter-spacing: 0.25pt">4</span><span style="font-family: 宋体; letter-spacing: 0.25pt">æˆ?/span><span style="letter-spacing: 0.25pt">5</span><span style="font-family: 宋体; letter-spacing: 0.25pt">要简单。没有免费的午餐åQŒè¿™é‡Œä¹Ÿä¸€æ øP¼Œè¦åˆ©ç”¨æ“v明码åQŒå¿…™å»è¦ä»˜å‡ºæ•°æ®å†—余的代仗÷€‚输出数据的速率与驱动器¾l„中速度最慢的相等ã€?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID3</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQšå¸¦å¥‡å¶æ ¡éªŒç çš„òq¶è¡Œä¼ é€?/span></h3> <p> </p> <p style="text-indent: 25pt"><span style="font-family: 宋体; letter-spacing: 0.25pt; font-size: 12pt">˜q™ç§æ ¡éªŒç ä¸ŽRAID2不同åQŒåªèƒ½æŸ¥é”™ä¸èƒ½çº é”™ã€‚它讉K—®æ•°æ®æ—¶ä¸€‹Æ¡å¤„理一个带区,˜q™æ ·å¯ä»¥æé«˜è¯Õd–和写入速度,它像RAID 0一样以òq¶è¡Œçš„æ–¹å¼æ¥å­˜æ”¾æ•°æ®åQŒä½†é€Ÿåº¦æ²¡æœ‰RAID 0快。校验码在写入数据时产生òq¶ä¿å­˜åœ¨å¦ä¸€ä¸ªç£ç›˜ä¸Šã€‚需要实现时用户必须要有三个以上的驱动器åQŒå†™å…¥é€ŸçŽ‡ä¸Žè¯»å‡ºé€ŸçŽ‡éƒ½å¾ˆé«˜ï¼Œå› äØ“æ ¡éªŒä½æ¯”è¾ƒå°‘åQŒå› æ­¤è®¡½Ž—时间相对而言比较ž®‘。用软äšg实现RAID控制ž®†æ˜¯ååˆ†å›°éš¾çš„,控制器的实现也不是很å®ÒŽ˜“。它主要用于囑ÖÅžåQˆåŒ…括动画)½{‰è¦æ±‚吞吐率比较高的场合。不同于RAID 2åQŒRAID 3使用单块¼‚ç›˜å­˜æ”¾å¥‡å¶æ ¡éªŒä¿¡æ¯ã€‚如果一块磁盘失效,奇偶盘及其他数据盘可以重æ–îCñ”生数据。如果奇偶盘失效åQŒåˆ™ä¸åª„响数据ä‹É用。RAID 3对于大量的连¾l­æ•°æ®å¯æä¾›å¾ˆå¥½çš„传输率åQŒä½†å¯¹äºŽéšæœºæ•°æ®åQŒå¥‡å¶ç›˜ä¼šæˆä¸ºå†™æ“ä½œçš„瓶颈。利用单独的校验盘来保护数据虽然没有镜像的安全性高åQŒä½†æ˜¯ç¡¬ç›˜åˆ©ç”¨çŽ‡å¾—åˆ°äº†å¾ˆå¤§çš„æé«˜åQŒäØ“åQˆn-1åQ?nã€?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID4</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQšå¸¦å¥‡å¶æ ¡éªŒç çš„独立¼‚ç›˜¾l“æž„</span></h3> <p><span style="font-family: 宋体">  </span> </p> <p style="text-indent: 26.25pt">RAID4<span style="font-family: 宋体">å’?/span>RAID3<span style="font-family: 宋体">很象åQŒä¸åŒçš„æ˜¯ï¼Œå®ƒå¯¹æ•°æ®çš„访问是按数据块˜q›è¡Œçš„,也就是按¼‚ç›˜˜q›è¡Œçš„,每次是一个盘。在图上可以˜q™ä¹ˆçœ‹ï¼Œ</span>RAID3<span style="font-family: 宋体">是一‹Æ¡ä¸€æ¨ªæ¡åQŒè€?/span>RAID4<span style="font-family: 宋体">一‹Æ¡ä¸€ç«–条。它的特点的</span>RAID3<span style="font-family: 宋体">也挺象,不过在失败恢复时åQŒå®ƒçš„难度可要比</span>RAID3<span style="font-family: 宋体">大得多了åQŒæŽ§åˆ¶å™¨çš„设计难度也要大许多åQŒè€Œä¸”讉K—®æ•°æ®çš„æ•ˆçŽ‡ä¸æ€Žä¹ˆå¥½ã€?/span></p> <h3><span style="letter-spacing: 0.25pt">RAID5</span><span style="font-family: 宋体; letter-spacing: 0.25pt">åQšåˆ†å¸ƒå¼å¥‡å¶æ ¡éªŒçš„独立磁盘结æž?/span></h3> <p style="text-align: center; margin: 1.5pt 0cm 0pt;background: #f6f6f6; word-break: break-all" align="center"><span style="font-family: 宋体; letter-spacing: 0.25pt">  </span> </p> <p style="text-indent: 21pt"><span style="font-family: 宋体">从它的示意图上可以看刎ͼŒå®ƒçš„奇偶校验码存在于所有磁盘上åQŒå…¶ä¸­çš„</span>p0<span style="font-family: 宋体">代表½W?/span>0<span style="font-family: 宋体">带区的奇偶校验å€û|¼Œå…¶å®ƒçš„æ„æ€ä¹Ÿç›¸åŒã€?/span>RAID5<span style="font-family: 宋体">的读出效率很高,写入效率一般,块式的集体访问效率不错。因为奇偶校验码在不同的¼‚ç›˜ä¸Šï¼Œæ‰€ä»¥æé«˜äº†å¯é æ€§ï¼Œå…è®¸å•个¼‚ç›˜å‡ºé”™ã€?/span>RAID 5<span style="font-family: 宋体">也是以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位åQŒè€Œæ˜¯ž®†æ•°æ®æ®µçš„æ ¡éªŒä½äº¤äº’å­˜æ”¾äºŽå„ä¸ªç¡¬ç›˜ä¸Šã€‚è¿™æ øP¼Œä»ÖM½•ä¸€ä¸ªç¡¬ç›˜æŸåï¼Œéƒ½å¯ä»¥æ ¹æ®å…¶å®ƒç¡¬ç›˜ä¸Šçš„æ ¡éªŒä½æ¥é‡å»ºæŸåçš„æ•°æ®ã€‚ç¡¬ç›˜çš„åˆ©ç”¨çŽ‡äØ“</span>n-1<span style="font-family: 宋体">ã€?/span> <span style="font-family: 宋体">ä½†æ˜¯å®ƒå¯¹æ•°æ®ä¼ è¾“çš„åÆˆè¡Œæ€§è§£å†³ä¸å¥½ï¼Œè€Œä¸”æŽ§åˆ¶å™¨çš„è®¾è®¡ä¹Ÿç›¸å½“å›°éš¾ã€?/span>RAID 3 <span style="font-family: 宋体">ä¸?/span>RAID 5<span style="font-family: 宋体">相比åQŒé‡è¦çš„区别在于</span>RAID 3<span style="font-family: 宋体">每进行一‹Æ¡æ•°æ®ä¼ è¾“,需涉及到所有的阵列盘。而对äº?/span>RAID 5<span style="font-family: 宋体">来说åQŒå¤§éƒ¨åˆ†æ•°æ®ä¼ è¾“åªå¯¹ä¸€å—ç£ç›˜æ“ä½œï¼Œå¯è¿›è¡ŒåÆˆè¡Œæ“ä½œã€‚åœ¨</span>RAID 5<span style="font-family: 宋体">中有</span>“<span style="font-family: 宋体">写损å¤?/span>”<span style="font-family: 宋体">åQŒå³æ¯ä¸€‹Æ¡å†™æ“ä½œåQŒå°†äº§ç”Ÿå››ä¸ªå®žé™…的读</span>/<span style="font-family: 宋体">写操作,其中两次è¯ÀL—§çš„æ•°æ®åŠå¥‡å¶ä¿¡æ¯åQŒä¸¤‹Æ¡å†™æ–°çš„æ•°æ®åŠå¥‡å¶ä¿¡æ¯ã€?/span> RAID-5<span style="font-family: 宋体">的话åQŒä¼˜ç‚ÒŽ˜¯æä¾›äº†å†—余性(支持一块盘掉线后仍然正常运行)åQŒç£ç›˜ç©ºé—´åˆ©ç”¨çŽ‡è¾ƒé«˜åQ?/span>N-1/N<span style="font-family: 宋体">åQ‰ï¼Œè¯Õd†™é€Ÿåº¦è¾ƒå¿«åQ?/span>N-1<span style="font-family: 宋体">倍)ã€?/span>RAID5<span style="font-family: 宋体">最大的好处是在一块盘掉线的情况下åQ?/span>RAID<span style="font-family: 宋体">照常工作åQŒç›¸å¯¹äºŽ</span>RAID0<span style="font-family: 宋体">必须每一块盘都正常才可以正常工作的状况容错性能好多了。因æ­?/span>RAID5<span style="font-family: 宋体">æ˜?/span>RAID<span style="font-family: 宋体">¾U§åˆ«ä¸­æœ€å¸¸è§çš„一个类型ã€?/span>RAID5<span style="font-family: 宋体">校验位即</span>P<span style="font-family: 宋体">位是通过其它条带数据做异æˆ?/span>(xor)<span style="font-family: 宋体">求得的。计½Ž—å…¬å¼äØ“</span>P=D0xorD1xorD2…xorDn<span style="font-family: 宋体">åQŒå…¶ä¸?/span>p<span style="font-family: 宋体">代表校验块,</span>Dn<span style="font-family: 宋体">代表相应的数据块åQ?/span>xor<span style="font-family: 宋体">是数学运½Ž—符号异或ã€?/span> </p> <p><span style="font-family: 宋体">  </span>RAID5<span style="font-family: 宋体">校验位算法详è§?/span> </p> <p><span style="font-family: 宋体">  </span>P=D1 xor D2 xor D3 … xor Dn <span style="font-family: 宋体">åQ?/span>D1,D2,D3 … Dn<span style="font-family: 宋体">为数据块åQ?/span>P<span style="font-family: 宋体">为校验,</span>xor<span style="font-family: 宋体">为异或运½Ž—)</span> </p> <p><span style="font-family: 宋体">  </span>XOR(Exclusive OR)<span style="font-family: 宋体">的校验原理如下表åQ?/span> </p> <p><span style="font-family: 宋体">  </span> </p> <table style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; border-top: #888888 1pt solid; border-right: #888888 1pt solid" border="1" cellpadding="0"> <tbody> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>A<span style="font-family: 宋体">å€?/span></p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>B<span style="font-family: 宋体">å€?/span></p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>Xor<span style="font-family: 宋体">¾l“æžœ</span></p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td></tr> <tr> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>1</p></td> <td style="border-bottom: #888888 1pt solid; border-left: #888888 1pt solid; padding-bottom: 1.5pt; background-color: transparent; padding-left: 5.05pt; width: 5cm; padding-right: 5.05pt; border-top: #888888 1pt solid; border-right: #888888 1pt solid; padding-top: 1.5pt" valign="top" width="189"> <p>0</p></td></tr></tbody></table> <p><span style="font-family: 宋体">  ˜q™é‡Œçš?/span>A<span style="font-family: 宋体">ä¸?/span>B<span style="font-family: 宋体">值就代表了两个位åQŒä»Žä¸­å¯ä»¥å‘玎ͼŒ</span>A<span style="font-family: 宋体">ä¸?/span>B<span style="font-family: 宋体">一æ äh—¶åQ?/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: 宋体">不一æ äh—¶åQ?/span>XOR<span style="font-family: 宋体">¾l“æžœž®±æ˜¯</span>1<span style="font-family: 宋体">åQŒå¦‚果知é?/span>XOR<span style="font-family: 宋体">¾l“æžœåQ?/span>A<span style="font-family: 宋体">å’?/span>B<span style="font-family: 宋体">中的ä»ÖM½•两个数å€û|¼Œž®±å¯ä»¥åæŽ¨å‡ºå‰©ä¸‹çš„一个数倹{€‚比å¦?/span>A<span style="font-family: 宋体">ä¸?/span>1<span style="font-family: 宋体">åQ?/span>XOR<span style="font-family: 宋体">¾l“æžœä¸?/span>1<span style="font-family: 宋体">åQŒé‚£ä¹?/span>B<span style="font-family: 宋体">肯定ä¸?/span>0<span style="font-family: 宋体">åQŒå¦‚æž?/span>XOR<span style="font-family: 宋体">¾l“æžœä¸?/span>0<span style="font-family: 宋体">åQŒé‚£ä¹?/span>B<span style="font-family: 宋体">肯定ä¸?/span>1<span style="font-family: 宋体">。这ž®±æ˜¯</span>XOR<span style="font-family: 宋体">¾~–码与校验的基本原理ã€?/span></p> <p style="text-indent: 26.25pt">RAID 5<span style="font-family: 宋体">是一¿U?/span><span style="font-family: 宋体"><span>存储</span></span><span style="font-family: 宋体">性能、数æ?/span><span style="font-family: 宋体"><span>安全</span></span><span style="font-family: 宋体">和存储成本兼™å„¡š„存储解决æ–ÒŽ¡ˆã€?/span> <span style="font-family: 宋体">以四个硬盘组成的</span>RAID 5<span style="font-family: 宋体">ä¸ÞZ¾‹åQŒå…¶æ•°æ®å­˜å‚¨æ–¹å¼å¦‚下图所½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">图中åQŒP0为D0åQŒD1å’ŒD2的奇偶校验信息,其它以此¾cÀLލã€?/p> <p><span style="font-family: 宋体">  由图中可以看出,</span>RAID 5<span style="font-family: 宋体">不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组æˆ?/span>RAID5<span style="font-family: 宋体">的各个磁盘上åQŒåƈ且奇偶校验信息和相对应的数据分别存储于不同的¼‚ç›˜ä¸Šã€‚当</span>RAID5<span style="font-family: 宋体">的一个磁盘数据发生损坏后åQŒåˆ©ç”¨å‰©ä¸‹çš„æ•°æ®å’Œç›¸åº”的奇偶校验信息åŽÀL¢å¤è¢«æŸåçš„æ•°æ®ã€?/span></p> <p style="text-indent: 21pt">RAID 5<span style="font-family: 宋体">可以理解为是</span>RAID 0<span style="font-family: 宋体">å’?/span>RAID 1<span style="font-family: 宋体">的折è¡äh–¹æ¡ˆã€?/span>RAID 5<span style="font-family: 宋体">可以为系¾lŸæä¾›æ•°æ®å®‰å…¨ä¿éšœï¼Œä½†ä¿éšœç¨‹åº¦è¦æ¯?/span>Mirror<span style="font-family: 宋体">低而磁盘空间利用率要比</span>Mirror<span style="font-family: 宋体">高ã€?/span>RAID 5<span style="font-family: 宋体">å…ähœ‰å’?/span>RAID 0<span style="font-family: 宋体">相近似的数据è¯Õd–速度åQŒåªæ˜¯å¤šäº†ä¸€ä¸ªå¥‡å¶æ ¡éªŒä¿¡æ¯ï¼Œå†™å…¥æ•°æ®çš„速度比对单个¼‚ç›˜˜q›è¡Œå†™å…¥æ“ä½œ½Eæ…¢ã€‚同时由于多个数据对应一个奇偶校验信息,</span>RAID 5<span style="font-family: 宋体">的磁盘空间利用率要比</span>RAID 1<span style="font-family: 宋体">高,存储成本相对较低ã€?/span></p> <h3><span style="font-family: 宋体">数据恢复</span></h3> <p style="text-indent: 25pt"><span style="font-family: 宋体; letter-spacing: 0.25pt; font-size: 12pt">一旦RAID阵列出现故障åQŒç¡¬ä»¶æœåŠ¡å•†åªèƒ½¾l™å®¢æˆ·é‡æ–°åˆå§‹åŒ–或者REBUILDåQŒè¿™æ ·å®¢æˆäh•°æ®å°±ä¼šæ— æ³•挽回。出现故障以后只要不寚w˜µåˆ—作初始化操作,ž®±æœ‰æœÞZ¼šæ¢å¤å‡ºæ•…éšœRAID¼‚ç›˜é˜µåˆ—的数据ã€?/span></p> <p style="text-indent: 22pt"><span style="font-family: 宋体; letter-spacing: 0.25pt">ç”׃ºŽ</span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">数据恢复的复杂性和技术难度较高,åœ?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">阵列出现故障æ—Óž¼Œä¸€å®šè¦æ‰¾æœ‰¾léªŒçš„专业数据恢复中心提供数据恢复帮助。判断专业数据恢复中心的标准包括数据恢复中心所使用çš?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">数据恢复工具、数据恢复工½E‹å¸ˆä»Žä¸š¾léªŒ½{‰ã€‚å› ä¸?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">阵列中存储的数据一般都比较重要åQŒä¸€æ—¦è¢«å½Õdº•损坏åQŒå°†é€ æˆæ— æ³•挽回的损失ã€?/span></p> <p style="text-indent: 22pt"><span style="font-family: 宋体; letter-spacing: 0.25pt">目前常用çš?/span><span style="letter-spacing: 0.25pt">RAID</span><span style="font-family: 宋体; letter-spacing: 0.25pt">阵列数据恢复工具包括效率æº?/span><span style="letter-spacing: 0.25pt">HD Doctor</span><span style="font-family: 宋体; letter-spacing: 0.25pt">、数据恢复指南针</span><span style="letter-spacing: 0.25pt">Data Compass</span><span style="font-family: 宋体; letter-spacing: 0.25pt">、硬盘复制机</span><span style="letter-spacing: 0.25pt">Data Copy King</span><span style="font-family: 宋体; letter-spacing: 0.25pt">½{‰ã€?/span></p> <p style="text-indent: 21pt"> </p> <p style="text-indent: 21pt"></p><img src ="http://www.aygfsteel.com/freeman1984/aggbug/352756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-06-21 17:07 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/06/21/352756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nginx tomcat负蝲配置http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344398.html疯狂疯狂Tue, 15 Feb 2011 15:08:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344398.htmlhttp://www.aygfsteel.com/freeman1984/comments/344398.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344398.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/344398.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344398.htmlNginx.conf :

user  oschina;
worker_processes  2;

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

#pid        logs/nginx.pid;

events {
    use epoll;
    worker_connections  2048;
}

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

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

    #access_log  off;
    access_log  logs/access.log;

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

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #keepalive_timeout  75 20;

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

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

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

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

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

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

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

gzip.conf:

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

proxy.conf:

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



]]>
Tomcat中限制ip讉K—®http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344326.html疯狂疯狂Tue, 15 Feb 2011 03:07:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344326.htmlhttp://www.aygfsteel.com/freeman1984/comments/344326.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344326.html#Feedback1http://www.aygfsteel.com/freeman1984/comments/commentRss/344326.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344326.htmlOriginal URL: http://www.miotour.com/2010/04/27/tomcat%e4%b8%ad%e9%99%90%e5%88%b6ip%e8%ae%bf%e9%97%ae/
Tomcat中限制ip讉K—®æ˜¯éžå¸¸ç®€å•çš„åQŒåªéœ€è¦ç¼–辑server.xmlæ–‡äšg卛_¯

vi server.xml

扑ֈ°context区域åQŒå¦‚

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

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

</context>

说明åQšåªé™åˆ¶127.0.0.1讉K—®

如要限制192.168.1.0-192.168.5.255�92.168.10.0-192.168.15.255

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


]]>
jkmount不è{发部åˆ?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 15 Feb 2011 02:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/344325.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/344325.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/344325.html</trackback:ping><description><![CDATA[<div>Original URL: <a title="jkmount不è{发部分请æ±? >http://www.miotour.com/2009/11/30/jkmount%e4%b8%8d%e8%bd%ac%e5%8f%91%e9%83%a8%e5%88%86%e8%af%b7%e6%b1%82/</a></div> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">½W¬ä¸€¿Uæƒ…形:部分静态页面需要apache处理åQŒä¸è½¬å‘¾l™åŽç«¯çš„tomcat<br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount  <wbr>/*  <wbr>  <wbr>router <wbr> <wbr>  <wbr>###默认ž®†æ‰€æœ‰è¯·æ±‚è{发给tomcat处理<br /> </span><span style="color: #ff0000">JKUnmount</span> <span style="color: #ff0000">/*.php  <wbr> router <wbr> <wbr>  <wbr>###phpè¯äh±‚不交¾l™tomcat处理<br /> JKUnmount /*.htm  <wbr> router <wbr> <wbr>  <wbr>###htmè¯äh±‚不交¾l™tomcat处理<br /> JKUnmount /*.html  <wbr>router</span> <span style="color: #ff0000">###htmlè¯äh±‚不交¾l™tomcat处理</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>###cssè¯äh±‚不交¾l™tomcat处理<br /> JKUnmount  <wbr>  <wbr> /js/*  <wbr>  <wbr>  <wbr>  <wbr> router <wbr> <wbr>  <wbr> ###jsè¯äh±‚不交¾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">JKUnmount  <wbr>/image/*  <wbr> router <wbr> <wbr>  <wbr>###imageè¯äh±‚不交¾l™tomcat</span><span style="color: #ff0000">处理</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> <wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">½W¬äºŒ¿Uæƒ…形:ž®†æ‰€æœ‰è¯·æ±‚è{发到后端tomcat之后åQŒå°†ä¸åŒè·¯å¾„定位¾l™ä¸åŒçš„tomcat</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /*  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> router</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /login/*  <wbr>  <wbr> tomcat1</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /shop/*  <wbr>  <wbr> tomcat2</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /buy/*  <wbr>  <wbr>  <wbr> tomcat3</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> <wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">注意åQŒè¿™¿Uæƒ…形下åQŒå¿…™å»è¦æœ‰è¿™æ ïLš„处理åQ?/span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">worker.list=router,jkstatus,tomcat1,tomcat2,tomcat3</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">如果是第一¿Uæƒ…形,tomcat1,tomcat2,tomcat3是不需要写在上面这个地方的</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">而是写在下面åQ?/span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">worker.router.balance_workers=tomcat1,tomcat2,tomcat3</span><br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">实际使用中,应该是上˜qîC¸¤¿Uæƒ…形相¾l“合使用的较多,ž®†é™æ€å†…容交¾l™apache处理åQŒç„¶åŽå°†åŠ¨æ€å†…å®¹åˆ†å¸ƒåˆ°ä¸åŒçš„æœåŠ¡å™¨ä¸Šã€?br /> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> </p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"> <wbr></p> <p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">JkMount把匹配的转发到指定服务器.<br /> JkUnMount把匹配的不è{发到指定服务å™?<br /> <strong>JkUnMount选项的çñ”别高于JkMount</strong>.<br /> 单独有JkMount规则有效,ä½?strong>单独有JkUnMount无效</strong>,JkUnMount与JkMount要成对出çŽ?<br /> </p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/344325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-02-15 10:53 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache 集群tomcat配置参数说明http://www.aygfsteel.com/freeman1984/archive/2011/02/15/344322.html疯狂疯狂Tue, 15 Feb 2011 02:37:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344322.htmlhttp://www.aygfsteel.com/freeman1984/comments/344322.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/02/15/344322.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/344322.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/344322.htmlTomcat 集群配置
打开Server.xmlåQŒshutdown, ajp, http˜q™ä¸‰ä¸ªç«¯å£å°±ä¸å¤šè¯´äº†åQŒè§£å¼€ä¸‹é¢æ³¨é‡Š
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
jvmRouteçš„å€ÆD¦æ ÒŽ®apache的配¾|®ï¼Œä¸èƒ½å†²çªã€?br /> 接着是最重要的一点,tomcat默认集群配置åQ?lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>åQ‰æ—¶åQŒé…¾|®çš„¾l†èŠ‚å®žé™…ä¸Šè¢«çœç•¥äº†ï¼Œå¯¹äºŽå¤§å¤šæ•°åº”ç”¨è€Œè¨€åQŒä‹É用默认配¾|®å·²¾lèƒö够,完整的默认配¾|®åº”该是˜q™æ ·åQ?

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


<!--同步异步模式由channelSendOptions参数控制åQŒé»˜è®¤å€¼æ˜¯8åQŒäؓ异步模式åQ?是同步模式。在异步模式下,可以通过加上拯‚´¼‹®è®¤åQˆAcknowledgeåQ‰æ¥æé«˜å¯é æ€§ï¼Œæ­¤æ—¶channelSendOptionsè®¾äØ“10ã€?->  
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="6">  
<!---session 拯‚´æ–¹å¼ BackupManager 只拷贝部¾|²å½“前应用的服务器,DeltaManager 拯‚´æ–¹å¼all to all-->  
    <Manager className="org.apache.catalina.ha.session.BackupManager"  
        expireSessionsOnShutdown="false"  
        notifyListenersOnReplication="true"  
        mapSendOptions="6"/>  
    <!--   
    <Manager className="org.apache.catalina.ha.session.DeltaManager"  
    expireSessionsOnShutdown="false"  
    notifyListenersOnReplication="true"/>  
    -->  
    <!--Channel负责对tomcat集群的IO层进行配¾|?->  
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
        <!--Membership用于发现集群中的其他节点åQŒè¿™é‡Œçš„address用的是组播地址åQˆMulticast addressåQŒäº†è§£æ›´å¤šç»„播地址详情请参见http://zyycaesar.javaeye.com/admin/blogs/296501åQ‰ï¼Œä½¿ç”¨åŒä¸€ä¸ªç»„播地址和端口的多个节点同属一个子集群åQŒå› æ­¤é€šè¿‡è‡ªå®šä¹‰ç»„播地址和端口就可将一个大的tomcat集群分成多个子集¾Ÿ?->  
        <Membership className="org.apache.catalina.tribes.membership.McastService"  
            address="228.0.0.4"  
            port="45564"  
            frequency="500"  
            dropTime="3000"/>  
        <!--Receiver用于各个节点接收其他节点发送的数据åQŒåœ¨é»˜è®¤é…ç½®ä¸‹tomcat会从4000-4100间依‹Æ¡é€‰å–一个可用的端口˜q›è¡ŒæŽ¥æ”¶åQŒè‡ªå®šä¹‰é…ç½®æ—Óž¼Œå¦‚果多个tomcat节点在一台物理服务器上注意要使用不同的端å?->  
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
            address="auto"  
            port="5001"  
            selectorTimeout="100"  
            maxThreads="6"/>  
        <!--Sender用于向其他节点发送数据,具体实现通过Transport配置åQŒPooledParallelSender是从tcp˜qžæŽ¥æ± ä¸­èŽ·å–˜qžæŽ¥åQŒå¯ä»¥å®žçŽ°åÆˆè¡Œå‘é€ï¼Œå³é›†¾Ÿ¤ä¸­çš„多个节点可以同时向其他所有节点发送数据而互不媄å“?->  
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
        </Sender>  
        <!---Interceptor有点¾cÖM¼¼ä¸‹é¢ž®†è¦è§£é‡Šçš„ValveåQŒè“våˆîC¸€ä¸ªé˜€é—¨çš„作用åQŒåœ¨æ•°æ®åˆ°è¾¾ç›®çš„节点前进行检‹¹‹æˆ–其他操作åQŒå¦‚TcpFailureDetector用于‹‚€‹¹‹åœ¨æ•°æ®çš„传输过½E‹ä¸­æ˜¯å¦å‘生了tcp错误ã€?-->  
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>  
  
    </Channel>  
    <!--Valve用于在节点向客户端响应前˜q›è¡Œ‹‚€‹¹‹æˆ–˜q›è¡ŒæŸäº›æ“ä½œåQŒReplicationValvež®±æ˜¯ç”¨äºŽç”¨äºŽ‹‚€‹¹‹å½“前的响应是否涉及Session数据的更斎ͼŒå¦‚果是则启动Session拯‚´æ“ä½œåQŒfilter用于˜q‡æ×oè¯äh±‚åQŒå¦‚客户端对囄¡‰‡åQŒcssåQŒjs的请求就不会涉及SessionåQŒå› æ­¤ä¸éœ€‹‚€‹¹‹ï¼Œé»˜è®¤çŠ¶æ€ä¸‹ä¸è¿›è¡Œè¿‡æ»¤ï¼Œç›‘æµ‹æ‰€æœ‰çš„å“åº”.JvmRouteBinderValve会在前端的Apache mod_jk发生错误时保证同一客户端的è¯äh±‚发送到集群的同一个节ç‚?->  
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
    filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  
    <!--Deployer用于集群的farm功能åQŒç›‘控应用中文äšg的更斎ͼŒä»¥ä¿è¯é›†¾Ÿ¤ä¸­æ‰€æœ‰èŠ‚ç‚¹åº”ç”¨çš„ä¸€è‡´æ€§ï¼Œå¦‚æŸä¸ªç”¨æˆ·ä¸Šä¼ æ–‡ä»¶åˆ°é›†ç¾¤ä¸­æŸä¸ªèŠ‚ç‚¹çš„åº”ç”¨½E‹åºç›®å½•下,Deployer会监‹¹‹åˆ°˜q™ä¸€æ“ä½œòq¶æŠŠ˜q™ä¸€æ–‡äšg拯‚´åˆ°é›†¾Ÿ¤ä¸­å…¶ä»–节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能åQŒä¸˜q‡å¾ˆé—憾åQŒtomcat集群目前òq¶ä¸èƒ½åšåˆ°è¿™ä¸€ç‚¹ï¼Œå¼€å‘äh员正在努力实现它åQŒè¿™é‡Œçš„配置只是预留了一个接å?->  
    <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
        tempDir="/tmp/war-temp/"  
        deployDir="/tmp/war-deploy/"  
        watchDir="/tmp/war-listen/"  
        watchEnabled="false"/>  
  
    <!--Listener用于跟踪集群中节点发出和收到的数据,也有点类似Valve的功能ã€?->  
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
  
</Cluster>  
最后在Web.xml里面加上<distributable/>åQŒå®˜æ–ÒŽ–‡æ¡£æ²¡æœ‰è¿™ä¸ªï¼Œä½†æˆ‘觉得˜q˜æ˜¯åº”该加上åQŒå› ä¸ºæŒ‰ç…§æ ‡å‡†çš„tomcat启动åQŒå½“Host对象被创建时åQŒä¸€ä¸ªCluster对象åQˆé»˜è®¤é…¾|®ä¸‹æ˜¯SimpleTcpClusteråQ‰ä¹ŸåŒæ—¶è¢«å…³è”到˜q™ä¸ªHost对象。当某个应用在web.xml中设¾|®äº†distributableæ—Óž¼ŒTomcatž®†äؓ此应用的上下文环境创å»ÞZ¸€ä¸ªDeltaManager。SimpleTcpCluster启动membership服务和Replication服务ã€?br />
---

extra/httpd-mpm.conf 模块  

上边一æ ïLš„ž®×ƒ¸è´´äº†åQŒä¸»è¦æ˜¯ä¸‹è¾¹çš„配¾|®ï¼Œå› äؓ我用äº?span style="font-family: Arial, 宋体, sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px">mod_security模块åQŒæ‰€ä»¥è¦åšä¸€äº›é…¾|®ï¼Œ˜q™é‡Œä¸åšè§£é‡Šäº†ï¼Œå†™çš„很详¾l†ï¼Œæˆ‘比较喜‹Æ¢åœ¨é…ç½®æ–‡äšg里把å®ÒŽ˜“忘记的地方写上文档。毕竟这东西配完了就不再动了åQŒå¾ˆå®ÒŽ˜“忘记

# WinNT MPM

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

# MaxRequestsPerChild: maximum  number of requests a server process serves

#注意åQšThreadLimit指ä×o应当攑֜¨ThreadsPerChild之前åQŒå¦åˆ™ThreadsPerChild指ä×o生效后ThreadLimit会失效,而导致不必要的错è¯?ThreadLimit必须大于½{‰äºŽThreadsPerChild

#对于mpm_winntåQŒThreadLimit的默认值是1920åQ›å¯¹äºŽå…¶ä»–MPM˜q™ä¸ªå€¼æ˜¯64

#ThreadLimit ˜q™ä¸ªæŒ‡ä×o讄¡½®äº†æ¯ä¸ªå­˜q›ç¨‹å¯é…¾|®çš„¾U¿ç¨‹æ•°ThreadsPerChild上限。ä“Q何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效ã€?/p>

#ThreadLimit 使用˜q™ä¸ªæŒ‡ä×o时要特别当心。如果将ThreadLimit讄¡½®æˆä¸€ä¸ªé«˜å‡ºThreadsPerChild实际需要很多的å€û|¼Œž®†ä¼šæœ‰è¿‡å¤šçš„å…׃ín内存被分配ã€?/p>

#如果ž®†ThreadLimitå’ŒThreadsPerChild讄¡½®æˆè¶…˜q‡ç³»¾lŸçš„处理能力åQŒApache可能无法启动åQŒæˆ–者系¾lŸå°†å˜å¾—不稳定。该指ä×o的值应当和ThreadsPerChild大致保持一è‡?/p>

#ThreadsPerChild 每个子进½E‹å¾ç«‹çš„帔R©»çš„æ‰§è¡Œçº¿½E‹æ•°ã€‚默认值是25。子˜q›ç¨‹åœ¨å¯åŠ¨æ—¶å»ºç«‹˜q™äº›¾U¿ç¨‹åŽå°±ä¸å†å»ºç«‹æ–°çš„¾U¿ç¨‹äº†ã€?/p>

<IfModule mpm_winnt_module>

    ThreadLimit            2000

    ThreadsPerChild        2000

    MaxRequestsPerChild    2000

</IfModule>



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

(文:包一¼‚?/span>)

AJAX的出现极大的改变äº?/span>Web应用客户端的操作模式åQŒå®ƒä½¿çš„用户可以在全心工作时不必频繁的忍受那令äh厌恶的页面刷新。理è®ÞZ¸ŠAJAX技术在很大的程度上可以减少用户操作的等待时é—ß_¼ŒåŒæ—¶èŠ‚çº¦¾|‘络上的数据‹¹é‡ã€‚而然åQŒå®žé™…情况却òq¶ä¸æ€ÀL˜¯˜q™æ ·ã€‚用æˆäh—¶å¸æ€¼šæŠ±æ€¨ç”¨äº?/span>AJAX的系¾lŸå“åº”速度反而降低了ã€?/span>

½W”者从äº?/span>AJAXæ–šw¢çš„研发多òqß_¼Œå‚ä¸Žå¼€å‘äº†ç›®å‰å›½å†…è¾ƒäØ“æˆç†Ÿçš?/span>AJAXòq›_°-dorado。根据笔者的¾léªŒåQŒå¯¼è‡´è¿™¿Uç»“果的æ ÒŽœ¬åŽŸå› òq¶ä¸åœ?/span>AJAX。很多时候系¾lŸå“åº”速度的降低都是由不够合理的界面设计和不够高效的编½E‹ä¹ æƒ¯é€ æˆçš„。下面我们就来分析几ä¸?/span>AJAX开发过½E‹ä¸­éœ€è¦æ—¶åˆÀL³¨æ„çš„环节ã€?/span>

合理的ä‹É用客æˆïL«¯¾~–程和远½E‹è¿‡½E‹è°ƒç”¨ã€?/span>

客户端的¾~–程主要都是åŸÞZºŽJavaScript的。è€?/span>JavaScript是一¿Uè§£é‡Šåž‹çš„ç¼–½E‹è¯­­a€åQŒå®ƒçš„运行效率相对于Java½{‰éƒ½è¦ç¨é€Šä¸€½{V€‚同æ—?/span>JavaScript又是˜qè¡Œåœ¨æµè§ˆå™¨˜q™æ ·ä¸€ä¸ªä¸¥æ ¼å—限的环境当中。因此开发äh员对于哪些逻辑可以在客æˆïL«¯æ‰§è¡Œåº”该有一个清醒的认识ã€?/span>

在实际的应用中究竟应该怎样使用客户端编½E‹ï¼Œ˜q™ä¾èµ–于开发äh员的¾léªŒåˆ¤æ–­ã€‚这里很多问题是只可意会的。由于篇òq…有限,在这里我们大致归¾U›_‡ºä¸‹é¢˜q™å‡ ä¸ªæ³¨æ„äº‹™å¹ï¼š

ž®½å¯èƒ½é¿å…é¢‘¾Jçš„使用˜qœç¨‹˜q‡ç¨‹è°ƒç”¨åQŒä¾‹å¦‚避免在循环体中使用˜qœç¨‹˜q‡ç¨‹è°ƒç”¨ã€?/span>

如果可能的话ž®½å¯èƒ½ä‹Éç”?/span>AJAX方式的远½E‹è¿‡½E‹è°ƒç”¨ï¼ˆå¼‚步方式的远½E‹è¿‡½E‹è°ƒç”¨ï¼‰ã€?/span>

避免ž®†é‡é‡çñ”的数据操作放¾|®åœ¨å®¢æˆ·ç«¯ã€‚例如:大批量的数据复制操作、需要通过大量的数据遍历完成的计算½{‰ã€?/span>

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

客户端的¾~–程中,å¯?/span>DOM对象的操作往往是最å®ÒŽ˜“占用CPUæ—‰™—´çš„。而对äº?/span>DOM对象的操作,不同的编½E‹æ–¹æ³•之间的性能差异又往往是非常大的ã€?/span>

以下是三ŒDµè¿è¡Œç»“果完全相同的代码åQŒå®ƒä»¬çš„作用是在¾|‘页中创å»ÞZ¸€ä¸?/span>10x1000的表根{€‚然而它们的˜qè¡Œé€Ÿåº¦å´æœ‰ç€å¤©å£¤ä¹‹åˆ«ã€?/span>

/* ‹¹‹è¯•代码1 - 耗时: 41¿U?/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.6¿U?/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.26¿U?/span> */

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

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

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

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

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

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

     row.appendChild(cell);

 }

 tbody.appendChild(row);

}

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

table.appendChild(tbody);

document.body.appendChild(table);

˜q™é‡Œçš?#8220;‹¹‹è¯•代码1”å’?#8220;‹¹‹è¯•代码2”之间的差别在于在创徏表格单元时ä‹É用了不同çš?/span>APIæ–ÒŽ³•。è€?#8220;‹¹‹è¯•代码2”å’?#8220;‹¹‹è¯•代码3之间的差别在于处理顺序的略微不同ã€?/span>

“‹¹‹è¯•代码1”å’?#8220;‹¹‹è¯•代码2”之间如此大的性能差别我们无从分析åQŒç›®å‰æ‰€çŸ¥çš„æ˜?/span>insertRowå’?/span>insertCellæ˜?/span>DHTML中表格特有的APIåQ?/span>createElementå’?/span>appendChildæ˜?/span>W3C DOM的原ç”?/span>API。而前者应该是对后者的ž®è£…。不˜q‡ï¼Œæˆ‘们òq¶ä¸èƒ½å› æ­¤è€Œå¾—å‡ºç»“è®ø™®¤ä¸?/span>DOM的原ç”?/span>APIæ€ÀL˜¯ä¼˜äºŽå¯¹è±¡ç‰ÒŽœ‰çš?/span>API。徏议大家在需要频¾Jè°ƒç”¨æŸä¸€APIæ—Óž¼Œå¯¹å…¶æ€§èƒ½è¡¨çŽ°åšä¸€äº›åŸºæœ¬çš„‹¹‹è¯•ã€?/span>

“‹¹‹è¯•代码2”å’?#8220;‹¹‹è¯•代码3”之间的性能差异主要来自于他们的构徏™åºåºä¸åŒã€?#8220;‹¹‹è¯•代码2”的做法是首先创徏最外层çš?/span><TABLE>对象åQŒç„¶åŽå†åœ¨åó@环中依次创徏<TR>å’?/span><TD>。è€?#8220;‹¹‹è¯•代码3”的做法是首先在内存中由内到外的构建好整个表格åQŒæœ€åŽå†ž®†å®ƒæ·ÕdŠ åˆ°ç½‘™åµä¸­ã€‚这样做的目的是ž®½å¯èƒ½çš„减少‹¹è§ˆå™¨é‡æ–°è®¡½Ž—页面布局的次数。每当我们将一个对象添加到¾|‘页中时åQŒæµè§ˆå™¨éƒ½ä¼šž®è¯•寚w¡µé¢ä¸­çš„æŽ§ä»¶çš„布局˜q›è¡Œé‡æ–°è®¡ç®—。所以,如果我们能够首先在内存中ž®†æ•´ä¸ªè¦æž„造的对象全部创徏好,然后再一‹Æ¡æ€§çš„æ·ÕdŠ åˆ°ç½‘™åµä¸­ã€‚那么,‹¹è§ˆå™¨å°†åªä¼šåšä¸€‹Æ¡å¸ƒå±€çš„重计算。æ€È»“ä¸ÞZ¸€å¥è¯é‚£å°±æ˜¯è¶Šæ™šæ‰§è¡?/span>appendChild­‘Šå¥½ã€‚æœ‰æ—¶äØ“äº†æé«˜è¿è¡Œæ•ˆçŽ‡ï¼Œæˆ‘ä»¬ç”šè‡³å¯ä»¥è€ƒè™‘å…ˆä‹Éç”?/span>removeChildž®†å·²å­˜åœ¨çš„æŽ§ä»¶ä»Ž™åµé¢ä¸­ç§»é™¤ï¼Œç„¶åŽæž„造完成后再重新将其放¾|®å›ž™åµé¢å½“中ã€?/span>

提高字符串篏加的速度

在ä‹Éç”?/span>AJAX提交信息æ—Óž¼Œæˆ‘可能常帔Rœ€è¦æ‹¼è£…一些比较大的字½W¦ä¸²é€šè¿‡XmlHttp来完æˆ?/span>POST提交。尽½Ž¡æäº¤è¿™æ ·å¤§çš„信息的做法看è“væ¥åÆˆä¸ä¼˜é›…ï¼Œä½†æœ‰æ—¶æˆ‘ä»¬å¯èƒ½ä¸å¾—ä¸é¢å¯¹˜q™æ ·çš„需求。那ä¹?/span>JavaScript中对字符串的累加速度如何呢?我们先来做下面的˜q™ä¸ªå®žéªŒã€‚ç¯åŠ ä¸€ä¸ªé•¿åº¦äØ“30000的字½W¦ä¸²ã€?/span>

/* ‹¹‹è¯•代码1 - 耗时: 14.325¿U?/span> */

var str = "";

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

       str += "xxxxxx";

}

˜q™æ®µä»£ç è€—æ—¶14.325¿U’,¾l“æžœòq¶ä¸ç†æƒ³ã€‚çŽ°åœ¨æˆ‘ä»¬å°†ä»£ç æ”¹äØ“å¦‚ä¸‹çš„åŞ式:

/* ‹¹‹è¯•代码2 - 耗时: 0.359¿U?/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.359¿U’ï¼åŒæ ·çš„ç»“æžœï¼Œæˆ‘ä»¬åšçš„åªæ˜¯é¦–å…ˆæ‹ÆD£…一些较ž®çš„字符串然后再¾l„装成更大的字符丌Ӏ‚è¿™¿Uåšæ³•可以有效的在字½W¦ä¸²æ‹ÆD£…的后期减ž®å†…存复制的数据量。知道了˜q™ä¸€åŽŸç†ä¹‹åŽæˆ‘ä»¬˜q˜å¯ä»¥æŠŠä¸Šé¢çš„代码进一步拆散以后进行测试。下面的代码仅耗时0.140¿U’ã€?/span>

/* ‹¹‹è¯•代码3 - 耗时: 0.140¿U?/span> */

var str = ""; 

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

       var str1 = "";

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

              var str2 = "";

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

                     var str3 = "";

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

                            var str4 = "";

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

                                   str4 += "xxxxxx";

                            }

                            str3 += str4;

                     }

                     str2 += str3;

              }

              str1 += str2;      

       }

       str += str1; 

}

不过åQŒä¸Šé¢è¿™¿Uåšæ³•ä¹Ÿè®¸åÆˆä¸æ˜¯æœ€å¥½çš„åQå¦‚果我们需要提交的信息æ˜?/span>XML格式的(其实¾lå¤§å¤šæ•°æƒ…况下,我们都可以设法将要提交的信息¾l„装æˆ?/span>XML格式åQ‰ï¼Œæˆ‘们˜q˜èƒ½æ‰‘Öˆ°æ›´é«˜æ•ˆæ›´ä¼˜é›…的方æ³?/span>â€?span style="font-family: 宋体">利用DOM对象为我们组装字½W¦ä¸²ã€‚下面这ŒDµä»£ä¹°ç»„è£…ä¸€ä¸ªé•¿åº¦äØ“950015的字½W¦ä¸²ä»…须耗时0.890¿U’ã€?/span>

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

var xmlDoc; 

if (browserType == BROWSER_IE) {

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

}

else {

       xmlDoc = document.createElement("DOM");

}

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

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

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

       if (browserType == BROWSER_IE) {

              node.text = "xxxxxx";

       }

       else {

              node.innerText = "xxxxxx";

       }

       root.appendChild(node);

}

xmlDoc.appendChild(root);

var str;

if (browserType == BROWSER_IE) {

       str = xmlDoc.xml;

}

else {

       str = xmlDoc.innerHTML;

}

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

关于IEä¸?/span>DOM对象的内存泄露是一个常常被开发ähå‘˜å¿½ç•¥çš„é—®é¢˜ã€‚ç„¶è€Œå®ƒå¸¦æ¥çš„åŽæžœå´æ˜¯éžå¸æ€¸¥é‡çš„åQå®ƒä¼šå¯¼è‡?/span>IE的内存占用量持箋上升åQŒåƈ且浏览器的整体运行速度明显下降。对于一些泄露比较严重的¾|‘页åQŒç”šè‡›_ªè¦åˆ·æ–°å‡ ‹Æ¡ï¼Œ˜qè¡Œé€Ÿåº¦ž®×ƒ¼šé™ä½Žä¸€å€ã€?/span>

比较常见的内存泄漏的模型æœ?#8220;循环引用模型”ã€?#8220;闭包函数模型”å’?#8220;DOM插入™åºåºæ¨¡åž‹”,对于前两¿Uæ³„漏模型,我们都可以通过在网™å‰|žæž„时解除引用的方式来避免。而对äº?#8220;DOM插入™åºåºæ¨¡åž‹”则需要通过改变一些惯有的¾~–程习惯的方式来避免ã€?/span>

有关内存泄漏的模型的更多介绍可以通过Google很快的查刎ͼŒæœ¬æ–‡ä¸åš˜q‡å¤šçš„阐˜q°ã€‚不˜q‡ï¼Œ˜q™é‡Œæˆ‘向您推荐一个可用于查找和分析网™åµå†…存泄露的ž®å·¥å…?/span>â€?span style="font-family: 'Verdana', 'sans-serif'">DripåQŒç›®å‰çš„较新版本æ˜?/span>0.5åQŒä¸‹è½½åœ°å€æ˜?/span>http://outofhanwell.com/ieleak/index.php

复杂™åµé¢çš„分ŒDµè£…载和初始åŒ?/span>

对系¾lŸå½“中某些确实比较复杂而又不便使用IFrame的界面,我们可以对其实施分段装蝲。例如对于多™å‰| ‡½{„¡š„界面åQŒæˆ‘们可以首先下载和初始化多™å‰| ‡½{„¡š„默认™åµï¼Œç„¶åŽåˆ©ç”¨AJAHåQ?/span>asynchronous JavaScript and HTMLåQ‰æŠ€æœ¯æ¥å¼‚步的装载其他标½{ùN¡µä¸­çš„内容。这样就能保证界面可以在½W¬ä¸€æ—‰™—´é¦–先展现¾l™ç”¨æˆ—÷€‚把整个复杂界面的装载过½E‹åˆ†æ•£åˆ°ç”¨æˆ·çš„æ“ä½œè¿‡½E‹å½“中ã€?/span>

利用GZIP压羃¾|‘络‹¹é‡ã€?/span>

除了上面提到的这些代码çñ”的改良之外,我们˜q˜å¯ä»¥åˆ©ç”?/span>GZIP来有效的降低¾|‘络‹¹é‡ã€‚目前常见的ä¸ÀLµ‹¹è§ˆå™¨å·²¾lå…¨éƒ¨æ”¯æŒ?/span>GZIP½Ž—法åQŒæˆ‘们往往只需要编写少量的代码ž®±å¯ä»¥æ”¯æŒ?/span>GZIP了。例如在J2EE中我们可以在Filter中通过下面的代码来判断客户端浏览器是否支持GZIP½Ž—法åQŒç„¶åŽæ ¹æ®éœ€è¦åˆ©ç”?/span>java.util.zip.GZIPOutputStream来实çŽ?/span>GZIP的输出ã€?/span>

/* 判断‹¹è§ˆå™¨å¯¹GZIP支持方式的代ç ?/span> */

private static String getGZIPEncoding(HttpServletRequest request) {

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

 if (acceptEncoding == null) return null;

 acceptEncoding = acceptEncoding.toLowerCase();

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

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

 return null;

}

一般而言åQ?/span>GZIP对于HTMLã€?/span>JSP的压¾~©æ¯”可以辑ֈ°80%左右åQŒè€Œå®ƒé€ æˆçš„æœåŠ¡ç«¯å’Œå®¢æˆïL«¯çš„æ€§èƒ½æŸè€—几乎是可以忽略的。结合其他因素,支持GZIP的网站有可能为我们节¾U?/span>50%的网¾lœæµé‡ã€‚å› æ­?/span>GZIPçš„ä‹Éç”¨å¯ä»¥äØ“é‚£äº›¾|‘络环境不是特别好的应用带来显著的性能提升。ä‹Éç”?/span>Http的监视工å…?/span>Fiddler可以方便的检‹¹‹å‡º¾|‘页在ä‹Éç”?/span>GZIP前后的通讯数据量ã€?/span>Fiddler的下载地址æ˜?/span>http://www.fiddlertool.com/fiddler/

关于Web应用的性能优化其实是一个非常大的话题。本文由于篇òq…有限,只能涉及其中的几个细节,òq¶ä¸”也无法将˜q™äº›¾l†èŠ‚çš„ä¼˜åŒ–æ–¹å¼å…¨é¢çš„å±•çŽ°¾l™å¤§å®¶ã€‚期望本文能够引起大家对Web应用ž®¤å…¶æ˜¯å®¢æˆïL«¯æ€§èƒ½ä¼˜åŒ–的充分重视。毕竟服务端¾~–程技巧已为大家熟知多òqß_¼Œåœ¨æœåŠ¡ç«¯æŒ–æŽ˜æ€§èƒ½çš„æ½œåŠ›å·²¾lä¸å¤§äº†ã€‚而在客户端的æ–ÒŽ³•改进往往能够得到令äh惊奇的性能提升ã€?/span>



]]>
架构永远都没有最好的åQŒåªæœ‰æœ€åˆé€‚çš„http://www.aygfsteel.com/freeman1984/archive/2010/11/01/336688.html疯狂疯狂Mon, 01 Nov 2010 07:36:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/11/01/336688.htmlhttp://www.aygfsteel.com/freeman1984/comments/336688.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/11/01/336688.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/336688.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/336688.html
    软äšgæž¶æž„çš„é€‰æ‹©å’Œè®¾è®¡åÆˆä¸æ˜¯å¾ˆå®¹æ˜“åšå‡ºçš„åQŒä¸€ä¸ªæˆåŠŸçš„è½¯äšg架构取决于N多的因素åQŒèÊY件架构这个词向来ž®±æ˜¯æœ€ä¸ºæ¨¡¾pŠçš„一个词åQŒä¸ªäºø™®¤ä¸ø™ÊY件架构实在是个很大的话题åQŒä¸šç•Œä¸€ç›´é‡‡ç”¨çš„形象比喻ž®±æ˜¯å»ø™®¾æˆ¿å­æ—¶çš„æˆ¿å±‹¾l“构图,以èÊY件的角度来说åQŒèÊY件架构应臛_°‘包括软äšg开发时使用什么语­a€ã€åŞ成èÊY件开发时可运行的核心基础框架、èÊY件应用模块的设计åQˆåŒ…括模块内聚的功能、对外提供的服务½{‰ï¼‰ã€èÊY件测试的æ–ÒŽ³•、èÊY仉™ƒ¨¾|²çš„æ–ÒŽ³•以及团队开发的æ–ÒŽ³•åQŒé‚£ä¹ˆæ€Žä¹ˆæ¥é€‰æ‹©å’Œè®¾è®¡èÊY件架构呢åQŒå…¶è¡¡é‡çš„因素是什么呢åQŒä¸ªäºø™®¤ä¸ºå…¶ä¸­è´¨é‡å’Œå¿«é€Ÿæ˜¯è¡¡é‡è½¯äšg架构的选择和设计是否成功的两个最重要的因素ã€?br /> ä¸ÞZ»€ä¹ˆè¯´è´¨é‡å’Œå¿«é€Ÿæ˜¯ä¸¤ä¸ªæœ€é‡è¦çš„å› ç´ å‘¢åQŸé¦–先来看看˜q™é‡Œçš„质量和快速分别包含了什么内容:
质量
软äšg的质量是软äšg能否成功的非帔Ržå¸”R‡è¦çš„å› ç´ åQŒå°±ä¸ªäh看来åQŒèÊY件质量应包括软äšg功能性需求的实现、èÊY仉™žåŠŸèƒ½æ€§éœ€æ±‚çš„å®žçŽ°ã€?br /> 软äšg功能性需求中最重要的就是要¼‹®å®šå¯¹äºŽå®¢æˆ·è€Œè¨€å•†ä¸šä»·å€¼æœ€é«˜çš„部分是什么,˜q™ä¸€™å¹å¯¹äºŽèÊY件架构而言的媄响是软äšg应用模块的设计上åQŒè€ŒèÊY件应用模块的设计呢,通常要取决于可运行的核心基础框架的设计和实现上;
软äšg非功能性需求则通常会包含很多要素,像èÊY件灵‹zÀL€§ã€å¯æ‰©å±•性、高响应½{‰ï¼Œåœ¨è¿™äº›ä¼—多的要素中同栯‚¦é€‰æ‹©å‡ºå¯¹äºŽç›®å‰èÊY件最重要的要素是什么,˜q™ä¼šå½±å“åˆ°èÊY件架构中的èÊY件开发语­a€çš„选择、可˜qè¡Œçš„æ ¸å¿ƒåŸº¼‹€æ¡†æž¶ã€?br /> 软äšg的质量还有需要考虑的要素就是èÊY件测试的æ–ÒŽ³•了(˜q™ä¹Ÿä¼šåª„响到选择什么语­a€æ¥å¼€å‘èÊYä»Óž¼‰åQŒè¿™ç‚¹å¯¹äºŽèÊY件质量而已åQŒæ— ç–‘是非常重要的一炏V€?br /> å¿«é€?br /> 软äšgèƒ½å¦å¿«é€Ÿå¼€å‘å®Œæˆä¹Ÿå·²ç»æˆäØ“äº†èÊY件能否成功的重要因素åQŒå¿«é€Ÿå¼€å‘完成的意思非常容易理解,但它其实很大的程度媄响到了èÊY件架构的选择和设计,很明昄¡š„它将影响到èÊY件开发ä‹É用什么语­a€ã€èÊY件开发时可运行的核心基础框架、èÊY仉™ƒ¨¾|²çš„æ–ÒŽ³•以及团队开发的æ–ÒŽ³•½{‰ç­‰åQŒå›¢é˜Ÿä¸­çš„äh很大½E‹åº¦ä¸Šå†³å®šäº†è½¯äšg开发时使用什么语­a€åQˆè¿™ä¸ªæ—¶å€™ä¹Ÿè¦æ³¨æ„ï¼Œå…¶å®žä»€ä¹ˆè¯­­a€ä¼šåª„响到开发的速度、开发的质量½{‰ï¼Œä¾‹å¦‚erLang的设计目标是ä¸ÞZº†å¯æž„建容错的¾pȝ»Ÿã€c则更适合从底层控制整个系¾lŸçš„交互、java具备丰富的基¼‹€åº“、业界资源和更适合复杂业务的需求)åQŒè‡³äºŽæ ¸å¿ƒåŸº¼‹€æ¡†æž¶ã€éƒ¨¾|²çš„æ–ÒŽ³•、团队开发的æ–ÒŽ³•çš„è®¾è®¡éƒ½æ˜¯äØ“äº†å¿«é€Ÿè¿™ä¸ªç›®æ ‡çš„ã€?br /> 从上面的两个因素我们可以看到åQŒè¦ä½¿å¾—软äšg高质量且快速的完成åQŒèÊY件架构在选择和设计上旉™žå¸”R‡è¦çš„æ˜¯å¯»æ‰‘Öˆ°ä¸€¿Uåã^衡,所以èÊYä»¶æž¶æž„è¦åšåˆ°æ¨¡å¼åŒ–å…¶å®žåÆˆä¸å®¹æ˜“ã€?br /> 在这里多说下别的话,其实从上面所˜q°èƒ½çœ‹å‡ºåQŒåŽ»è¯„è®ºå“ªç§è¯­è¨€ä¼šæ­»æ˜¯æ²¡æœ‰ä»€ä¹ˆæ„ä¹‰çš„åQŒåƈ不会有一¿Uè¯­­a€æ”‘Öœ¨ä»ÖM½•环境下都适合åQŒå°±åƒåœ¨äº’联¾|‘ç½‘ç«™çš„å»ø™®¾ä¸Šï¼Œæˆ‘想可能很多人都会选择php+c或类似的语言体系åQŒä½†å¤§å®¶å…¶å®žå¯ä»¥ä»”细åŽÀLƒ³æƒ»I¼Œæ˜¯ä¸æ˜¯ç½‘ç«™çš„å»ø™®¾ä¸Šä¸€å®šè¦˜q™æ ·çš„两¿Uè¯­­a€æ‰èƒ½æ‰¿æ‹…互联¾|‘çš„é«˜åÆˆå‘ç­‰éœ€æ±‚å‘¢åQŒæˆ–è®æ€½ æ›´åº”该做的是从该¾|‘站最重要的非功能性需求、团队等½{‰å› ç´ æ¥è€ƒè™‘åQŒå°±åƒå¦‚果你的团队是java性质的团队,而网站最重要的非功能性需求又是支持业务的灉|´»æ€§çš„话,那么我会觉得c˜q™æ ·çš„过½E‹åŒ–语言¾lå¯¹ä¸æ˜¯˜q™ç§æƒ…况下的最佳选择åQŒè€Œjava却是˜q™ç§æƒ…况下的最佳选择åQŒå¯èƒ½å¾ˆå¤šäh会说java太慢呀åQŒä»€ä¹ˆçš„åQŒå…¶å®žåƈ不尽ç„Óž¼Œå¾ˆå¤šæ—¶å€™é ¼‹¬äšg以及优秀的架构完全可以å×I补掉java比c˜q™æ ·çš„程序运行相å¯ÒŽ›´æ…¢çš„æ¯›ç—…åQ?)åQŒè¿™ä¹Ÿç®—是给java的一个åã^反吧åQŒå‘µå‘µï¼Œæ¯•竟java相对c而言˜q˜æœ‰æ›´å¤§çš„好处那ž®±æ˜¯java½E‹åºçš„开发无è®ÞZ»Žè´¨é‡˜q˜æ˜¯å¿«é€Ÿå¼€å‘上肯定å¼ÞZºŽcåQŒæˆ‘˜q™æ ·è¯´åƈ不是说一定要选择javaåQŒæˆ‘只是惌™¯´æ˜Žåº”该根据什么样的情冉|¥é€‰æ‹©å’Œè®¾è®¡ä»€ä¹ˆæ ·çš„æž¶æž„,那才是最合理的,所以架构永˜qœéƒ½æ²¡æœ‰æœ€å¥½çš„åQŒåªæœ‰æœ€åˆé€‚çš„åQŒè€Œè¿™ä¹Ÿæ˜¯æž¶æž„师最隑ցšçš„原因,架构师在做架构的设计和选择旉™µå¾ªçš„出发点就是保证èÊY仉™«˜è´¨é‡ä¸”快速的完成ã€?nbsp; 


 è½¬è²è‡ªï¼šhttp://www.aygfsteel.com/BlueDavy/archive/2007/10/11/151907.html

]]>
CometåQšåŸºäº?HTTP 长连接的“服务器推”技æœ?/title><link>http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sun, 17 Oct 2010 15:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/335394.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/335394.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/335394.html</trackback:ping><description><![CDATA[<p>CometåQšåŸºäº?HTTP 长连接的“服务器推”技æœ?br /> 2008-06-30 21:31<br /> 别: 中çñ” <br /> å‘?å©?(zhouting@cn.ibm.com), 软äšg工程å¸? IBM 中国软äšg开发技术实验室</p> <p>2007 òq?8 æœ?31 æ—?/p> <p>很多应用譬如监控、即旉™€šä¿¡ã€å³æ—¶æŠ¥ä»ïL³»¾lŸéƒ½éœ€è¦å°†åŽå°å‘生的变化实时传送到客户端而无™åÕd®¢æˆïL«¯ä¸åœåœ°åˆ·æ–°ã€å‘送请求。本文首先介¾lã€æ¯”较了常用çš?#8220;服务器推”æ–ÒŽ¡ˆåQŒç€é‡ä»‹¾läº† Comet åQ?使用 HTTP 长连接、无™åÀLµè§ˆå™¨å®‰è£…插äšg的两¿U?#8220;服务器推”æ–ÒŽ¡ˆåQšåŸºäº?AJAX 的长轮询方式åQ›åŸºäº?iframe å?htmlfile 的流方式。最后分析了开å?Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架åQpushlet 构徏自己çš?#8220;服务器推”应用ã€?br /> “服务器推”技术的应用</p> <p> è¯¯‚®¿é—?Ajax 技术资源中心,˜q™æ˜¯æœ‰å…³ Ajax ¾~–程模型信息的一站式中心åQŒåŒ…括很多文档、教½E‹ã€è®ºå›ã€blog、wiki 和新闅R€‚ä“Qä½?Ajax 的新信息都能在这里找到ã€?nbsp; <br />    订阅 Ajax 相关文章和教½E‹çš„ RSS 提要 <br />  </p> <p> <br />  <br /> 传统模式çš?Web ¾pȝ»Ÿä»¥å®¢æˆïL«¯å‘出è¯äh±‚、服务器端响应的方式工作。这¿Uæ–¹å¼åƈ不能满èƒö很多现实应用的需求,譬如åQ?/p> <p>监控¾pȝ»ŸåQšåŽå°ç¡¬ä»¶çƒ­æ’拔、LED、温度、电压发生变化; <br /> åÏx—¶é€šä¿¡¾pȝ»ŸåQšå…¶å®ƒç”¨æˆïL™»å½•、发送信息; <br /> åÏx—¶æŠ¥ä­h¾pȝ»ŸåQšåŽå°æ•°æ®åº“内容发生变化åQ?<br /> ˜q™äº›åº”用都需要服务器能实时地ž®†æ›´æ–°çš„信息传送到客户端,而无™åÕd®¢æˆïL«¯å‘出è¯äh±‚ã€?#8220;服务器推”技术在现实应用中有一些解å†Ïx–¹æ¡ˆï¼Œæœ¬æ–‡ž®†è¿™äº›è§£å†Ïx–¹æ¡ˆåˆ†ä¸ÞZ¸¤¾c»ï¼šä¸€¾c»éœ€è¦åœ¨‹¹è§ˆå™¨ç«¯å®‰è£…插äšgåQŒåŸºäºŽå¥—接口传送信息,或是使用 RMI、CORBA ˜q›è¡Œ˜qœç¨‹è°ƒç”¨åQ›è€Œå¦ä¸€¾cÕdˆ™æ— é¡»‹¹è§ˆå™¨å®‰è£…ä“Q何插件、基äº?HTTP 长连接ã€?/p> <p>ž®?#8220;服务器推”应用åœ?Web ½E‹åºä¸­ï¼Œé¦–先考虑的是如何在功能有限的‹¹è§ˆå™¨ç«¯æŽ¥æ”¶ã€å¤„理信息:</p> <p>客户端如何接收、处理信息,是否需要ä‹É用套接口或是使用˜qœç¨‹è°ƒç”¨ã€‚客æˆïL«¯å‘ˆçް¾l™ç”¨æˆïLš„æ˜?HTML ™åµé¢˜q˜æ˜¯ Java applet æˆ?Flash ½H—口。如果ä‹É用套接口和远½E‹è°ƒç”¨ï¼Œæ€Žä¹ˆå’?JavaScript ¾l“合修改 HTML 的显½Cºã€?<br /> 客户与服务器端通信的信息格式,采取怎样的出错处理机制ã€?<br /> 客户端是否需要支持不同类型的‹¹è§ˆå™¨å¦‚ IE、FirefoxåQŒæ˜¯å¦éœ€è¦åŒæ—¶æ”¯æŒ?Windows å’?Linux òq›_°ã€?<br />   <br />   回页é¦?<br />  <br /> åŸÞZºŽå®¢æˆ·ç«¯å¥—接口çš?#8220;服务器推”技æœ?/p> <p>Flash XMLSocket</p> <p>如果 Web 应用的用æˆähŽ¥å—åº”ç”¨åªæœ‰åœ¨å®‰è£…äº?Flash 播放器才能正常运行, 那么使用 Flash çš?XMLSocket 也是一个可行的æ–ÒŽ¡ˆã€?/p> <p>˜q™ç§æ–ÒŽ¡ˆå®žçŽ°çš„åŸº¼‹€æ˜¯ï¼š</p> <p>Flash 提供äº?XMLSocket ¾c…R€?<br /> JavaScript å’?Flash 的紧密结合:åœ?JavaScript 可以直接调用 Flash ½E‹åºæä¾›çš„æŽ¥å£ã€?<br /> 具体实现æ–ÒŽ³•åQšåœ¨ HTML ™åµé¢ä¸­å†…嵌入一个ä‹É用了 XMLSocket ¾cȝš„ Flash ½E‹åºã€‚JavaScript 通过调用æ­?Flash ½E‹åºæä¾›çš„套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很å®ÒŽ˜“地控åˆ?HTML ™åµé¢çš„内å®ÒŽ˜¾½Cºã€?/p> <p>关于如何åŽÀLž„建充当了 JavaScript ä¸?Flash XMLSocket 桥梁çš?Flash ½E‹åºåQŒä»¥åŠå¦‚何在 JavaScript 里调ç”?Flash 提供的接口,我们可以参è€?AFLAXåQˆAsynchronous Flash and XMLåQ‰é¡¹ç›®æä¾›çš„ Socket Demo 以及 SocketJSåQˆè¯·å‚见 参考资源)ã€?/p> <p>Javascript ä¸?Flash 的紧密结合,极大增强了客æˆïL«¯çš„处理能力。从 Flash 播放å™?V7.0.19 开始,已经取消äº?XMLSocket 的端口必™åÕd¤§äº?1023 的限制。Linux òq›_°ä¹Ÿæ”¯æŒ?Flash XMLSocket æ–ÒŽ¡ˆã€‚但此方案的¾~ºç‚¹åœ¨äºŽåQ?/p> <p>客户端必™åÕd®‰è£?Flash 播放器; <br /> 因䨓 XMLSocket 没有 HTTP 隧道功能åQŒXMLSocket ¾cÖM¸èƒ½è‡ªåŠ¨ç©¿˜q‡é˜²ç«å¢™åQ?<br /> å› äØ“æ˜¯ä‹É用套接口åQŒéœ€è¦è®¾¾|®ä¸€ä¸ªé€šä¿¡ç«¯å£åQŒé˜²ç«å¢™ã€ä»£ç†æœåŠ¡å™¨ä¹Ÿå¯èƒ½å¯¹é?HTTP 通道端口˜q›è¡Œé™åˆ¶åQ?<br /> 不过˜q™ç§æ–ÒŽ¡ˆåœ¨ä¸€äº›ç½‘¾lœèŠå¤©å®¤åQŒç½‘¾lœäº’动游戏中已得到广泛ä‹É用ã€?/p> <p>Java Applet 套接å?</p> <p>在客æˆïL«¯ä½¿ç”¨ Java AppletåQŒé€šè¿‡ java.net.Socket æˆ?java.net.DatagramSocket æˆ?java.net.MulticastSocket 建立与服务器端的套接口连接,从而实çŽ?#8220;服务器推”ã€?/p> <p>˜q™ç§æ–ÒŽ¡ˆæœ€å¤§çš„不èƒö在于 Java applet 在收到服务器端返回的信息后,无法通过 JavaScript åŽÀL›´æ–?HTML ™åµé¢çš„内宏V€?/p> <p>  <br />   回页é¦?<br />  <br /> åŸÞZºŽ HTTP 长连接的“服务器推”技æœ?/p> <p>Comet ½Ž€ä»?/p> <p>‹¹è§ˆå™¨ä½œä¸?Web 应用的前収ͼŒè‡ªèín的处理功能比较有限。浏览器的发展需要客æˆïL«¯å‡çñ”软äšgåQŒåŒæ—¶ç”±äºŽå®¢æˆïL«¯‹¹è§ˆå™¨èÊY件的多样性,在某¿Uæ„ä¹‰ä¸ŠåQŒä¹Ÿå½±å“äº†æµè§ˆå™¨æ–°æŠ€æœ¯çš„æŽ¨å¹¿ã€‚在 Web 应用中,‹¹è§ˆå™¨çš„主要工作是发送请求、解析服务器˜q”回的信息以不同的风格显½Cºã€‚AJAX 是浏览器技术发展的成果åQŒé€šè¿‡åœ¨æµè§ˆå™¨ç«¯å‘送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系¾lŸï¼Œå¯¹ä“Q何用æˆäh¥è¯ß_¼Œå¯ä»¥è®¤äؓ服务器是另外一个用戗÷€‚现æœ?AJAX 技术的发展òq¶ä¸èƒ½è§£å†›_œ¨ä¸€ä¸ªå¤šç”¨æˆ·çš?Web 应用中,ž®†æ›´æ–°çš„信息实时传送给客户端,从而用户可能在“˜q‡æ—¶”的信息下˜q›è¡Œæ“ä½œã€‚è€?AJAX 的应用又使后台数据更新更加频¾Jæˆä¸ºå¯èƒ½ã€?/p> <p>å›?1. 传统çš?Web 应用模型与基äº?AJAX 的模型之比较  <br /> “服务器推”是一¿Uå¾ˆæ—©å°±å­˜åœ¨çš„æŠ€æœ¯ï¼Œä»¥å‰åœ¨å®žçŽîC¸Šä¸»è¦æ˜¯é€šè¿‡å®¢æˆ·ç«¯çš„套接口,或是服务器端的远½E‹è°ƒç”¨ã€‚因为浏览器技术的发展比较¾~“æ…¢åQŒæ²¡æœ‰äØ““服务器推”的实现提供很好的支持åQŒåœ¨¾U¯æµè§ˆå™¨çš„应用中很难有一个完善的æ–ÒŽ¡ˆåŽÕd®žçŽ?#8220;服务器推”òq¶ç”¨äºŽå•†ä¸šç¨‹åºã€‚最˜q‘几òqß_¼Œå› äØ“ AJAX 技术的普及åQŒä»¥åŠæŠŠ IFrame 嵌在“htmlfile“çš?ActiveX ¾l„äšg中可以解å†?IE 的加载显½Cºé—®é¢˜ï¼Œä¸€äº›å—‹Æ¢è¿Žçš„应用如 meeboåQŒgmail+gtalk 在实çŽîC¸­ä½¿ç”¨äº†è¿™äº›æ–°æŠ€æœ¯ï¼›åŒæ—¶“服务器推”在现实应用中¼‹®å®žå­˜åœ¨å¾ˆå¤šéœ€æ±‚ã€‚å› ä¸ø™¿™äº›åŽŸå› ï¼ŒåŸÞZºŽ¾U¯æµè§ˆå™¨çš?#8220;服务器推”技术开始受到较多关注,Alex RussellåQˆDojo Toolkit 的项ç›?LeadåQ‰ç§°˜q™ç§åŸÞZºŽ HTTP 长连接、无™åÕdœ¨‹¹è§ˆå™¨ç«¯å®‰è£…插äšgçš?#8220;服务器推”æŠ€æœ¯äØ““Comet”。目前已¾lå‡ºçŽîCº†ä¸€äº›æˆç†Ÿçš„ Comet 应用以及各种开源框æžÓž¼›ä¸€äº?Web 服务器如 Jetty ä¹Ÿåœ¨ä¸ºæ”¯æŒå¤§é‡åÆˆå‘çš„é•¿è¿žæŽ¥è¿›è¡Œäº†å¾ˆå¤šæ”¹è¿›ã€‚å…³äº?Comet 技术最新的发展状况请参考关äº?Comet çš?wikiã€?/p> <p>下面ž®†ä»‹¾lä¸¤¿U?Comet 应用的实现模型ã€?/p> <p>åŸÞZºŽ AJAX 的长轮询åQˆlong-pollingåQ‰æ–¹å¼?/p> <p>å¦?å›?1 所½Cºï¼ŒAJAX 的出çŽîC‹Éå¾?JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP è¯äh±‚åQŒJavaScript 响应处理函数æ ÒŽ®æœåŠ¡å™¨è¿”å›žçš„ä¿¡æ¯å¯?HTML ™åµé¢çš„æ˜¾½Cø™¿›è¡Œæ›´æ–°ã€‚ä‹Éç”?AJAX 实现“服务器推”与传¾lŸçš„ AJAX 应用不同之处在于åQ?/p> <p>服务器端会阻塞请求直到有数据传递或­‘…时才返回ã€?<br /> 客户ç«?JavaScript 响应处理函数会在处理完服务器˜q”回的信息后åQŒå†‹Æ¡å‘凸™¯·æ±‚,重新建立˜qžæŽ¥ã€?<br /> 当客æˆïL«¯å¤„理接收的数据、重新徏立连接时åQŒæœåŠ¡å™¨ç«¯å¯èƒ½æœ‰æ–°çš„æ•°æ®åˆ°è¾¾åQ›è¿™äº›ä¿¡æ¯ä¼šè¢«æœåŠ¡å™¨ç«¯ä¿å­˜ç›´åˆ°å®¢æˆïL«¯é‡æ–°å»ºç«‹˜qžæŽ¥åQŒå®¢æˆïL«¯ä¼šä¸€‹Æ¡æŠŠå½“前服务器端所有的信息取回ã€?<br /> å›?2. åŸÞZºŽé•¿è½®è¯¢çš„æœåŠ¡å™¨æŽ¨æ¨¡åž‹  <br /> 一些应用及½CÞZ¾‹å¦?“Meebo”, “Pushlet Chat” 都采用了˜q™ç§é•¿è½®è¯¢çš„æ–¹å¼ã€‚相对于“轮询”åQˆpollåQ‰ï¼Œ˜q™ç§é•¿è½®è¯¢æ–¹å¼ä¹Ÿå¯ä»¥¿UîCØ““æ‹?#8221;åQˆpullåQ‰ã€‚因䏸™¿™¿Uæ–¹æ¡ˆåŸºäº?AJAXåQŒå…·æœ‰ä»¥ä¸‹ä¸€äº›ä¼˜ç‚¹ï¼šè¯äh±‚异步发出åQ›æ— ™åÕd®‰è£…插ä»Óž¼›IE、Mozilla FireFox 都支æŒ?AJAXã€?/p> <p>在这¿Ué•¿è½®è¯¢æ–¹å¼ä¸‹ï¼Œå®¢æˆ·ç«¯æ˜¯åœ?XMLHttpRequest çš?readystate ä¸?4åQˆå³æ•°æ®ä¼ è¾“¾l“束åQ‰æ—¶è°ƒç”¨å›žè°ƒå‡½æ•°åQŒè¿›è¡Œä¿¡æ¯å¤„理。当 readystate ä¸?4 æ—Óž¼Œæ•°æ®ä¼ è¾“¾l“束åQŒè¿žæŽ¥å·²¾lå…³é—­ã€‚Mozilla Firefox 提供了对 Streaming AJAX 的支持, å?readystate ä¸?3 æ—Óž¼ˆæ•°æ®ä»åœ¨ä¼ è¾“中)åQŒå®¢æˆïL«¯å¯ä»¥è¯Õd–数据åQŒä»Žè€Œæ— ™åÕd…³é—­è¿žæŽ¥ï¼Œž®Þpƒ½è¯Õd–处理服务器端˜q”回的信息。IE åœ?readystate ä¸?3 æ—Óž¼Œä¸èƒ½è¯Õd–服务器返回的数据åQŒç›®å‰?IE 不支持基äº?Streaming AJAXã€?/p> <p>åŸÞZºŽ Iframe å?htmlfile 的流åQˆstreamingåQ‰æ–¹å¼?/p> <p>iframe 是很早就存在的一¿U?HTML 标记åQ?通过åœ?HTML ™åµé¢é‡ŒåµŒå…¥ä¸€ä¸ªéšè”µå“áåQŒç„¶åŽå°†˜q™ä¸ªéšè”µå¸§çš„ SRC 属性设为对一个长˜qžæŽ¥çš„请求,服务器端ž®Þpƒ½æºæºä¸æ–­åœ°å¾€å®¢æˆ·ç«¯è¾“入数据ã€?/p> <p>å›?3. åŸÞZºŽ‹¹æ–¹å¼çš„æœåŠ¡å™¨æŽ¨æ¨¡åž‹  <br /> 上节提到çš?AJAX æ–ÒŽ¡ˆæ˜¯åœ¨ JavaScript 里处ç?XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的åŽÀLާåˆ?HTML ™åµé¢çš„æ˜¾½Cºã€‚同æ ïLš„æ€èµ\用在 iframe æ–ÒŽ¡ˆçš„客æˆïL«¯åQŒiframe 服务器端òq¶ä¸˜q”回直接昄¡¤ºåœ¨é¡µé¢çš„æ•°æ®åQŒè€Œæ˜¯˜q”回对客æˆïL«¯ Javascript 函数的调用,å¦?#8220;<script type="text/javascript">js_func(“data from server ”)</script>”。服务器端将˜q”回的数据作为客æˆïL«¯ JavaScript 函数的参æ•îC¼ é€’;客户端浏览器çš?Javascript 引擎在收到服务器˜q”回çš?JavaScript 调用时就会去执行代码ã€?/p> <p>ä»?å›?3 可以看到åQŒæ¯‹Æ¡æ•°æ®ä¼ é€ä¸ä¼šå…³é—­è¿žæŽ¥ï¼Œ˜qžæŽ¥åªä¼šåœ¨é€šä¿¡å‡ºçŽ°é”™è¯¯æ—Óž¼Œæˆ–是˜qžæŽ¥é‡å¾æ—¶å…³é—­ï¼ˆä¸€äº›é˜²ç«å¢™å¸¸è¢«è®„¡½®ä¸ÞZ¸¢å¼ƒè¿‡é•¿çš„˜qžæŽ¥åQ?服务器端可以讄¡½®ä¸€ä¸ªè¶…æ—¶æ—¶é—ß_¼Œ ­‘…时后通知客户端重新徏立连接,òq¶å…³é—­åŽŸæ¥çš„˜qžæŽ¥åQ‰ã€?/p> <p>使用 iframe è¯äh±‚一个长˜qžæŽ¥æœ‰ä¸€ä¸ªå¾ˆæ˜Žæ˜¾çš„不­‘³ä¹‹å¤„:IE、Morzilla Firefox 下端的进度栏都会昄¡¤ºåŠ è²æ²¡æœ‰å®ŒæˆåQŒè€Œä¸” IE 上方的图标会不停的è{动,表示加蝲正在˜q›è¡Œã€‚Google 的天才们使用一个称ä¸?#8220;htmlfile”çš?ActiveX 解决了在 IE 中的加蝲昄¡¤ºé—®é¢˜åQŒåƈž®†è¿™¿Uæ–¹æ³•用åˆîCº† gmail+gtalk 产品中。Alex Russell åœ?“What else is burried down in the depth's of Google's amazing JavaScript?”文章中介¾läº†˜q™ç§æ–ÒŽ³•。Zeitoun ¾|‘站提供çš?comet-iframe.tar.gzåQŒå°è£…了一个基äº?iframe å’?htmlfile çš?JavaScript comet 对象åQŒæ”¯æŒ?IE、Mozilla Firefox ‹¹è§ˆå™¨ï¼Œå¯ä»¥ä½œäؓ参考。(请参è§?参考资源)</p> <p>  <br />   回页é¦?<br />  <br /> 使用 Comet 模型开发自å·Þqš„应用</p> <p>上面介绍了两¿UåŸºäº?HTTP 长连接的“服务器推”æž¶æž„åQŒæ›´å¤šæ˜qîCº†å®¢æˆ·ç«¯å¤„理长˜qžæŽ¥çš„æŠ€æœ¯ã€‚对于一个实际的应用而言åQŒç³»¾lŸçš„½E›_®šæ€§å’Œæ€§èƒ½æ˜¯éžå¸”R‡è¦çš„。将 HTTP 长连接用于实际应用,很多¾l†èŠ‚éœ€è¦è€ƒè™‘ã€?/p> <p>不要在同一客户端同时ä‹É用超˜q‡ä¸¤ä¸ªçš„ HTTP 长连æŽ?/p> <p>我们使用 IE 下蝲文äšg时会有这æ ïLš„体验åQŒä»ŽåŒä¸€ä¸?Web 服务器下载文ä»Óž¼Œæœ€å¤šåªèƒ½æœ‰ä¸¤ä¸ªæ–‡äšg同时被下载。第三个文äšg的下载会被阻塞,直到前面下蝲的文件下载完毕。这是因ä¸?HTTP 1.1 规范中规定,客户端不应该与服务器端徏立超˜q‡ä¸¤ä¸ªçš„ HTTP ˜qžæŽ¥åQ?æ–°çš„˜qžæŽ¥ä¼šè¢«é˜Õd¡žã€‚è€?IE 在实çŽîC¸­ä¸¥æ ¼éµå®ˆäº†è¿™¿Uè§„定ã€?/p> <p>HTTP 1.1 对两个长˜qžæŽ¥çš„限åˆÓž¼Œä¼šå¯¹ä½¿ç”¨äº†é•¿˜qžæŽ¥çš?Web 应用带来如下现象åQšåœ¨å®¢æˆ·ç«¯å¦‚果打开­‘…过两个çš?IE ½H—口去访问同一个ä‹É用了长连接的 Web 服务器,½W¬ä¸‰ä¸?IE ½H—口çš?HTTP è¯äh±‚被前两个½H—口的长˜qžæŽ¥é˜Õd¡žã€?/p> <p>所以在开发长˜qžæŽ¥çš„应用时åQ?必须注意在ä‹É用了多个 frame 的页面中åQŒä¸è¦äؓ每个 frame 的页面都建立一ä¸?HTTP 长连接,˜q™æ ·ä¼šé˜»å¡žå…¶å®ƒçš„ HTTP è¯äh±‚åQŒåœ¨è®¾è®¡ä¸Šè€ƒè™‘让多ä¸?frame 的更新共用一个长˜qžæŽ¥ã€?/p> <p>服务器端的性能和可扩展æ€?/p> <p>一èˆ?Web 服务器会为每个连接创å»ÞZ¸€ä¸ªçº¿½E‹ï¼Œå¦‚果在大型的商业应用中ä‹Éç”?CometåQŒæœåŠ¡å™¨ç«¯éœ€è¦ç»´æŠ¤å¤§é‡åÆˆå‘çš„é•¿è¿žæŽ¥ã€‚åœ¨˜q™ç§åº”用背景下,服务器端需要考虑负蝲均衡和集¾Ÿ¤æŠ€æœ¯ï¼›æˆ–æ˜¯åœ¨æœåŠ¡å™¨ç«¯äØ“é•¿è¿žæŽ¥ä½œä¸€äº›æ”¹˜q›ã€?/p> <p>应用和技术的发展æ€ÀL˜¯å¸¦æ¥æ–°çš„需求,从而推动新技术的发展。HTTP 1.1 ä¸?1.0 规范有一个很大的不同åQ?.0 规范下服务器在处理完每个 Get/Post è¯äh±‚后会关闭套接口连接; è€?1.1 规范下服务器会保持这个连接,在处理两个请求的间隔旉™—´é‡Œï¼Œ˜q™ä¸ª˜qžæŽ¥å¤„于½Iºé—²çŠ¶æ€ã€?Java 1.4 引入了支持异æ­?IO çš?java.nio 包。当˜qžæŽ¥å¤„于½Iºé—²æ—Óž¼Œä¸ø™¿™ä¸ªè¿žæŽ¥åˆ†é…çš„¾U¿ç¨‹èµ„源会返˜q˜åˆ°¾U¿ç¨‹æ± ï¼Œå¯ä»¥ä¾›æ–°çš„连接ä‹É用;当原来处于空闲的˜qžæŽ¥çš„客户发出新的请求,会从¾U¿ç¨‹æ± é‡Œåˆ†é…ä¸€ä¸ªçº¿½E‹èµ„源处理这个请求ã€?˜q™ç§æŠ€æœ¯åœ¨˜qžæŽ¥å¤„于½Iºé—²çš„æœºçŽ‡è¾ƒé«˜ã€åÆˆå‘è¿žæŽ¥æ•°ç›®å¾ˆå¤šçš„åœºæ™¯ä¸‹å¯¹äºŽé™ä½ŽæœåŠ¡å™¨çš„èµ„æºè´Ÿè½½éžå¸¸æœ‰æ•ˆã€?/p> <p>但是 AJAX 的应用ä‹Éè¯äh±‚的出现变得频¾Jï¼Œè€?Comet åˆ™ä¼šé•¿æ—¶é—´å ç”¨ä¸€ä¸ªè¿žæŽ¥ï¼Œä¸Šè¿°çš„æœåŠ¡å™¨æ¨¡åž‹åœ¨æ–°çš„åº”ç”¨èƒŒæ™¯ä¸‹ä¼šå˜å¾—éžå¸æ€½Žæ•ˆï¼Œ¾U¿ç¨‹æ± é‡Œæœ‰é™çš„线½E‹æ•°ç”šè‡³å¯èƒ½ä¼šé˜»å¡žæ–°çš„连接。Jetty 6 Web 服务器针å¯?AJAX、Comet 应用的特点进行了很多创新的改˜q›ï¼Œè¯·å‚考文ç«?#8220;AJAXåQŒComet and Jetty”åQˆè¯·å‚见 参考资源)ã€?/p> <p>控制信息与数据信息ä‹É用不同的 HTTP ˜qžæŽ¥</p> <p>使用长连接时åQŒå­˜åœ¨ä¸€ä¸ªå¾ˆå¸¸è§çš„场景:客户端网™åµéœ€è¦å…³é—­ï¼Œè€ŒæœåŠ¡å™¨ç«¯è¿˜å¤„åœ¨è¯Õd–数据的堵塞状态,客户端需要及旉™€šçŸ¥æœåŠ¡å™¨ç«¯å…³é—­æ•°æ®˜qžæŽ¥ã€‚服务器在收到关闭请求后首先要从è¯Õd–æ•°æ®çš„é˜»å¡žçŠ¶æ€å”¤é†’ï¼Œç„¶åŽé‡Šæ”¾ä¸ø™¿™ä¸ªå®¢æˆïL«¯åˆ†é…çš„资源,再关闭连接ã€?/p> <p>所以在设计上,我们需要ä‹É客户端的控制è¯äh±‚和数据请求ä‹É用不同的 HTTP ˜qžæŽ¥åQŒæ‰èƒ½ä‹É控制è¯äh±‚不会被阻塞ã€?/p> <p>在实çŽîC¸ŠåQŒå¦‚果是åŸÞZºŽ iframe ‹¹æ–¹å¼çš„长连接,客户端页面需要ä‹É用两ä¸?iframeåQŒä¸€ä¸ªæ˜¯æŽ§åˆ¶å¸§ï¼Œç”¨äºŽå¾€æœåŠ¡å™¨ç«¯å‘é€æŽ§åˆ¶è¯·æ±‚ï¼ŒæŽ§åˆ¶è¯äh±‚能很快收到响应,不会被堵塞;一个是昄¡¤ºå¸§ï¼Œç”¨äºŽå¾€æœåŠ¡å™¨ç«¯å‘é€é•¿˜qžæŽ¥è¯äh±‚。如果是åŸÞZºŽ AJAX 的长轮询方式åQŒå®¢æˆïL«¯å¯ä»¥å¼‚步地发å‡ÞZ¸€ä¸?XMLHttpRequest è¯äh±‚åQŒé€šçŸ¥æœåŠ¡å™¨ç«¯å…³é—­æ•°æ®˜qžæŽ¥ã€?/p> <p>在客户和服务器之间保æŒ?#8220;心蟩”信息</p> <p>在浏览器与服务器之间¾l´æŒä¸€ä¸ªé•¿˜qžæŽ¥ä¼šäؓ通信带来一些不¼‹®å®šæ€§ï¼šå› äؓ数据传输是随机的åQŒå®¢æˆïL«¯ä¸çŸ¥é“何时服务器才有数据传送。服务器端需要确保当客户端不再工作时åQŒé‡Šæ”¾äØ“˜q™ä¸ªå®¢æˆ·ç«¯åˆ†é…çš„资源åQŒé˜²æ­¢å†…存泄漏。因此需要一¿Uæœºåˆ¶ä‹É双方知道大家都在正常˜qè¡Œã€‚在实现上:</p> <p>服务器端在阻塞读时会讄¡½®ä¸€ä¸ªæ—¶é™ï¼Œ­‘…时后阻塞读调用会返回,同时发给客户端没有新数据到达的心跳信息。此时如果客æˆïL«¯å·²ç»å…³é—­åQŒæœåŠ¡å™¨å¾€é€šé“å†™æ•°æ®ä¼šå‡ºçŽ°å¼‚å¸¸åQŒæœåŠ¡å™¨ç«¯å°±ä¼šåŠæ—‰™‡Šæ”¾äØ“˜q™ä¸ªå®¢æˆ·ç«¯åˆ†é…çš„资源ã€?<br /> 如果客户端ä‹É用的是基äº?AJAX 的长轮询方式åQ›æœåŠ¡å™¨ç«¯è¿”å›žæ•°æ®ã€å…³é—­è¿žæŽ¥åŽåQŒç»˜q‡æŸä¸ªæ—¶é™æ²¡æœ‰æ”¶åˆ°å®¢æˆïL«¯çš„再‹Æ¡è¯·æ±‚,会认为客æˆïL«¯ä¸èƒ½æ­£å¸¸å·¥ä½œåQŒä¼šé‡Šæ”¾ä¸ø™¿™ä¸ªå®¢æˆïL«¯åˆ†é…ã€ç»´æŠ¤çš„资源ã€?<br /> 当服务器处理信息出现异常情况åQŒéœ€è¦å‘送错误信息通知客户端,同时释放资源、关闭连接ã€?<br /> Pushlet - å¼€æº?Comet 框架</p> <p>Pushlet 是一个开源的 Comet 框架åQŒåœ¨è®¾è®¡ä¸Šæœ‰å¾ˆå¤šå€¼å¾—借鉴的地方,对于开发轻量çñ”çš?Comet 应用很有参考ä­h倹{€?/p> <p>观察者模åž?/p> <p>Pushlet 使用了观察者模型:客户端发送请求,订阅感兴­‘£çš„事äšgåQ›æœåŠ¡å™¨ç«¯äØ“æ¯ä¸ªå®¢æˆ·ç«¯åˆ†é…ä¸€ä¸ªä¼šè¯?ID ä½œäØ“æ ‡è®°åQŒäº‹ä»¶æºä¼šæŠŠæ–îCñ”生的事äšg以多播的方式发送到订阅者的事äšg队列里ã€?/p> <p>客户ç«?JavaScript åº?/p> <p>pushlet 提供了基äº?AJAX çš?JavaScript 库文件用于实现长轮询方式çš?#8220;服务器推”åQ›è¿˜æä¾›äº†åŸºäº?iframe çš?JavaScript 库文件用于实现流方式çš?#8220;服务器推”ã€?/p> <p>JavaScript 库做了很多封装工作:</p> <p>定义客户端的通信状态:STATE_ERROR、STATE_ABORT、STATE_NULL、STATE_READY、STATE_JOINED、STATE_LISTENINGåQ?<br /> 保存服务器分配的会话 IDåQŒåœ¨å»ºç«‹˜qžæŽ¥ä¹‹åŽçš„æ¯‹Æ¡è¯·æ±‚中会附上会è¯?ID 表明íw«ä†¾åQ?<br /> 提供äº?join()、leave()、subscribe()ã€?unsubsribe()、listen() ½{?API 供页面调用; <br /> 提供了处理响应的 JavaScript 函数接口 onData()、onEvent()… <br /> ¾|‘页可以很方便地使用˜q™ä¸¤ä¸?JavaScript 库文件封装的 API 与服务器˜q›è¡Œé€šä¿¡ã€?/p> <p>客户端与服务器端通信信息格式</p> <p>pushlet 定义了一套客户与服务器通信的信息格式,使用 XML 格式。定义了客户端发送请求的¾cÕdž‹åQšjoin、leave、subscribe、unsubscribe、listen、refreshåQ›ä»¥åŠå“åº”的事äšg¾cÕdž‹åQšdata、join_ack、listen_ack、refresh、heartbeat、error、abort、subscribe_ack、unsubscribe_ackã€?/p> <p>服务器端事äšg队列½Ž¡ç†</p> <p>pushlet 在服务器端ä‹Éç”?Java Servlet 实现åQŒå…¶æ•°æ®¾l“构的设计框架仍可适用äº?PHP、C ¾~–写的后台客æˆïL«¯ã€?/p> <p>Pushlet 支持客户端自己选择使用‹¹ã€æ‹‰åQˆé•¿è½®è¯¢åQ‰ã€è½®è¯¢æ–¹å¼ã€‚服务器端根据客户选择的方式在è¯Õd–事äšg队列åQˆfetchEventsåQ‰æ—¶˜q›è¡Œä¸åŒçš„处理ã€?#8220;轮询”模式ä¸?fetchEvents() 会马上返回ã€?#8221;‹¹?#8220;å’?#8221;æ‹?#8220;模式使用é˜Õd¡žçš„æ–¹å¼è¯»äº‹äšgåQŒå¦‚果超æ—Óž¼Œä¼šå‘¾l™å®¢æˆïL«¯å‘送一个没有新信息收到çš?#8220;heartbeat“事äšgåQŒå¦‚果是“æ‹?#8221;模式åQŒä¼šæŠ?#8220;heartbeat”ä¸?#8220;refresh”事äšg一起传¾l™å®¢æˆïL«¯åQŒé€šçŸ¥å®¢æˆ·ç«¯é‡æ–°å‘凸™¯·æ±‚、徏立连接ã€?/p> <p>客户服务器之间的会话½Ž¡ç†</p> <p>服务端在客户端发é€?join è¯äh±‚æ—Óž¼Œä¼šäؓ客户端分配一个会è¯?IDåQ?òq¶ä¼ ¾l™å®¢æˆïL«¯åQŒç„¶åŽå®¢æˆïL«¯ž®±é€šè¿‡æ­¤ä¼šè¯?ID 标明íw«ä†¾å‘出 subscribe å’?listen è¯äh±‚。服务器端会为每个会话维护一个订阅的主题集合、事仉™˜Ÿåˆ—ã€?/p> <p>服务器端的事件源会把æ–îCñ”生的事äšg以多播的方式发送到每个会话åQˆå³è®¢é˜…者)的事仉™˜Ÿåˆ—里ã€?/p> <p>  <br />   回页é¦?<br />  <br /> ž®ç»“</p> <p>本文介绍了如何在现有的技术基¼‹€ä¸Šé€‰æ‹©åˆé€‚çš„æ–ÒŽ¡ˆå¼€å‘一ä¸?#8220;服务器推”的应用,最优的æ–ÒŽ¡ˆ˜q˜æ˜¯å–决于应用需求的本èín。相对于传统çš?Web 应用åQ?目前开å?Comet 应用˜q˜æ˜¯å…ähœ‰ä¸€å®šçš„æŒ‘战性ã€?/p> <p>“服务器推”存在òq¿æ³›çš„应用需求,ä¸ÞZº†ä½?Comet 模型适用于大规模的商业应用,以及方便用户构徏 Comet 应用åQŒæœ€˜q‘几òqß_¼Œæ— è®ºæ˜¯æœåС噍˜q˜æ˜¯‹¹è§ˆå™¨éƒ½å‡ºçŽ°äº†å¾ˆå¤šæ–°æŠ€æœ¯ï¼ŒåŒæ—¶ä¹Ÿå‡ºçŽîCº†å¾ˆå¤šå¼€æºçš„ Comet 框架、协议。需求推动技术的发展åQŒç›¸ä¿?Comet 的应用会变得å’?AJAX 一æ äh™®åŠã€?/p> <p>参考资æ–?</p> <p>学习 <br /> developerWorks 文章“ 面向 Java 开发äh员的 Ajax: 使用 Jetty å’?Direct Web Remoting ¾~–写可扩展的 Comet 应用½E‹åº”åQšå—异步服务器端事äšg驱动çš?Ajax 应用½E‹åºå®žçŽ°è¾ƒäØ“å›°éš¾åQŒæœ¬æ–‡ä»‹¾läº†ä¸€¿Uç»“合ä‹Éç”?Comet 模式å’?Jetty 6 Continuations API 的解å†Ïx–¹æ³•ã€?<br /> “Comet: Low Latency Data for the Browser”åQšAlex Russell æ˜?Dojo Toolkit 的项目主½Ž¡å’Œ Dojo Foundation 的主席,他在˜q™ç¯‡åšå®¢æ–‡ç« ä¸­æå‡ÞZº† Comet ˜q™ä¸ªæœ¯è¯­ã€?<br /> “What else is burried down in the depth’s of Google’s amazing JavaScript?”åQˆAlex RusselåQ?006 òq?2 月)åQšAlex 在这½‹‡æ–‡ç« é‡Œä»‹ç»äº†å¦‚何ä‹Éç”?#8220;htmlfile”ActiveX 控äšg解决 iframe è¯äh±‚长连接时 IE 的加载显½Cºé—®é¢˜ã€?<br /> Comet wikiåQšæä¾›äº†å¾ˆå¤šå¼€æº?Comet 框架的链接ã€?<br /> JettyåQšJetty 是一¿Uå¼€æºçš„åŸÞZºŽæ ‡å‡†çš?Web 服务器,完全使用 Java 语言实现ã€?<br /> “Ajax, Comet and Jetty”åQˆGreg WilkinsåQŒWebtideåQ?006 òq?1 月)åQšWilkins 的这份白皮书讨论了扩å±?Ajax ˜qžæŽ¥çš?Jetty æž¶æž„æ–ÒŽ³•ã€?<br /> ContinuationsåQšäº†è§£æ›´å¤šå…³äº?Jetty çš?Continuations ç‰ÒŽ€§çš„信息ã€?<br /> “pushlet”åQšå¼€æº?comet 框架åQŒä‹É用了观察者模型。浏览器端提供了åŸÞZºŽ AJAX å’?iframe çš?JavaScript 库,服务器端使用 Java Servletã€?<br /> “How to implement COMET with PHP”åQšæä¾›çš„ comet-iframe.tar.gz 使用 iframe/htmlfile ž®è£…了一ä¸?JavaScript comet 对象åQŒæ”¯æŒ?IE、Mozilla Firefox ‹¹è§ˆå™¨ã€?<br /> “AFLAX”åQšAsynchronous Flash and XMLåQŒæä¾›äº†å¼ºå¤§çš?Flash、Javascript 库和很多范例ã€?<br /> developerWorks Ajax 技术资源中心:能找到更多关äº?Ajax 技术的文章和教½E‹ã€?<br /> developerWorks Web 开发技术专区:提供了关äº?Web 开发和架构斚w¢çš„大量文章ã€?<br /> developerWorks Java 技术专区:提供了关äº?Java ¾~–程各个斚w¢çš„æ•°ç™„¡¯‡æ–‡ç« ã€?<br /> ‹¹è§ˆ 技术书店,查阅有关本文所˜qîC¸»é¢˜ä»¥åŠå…¶ä»–技术主题的书籍ã€?nbsp; </p> <p><br />  </p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/335394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2010-10-17 23:45 <a href="http://www.aygfsteel.com/freeman1984/archive/2010/10/17/335394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g SQL 优化再学ä¹?/title><link>http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sun, 10 Oct 2010 15:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/334235.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/334235.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/334235.html</trackback:ping><description><![CDATA[<p> </p> <p>ä»?iåˆ?0gåQŒOracle不断˜q›åŒ–自己的SQL Tuningæ™ø™ƒ½åQŒä¸€äº›ç§˜¾cçñ”的优化口诀已经失效ã€?br />    但我喜欢失效åQŒä¸ç”¨è®°å£è¯€åQŒæ“ä¸ªToad for Oracle Xpert åQŒæŒ‰ç…§å¤§æ–¹å‘舒舒服服的调优才是爱做的事情ã€?/p> <p>1.Excution Plan<br />      Excution Plan是最基本的调优概念,不管你的调优吹得如何天花乱堕åQŒç»“果还是要由Excution plan来显½CºOracle 最¾lˆç”¨ä»€ä¹ˆçƒ¦å¼•、按什么顺序连接各表,Full Table Scan˜q˜æ˜¯Access by Rowid IndexåQŒç“¶é¢ˆåœ¨ä»€ä¹ˆåœ°æ–V€‚如果没有它的指å¯û|¼Œä¸€åˆ‡è°ƒä¼˜éƒ½æ˜¯è’™çš„ã€?/p> <p><br /> 2.Toad for Oracle Xpert<br />     用它来调优在真的好舒服。Quest åžåÆˆäº†Lecco后,ž®†å®ƒæ•´åˆåˆîCº†Toad çš„SQL Tunning里面åQšæœ€æ¸…æ™°çš„æ‰§è¡Œè®¡åˆ’æ˜¾½Cºï¼Œè‡ªåŠ¨ç”ŸæˆN条等价SQL、给å‡ÞZ¼˜åŒ–徏议,不同SQL执行计划的对比,˜q˜æœ‰å®žé™…执行的逻辑诅R€ç‰©ç†è¯»æ•°æ®½{‰ç­‰ä¸€ç›®äº†ç„¶ã€?/p> <p><br /> 3.索引<br />    大部分的性能问题其实都是索引应用的问题,Where子句、Order By、Group By 都要用到索引ã€?br />    一般开发äh员认为将索引建全了就可以下班回家了,实则˜q˜æœ‰é¢‡å¤šçš„æ€é‡å’Œé™·é˜±ã€?/p> <p>3.1 索引列上不要˜q›è¡Œè®¡ç®—<br />       ˜q™æ˜¯æœ€æœ€æ™®éçš„失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。烦引失效的原因也简单,索引是针对原值徏的二叉树åQŒä½ ž®†åˆ—å€?3/4+2折腾一番后åQŒåŽŸæ¥çš„äºŒå‰æ ‘å½“ç„¶å°±ç”¨ä¸ä¸Šäº†ã€‚è§£å†³çš„æ–ÒŽ³•:<br />   1. 换成½{‰ä­h语法åQŒæ¯”如trunc(order_date) 换成</p> <p>where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1  2.    ç‰¹åˆ«ä¸ø™®¡½Ž—徏立函数烦å¼?/p> <p>create index åQ©_XXXX on shop_order(trunc(order_date))    3.    ž®†è®¡½Ž—从½{‰å·å·¦è¾¹¿UÕdˆ°åŒ™¾¹<br />  ˜q™æ˜¯é’ˆå¯¹æŸäº›æ— å¿ƒä¹‹å¤±çš„纠正,把a*2>4ã€€æ”¹äØ“a>4/2åQ›æŠŠTO_CHAR(zip) = '94002' æ”¹äØ“zip = TO_NUMBER('94002');</p> <p>3.2 CBO与烦引选择æ€?br />      å»ÞZº†ç´¢å¼•也不一定会被Oracle用的åQŒå°±åƒä¸ªæŒ‘食的孩子。基于成本的优化å™?CBO, Cost-Based Optimizer)åQŒä¼šå…ˆçœ‹çœ‹è¡¨çš„大ž®ï¼Œ˜q˜æœ‰ç´¢å¼•的重复度åQŒå†å†›_®šç”¨è¿˜æ˜¯ä¸ç”¨ã€‚表中有100 条记录而其中有80 个不重复的烦引键å€? ˜q™ä¸ªç´¢å¼•的选择性就æ˜?0/100 = 0.8åQŒç•™æ„Toad里显½Cºçƒ¦å¼•çš„Selectiveå’ŒCardinailty。实在不听话æ—Óž¼Œž®Þp¦ç”¨hints来调教ã€?br />      另外åQŒwhere语句存在多条索引可用æ—Óž¼Œåªä¼šé€‰æ‹©å…¶ä¸­ä¸€æ¡ã€‚所以烦引也不是­‘Šå¤š­‘Šå¥½åQšï¼‰</p> <p>3.3 索引重徏<br />      传说中数据更新频¾Jå¯¼è‡´æœ‰20%的碎片时åQŒOraclež®×ƒ¼šæ”‘Ö¼ƒ˜q™ä¸ªç´¢å¼•。宁可信其有之下åQŒåº”该时常alter index <INDEXNAME> rebuild一下ã€?/p> <p>3.4 其他要注意的地方<br />       不要使用NotåQŒå¦‚goods_no != 2åQŒè¦æ”¹äØ“</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 条äšgåQŒæˆ–者where条äšg全部是烦引列æ—Óž¼ŒOracle ž®†ç›´æŽ¥ä»Žç´¢å¼•里获取数据而不去读真实的数据表åQŒè¿™æ ·å­ç†è®ºä¸Šä¼šå¿«å¾ˆå¤šï¼Œæ¯”如</p> <p>select order_no,order_time from shop_order where shop_no=4当order_no,order_time,shop_no ˜q™ä¸‰åˆ—全为烦引列æ—Óž¼Œä½ å°†çœ‹åˆ°ä¸€ä¸ªå’ŒòqÏx—¶å®Œå…¨ä¸åŒçš„æ‰§è¡Œè®¡åˆ’ã€?/p> <p>3.6 位图索引<br />      ä¼ è¯´ä¸­å½“æ•°æ®å€ÆD¾ƒž®‘,比如某些表示分类、状态的列,应该å»ÞZ½å›„¡ƒ¦å¼•而不是普通的二叉树烦引,否则效率低下。不˜q‡çœ‹æ‰§è¡Œè®¡åˆ’åQŒè¿™äº›ä½å›„¡ƒ¦å¼•鲜有被Oracle临幸的ã€?br />   </p> <p><br /> 4.减少查询往˜q”和查询的表<br /> ˜q™ä¹Ÿæ˜¯å¾ˆ½Ž€å•的大道理,½E‹åºä¸ŽOracle交互的成本极高,所以一个查询能完成的不要分开两次查,如果一个åó@环执行1万条查询的,怎么都快不到哪里åŽÖMº†ã€?/p> <p>4.1 ž®è£…PL/SQL存储˜q‡ç¨‹<br />   最高çñ”的做法是把åó@环的操作ž®è£…到PL/SQL写的存储˜q‡ç¨‹é‡Œï¼Œå› äؓ存储˜q‡ç¨‹éƒ½åœ¨æœåŠ¡ç«¯æ‰§è¡Œï¼Œæ‰€ä»¥æ²¡æœ‰æ•°æ®å¾€˜q”的消耗ã€?/p> <p><br /> 4.2 ž®è£…PL/SQL内部函数<br />   有机会,ž®†ä¸€äº›æŸ¥è¯¢å°è£…到函数里,而在普通SQL里ä‹É用这些函敎ͼŒåŒæ ·æ˜¯å¾ˆæœ‰æ•ˆçš„优化ã€?/p> <p>4.3 Decode/Case<br />   但存储过½E‹ä¹ŸéºÈƒ¦åQŒæ‰€ä»¥æœ‰case/decodeæŠŠå‡ æ¡æ¡ä»¶åŸºæœ¬ç›¸åŒçš„é‡å¤æŸ¥è¯¢åˆåÆˆä¸ÞZ¸€æ¡çš„用法åQ?/p> <p>SELECT<br />  COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,<br />  COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,<br />  COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high<br /> FROM products;4.4 一¿UWhere/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 />      ˜qžHibernate 新版也支持ROWID了,证明它非常有用。比如号¿U°åˆ é™¤é‡å¤æ•°æ®çš„æœ€å¿«å†™æ³•:</p> <p>DELETE FROM EMP E<br /> WHERE E.ROWID > (SELECT MIN(X.ROWID)<br /> FROM EMP X<br /> WHERE X.EMP_NO = E.EMP_NO);6.¾lˆæž¿U˜æŠ€ - Hints<br />    ˜q™æ˜¯Oracle DBAçš„çŽ©å…øP¼Œä¹Ÿæ˜¯¾lˆæžæ­¦å™¨åQŒæ¯”如Oracle在CBO,RBO中所做的选择æ€ÖM¸åˆè‡ªå·±å¿ƒæ°´æ—¶åQŒå¯ä»¥ç”¨å®ƒæ¥å¼ºåŠ›è°ƒæ•™ä¸€ä¸‹OracleåQŒç»“果经常让人喜出望外ã€?br />    如果开发äh员没那么多时间来专门学习它,可以依靠Toad SQL opmitzer 来自动生成这些提½Cºï¼Œç„¶åŽå¯Òޝ”一下各¿Uæ½Cºçš„实际效果。不˜q‡éšç€10gæ™ø™ƒ½çš„进化,hints的惊喜少了ã€?/p> <p>7. 扑ևºè¦ä¼˜åŒ–çš„Top SQL<br />     ¼‚¨äº†˜q™ä¹ˆä¹…的枪,如果找不到敌人是仉™ƒé—ïLš„事情ã€?br />     òq怺10g˜q™æ–¹é¢åšå¾—非常好。进入Web½Ž¡ç†ç•Œé¢åQŒå°±èƒ½çœ‹åˆ°å½“前或者ä“Q意一天的SQL列表åQŒæŒ‰æ€§èƒ½æŽ’序ã€?br />     有了它,SQL Traceå’ŒTKPROF都可以不用了ã€?/p> <p><br /> 本文来自CSDN博客åQŒè{载请标明出处åQšhttp://blog.csdn.net/calvinxiu/archive/2005/11/15/529756.aspx</p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/334235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2010-10-10 23:52 <a href="http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软äšg构架师的特点http://www.aygfsteel.com/freeman1984/archive/2010/10/10/334233.html疯狂疯狂Sun, 10 Oct 2010 15:45:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/10/10/334233.htmlhttp://www.aygfsteel.com/freeman1984/comments/334233.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/10/10/334233.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/334233.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/334233.html来自äº?Rational EdgeåQšåœ¨ç”µåª„制作术语中,软äšg™å¹ç›®¾lç†è¢«ç§°ä½œåˆ¶ä½œähåQŒå› ä¸ÞZ»–们决定需要做什么事情。而èÊY件构架师ž®±æ˜¯å¯¼æ¼”åQŒä»–来决定所作的事情是否正确åQŒåƈ且他要保证äñ”品符合投资äh的要求。下面这½‹‡æ–‡ç« å°±æ˜¯æ˜q°èÊY件构架师的ã€?/blockquote>

 ˜q™ç¯‡æ–‡ç« æ˜¯å…³äºŽèÊY件构架的¾pÕdˆ—文章åQˆå…±å››ç¯‡åQ‰ä¸­çš„第二篇。上个月åQ?a target="_blank">˜q™ä¸ª¾pÕdˆ—文章中的½W¬ä¸€½‹?/a>¾l™æž„架作了一个定义。因此现在我们可以把注意力集中到创徏构架的äh员——构架师íw«ä¸Šã€‚èÊY件构架师被证明是软äšg开发项目过½E‹ä¸­æœ€å…ähŒ‘战性的角色。èÊY件构架师是项目的技术领袖,òq¶ä¸”从技术角度来è®ÔŒ¼Œä»–承担了™å¹ç›®æˆèÓ|的责仅R€?/em>

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

[构架师是]è´Ÿè´£¾pȝ»Ÿæž„æž¶çš„ähåQŒå›¢é˜Ÿæˆ–者组¾l‡ã€?a href="#notes"> 1

ä½œäØ“™å¹ç›®çš„æŠ€æœ¯ä¸»½Ž¡ï¼Œæž„架师的技术需要非常的òq¿æ³›åQŒè¿™æ¯”技术深度更加重要(当然构架师在特定的领域需要一定的技术深度)ã€?/em>

软äšg构架师是技术主½Ž?/span>

首先åQŒèÊY件构架师是技术主½Ž¡ï¼Œ˜q™æ„å‘³ç€é™¤äº†ä»–要有技术上的技能外åQŒè¿˜è¦æœ‰å¾ˆå¥½çš„é¢†å¯¼æ‰èƒ½ã€‚æž„æž¶å¸ˆçš„é¢†å¯ÆDƒ½åŠ›åœ¨å›¢é˜Ÿä¸­å’Œ™å¹ç›®è´¨é‡æŽ§åˆ¶ä¸­è“v着十分重要的作用ã€?/p>

在团队中åQŒæž„架师是项目的技术æ€È®¡åQŒä»–需要有丰富的知识背景,以便作出技术上的决定。相对于构架师来è¯ß_¼Œ™å¹ç›®¾lç†æ˜¯æ¥½Ž¡ç†™å¹ç›®çš„资源,旉™—´˜q›åº¦å’ŒèŠ±è´¹çš„ã€‚ä‹É用电影制作来做类比的话,™å¹ç›®¾lç†ž®±æ˜¯åˆ¶ç‰‡äººï¼ˆä»–要¼‹®å®šå·¥ä½œè¢«å®Œæˆäº†åQ‰ï¼Œè€Œæž„架师是导演(他需要确定工作被正确的完成)。由于他们在™å¹ç›®ä¸­æ‰€å¤„的位置åQŒæž„架师和项目经理是公众人物åQŒåœ¨ä¸€ä¸ªå›¢é˜Ÿä¸­åQŒä»–们是整个™å¹ç›®æ‰€æ¶‰åŠçš„æ‰€æœ‰äh员的联系枢纽。构架师应该为徏立èÊY件构架争取投资,òq¶ä¸”要明¼‹®å¾ç«‹èÊY件构架能¾l™ç»„¾l‡å¸¦æ¥çš„价倹{€?/p>

构架师还要把团队¾l„织在构架周å›ß_¼Œòq¶ä¸”要积极地投入到计划活动上åQŒå› ä¸ø™¦æŠŠæž„æž¶è{化成为完成ä“Q务的先后™åºåºåQŒè¿™æ äh‰èƒ½åŠæ—¶åœ°¼‹®å®šåœ¨ä»€ä¹ˆä½¾|®éœ€è¦ä»€ä¹ˆæŠ€æœ¯ã€‚有一炚wœ€è¦æ³¨æ„ï¼Œç”׃ºŽæž„架师能否成功与团队的整体水òqÏxœ‰å¾ˆå¤§å…³ç³»åQŒæ‰€ä»¥æž„架师应该参与团队新成员录用的面试ã€?/p>

æ ÒŽ®æž„架师所拥有的能力,他可以同时参与其他团队的工作。构架师需要根据具体的实例情况来做领导军_®šåQŒåƈ且在军_®š˜q‡ç¨‹ä¸­è¦å±•çŽ°å‡ø™ƒö够的自信。一个成功的构架师是以äh为导向的åQŒåƈ且像一个教¾lƒä¸€æ ïL»™ä»–的团队安排工作旉™—´ã€‚这对于ž®ç»„的成员来说是有好处的åQŒä»–们可以及时得到帮助。这是整个团队的一个巨大胦富ã€?/p>

构架师还要把¾_‘ÖŠ›æ”‘Öœ¨åˆ‡å®žå·¥ä½œçš„交付上åQŒä»–是技术方面的推进力量。构架师需要做军_®šåQˆç»å¸”Rœ€è¦åœ¨åŽ‹åŠ›ä¸‹åšå†›_®šåQ‰ï¼Œòq¶ä¸”要保证这些决定是¾lè¿‡æˆå‘˜ä¹‹é—´çš„交‹¹çš„åQŒåƈ且确保它能够执行ã€?/p>

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

下面介绍一个äh和一个角色的区别。一个äh可以扮演很多角色åQˆä¾‹å¦‚,Mary是一个开发äh员,同时也是一个测试äh员)åQŒåŒæ—Óž¼Œä¸€ä¸ªè§’色可以有很多的äh扮演åQˆä¾‹å¦‚,Maryå’ŒJohn都是‹¹‹è¯•人员åQ‰ã€‚构架师的角色需要非常广泛的技术,˜q™å°±ä¸ÞZ»€ä¹ˆæž„架师的角色经常是很多人同时担当。这样可以ä‹É技术知识在ž®ç»„中传播开来,每一个äh都把他的或者她的经验带到工作中。特别是当某¿UæŠ€æœ¯åŒæ—¶è¢«å•†ä¸šéƒ¨é—¨å’ŒæŠ€æœ¯å°¾l„理解的时候,˜q™é¡¹æŠ€æœ¯å°±ä¼šæœ€å¤§ç¨‹åº¦çš„传播开来。小¾l„所作的¾l“æžœåQŒéœ€è¦è¢«"òqŒ™¡¡ã€? 贯穿整个文章的术è¯?构架å¸?åQŒæ˜¯æŒ‡çš„一个äh或者整个小¾l„的成员ã€?/p>

[一个小¾l„]是一些拥有各¿UæŠ€æœ¯çš„人的集合åQŒä»–们之间有共同需要完成的目标åQŒåƈ且之间相互负责ä“Qã€?/em> 2

如果一个小¾l„来担当构架师的角色åQŒé‚£ä¹ˆå°±éœ€è¦æœ‰ä¸€ä¸ªähä½œäØ“˜q™äº›æž„架师的领导åQŒä»–要拥有整体的前景åQŒåƈ且需要调节构架师ž®ç»„之间的问题。如果没有这¿Uè°ƒèŠ‚ï¼Œæž„æž¶å¸ˆå°¾l„成员之间就会存在危险,他们可能不会建立å‡ÞZ¸€ä¸ªç´§å¯†åœ°æž„架或者决½{–不会被成功的完成ã€?/p>

现在有一个新的概念在构架师小¾l„中被提出:ä¸ÞZº†ä½¿æˆå‘˜ä¹‹é—´è¾¾åˆ°å…±åŒçš„目的和目标,团队为构架师ž®ç»„建立òq¶å‘布了一个章½E‹ã€?a href="#notes"> 3

好的构架师知道自å·Þqš„强项和弱点在哪里。无论构架师的角色被一个äh˜q˜æ˜¯ä¸€ä¸ªå°¾l„担当,他们背后都有"值得信赖的顾é—?的支持。他们可以通过和其他构架师协同工作来å×I补自íw«åœ¨æŸäº›æŠ€æœ¯æ–¹é¢çš„不èƒö。最好的构架通常是被一个构架师ž®ç»„建立的,而不是一个äh。原因很½Ž€å•,一个小¾l„的力量总要比一个äh的知识丰富的多ã€?/p>

构架师小¾l„çš„æ¦‚å¿µæœ‰ä¸€ä¸ªç¼ºé™øP¼Œä»–们有时被团队中的其他ähè®¤äØ“æ˜¯åœ¨"象牙å¡?é‡Œå·¥ä½œï¼Œå› äØ“ä»–ä»¬çš„äñ”品经常是很有智慧的但却没有ä‹É用ä­h倹{€‚è¿™¿Uè¯¯è§£å¯ä»¥ä»Žå¼€å§‹å°±æŠŠå®ƒå‡åˆ°æœ€ž®ï¼š1)¼‹®ä¿æ‰€æœ‰çš„æ¶‰ä¼—都能¿U¯æžåœ°åå•†ï¼Œ2)不断的交‹¹æž„架和它的价å€û|¼Œ3)在执行过½E‹ä¸­è¦æœ‰¾l„织½{–略的意识ã€?/p>

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

构架师应该对软äšg开发过½E‹æœ‰æ­£ç¡®çš„ä¼°è®¡ï¼Œå› äØ“˜q™ä¸ª˜q‡ç¨‹¼‹®ä¿ž®ç»„中的所有成员ä‹É用同½{‰çš„æ–¹å¼å·¥ä½œã€‚一个好的过½E‹éœ€è¦å®šä¹‰å„个角色的工作承担责ä“QåQ?产品的徏立,不同角色之间的协同工作等½{‰ã€‚由于构架师每天的工作都需要和很多ž®ç»„成员打交道,所以对于他们来说了解工作的职责是非帔R‡è¦çš„。在每天的工作中åQŒå¼€å‘小¾l„经常要扑ֈ°æž„架师,了解该做什么工作以及怎么åŽÕdšã€‚è¿™ž®±æ˜¯è½¯äšg构架师和™å¹ç›®¾lç†ä¹‹é—´çš„细微差别ã€?/p>

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

ž®½ç®¡æ‹¥æœ‰äº†ä¸°å¯Œçš„软äšg开发经验,但是我们˜q˜æœŸæœ›ï¼ˆæˆ–者是要求åQ‰æž„架师拥有一定商业领域的知识ã€?/p>

[一个领域]是在一个范围内工作的从业äh员ä‹É用一¾pÕdˆ—特定的概念和术语来表达这个领域内的知识ã€?/em> 4

˜q™ç§çŸ¥è¯†ž®†ä¼šä½¿æž„架师更好的理解系¾lŸçš„需求,òq¶æŠŠ¾_‘ÖŠ›æŠ•èín于其中,¼‹®ä¿¾pȝ»Ÿçš„éœ€æ±‚æ˜¯åˆé€‚çš„â€”â€”ä¾‹å¦‚ï¼Œä»Žæž„æž¶å¸ˆé¢†åŸŸçš„è§’åº¦å‡ºå‘ï¼Œéœ€æ±‚æ˜¯è¦è¢«å‡†ç¡®æ•èŽ·çš„ã€‚ç»å¸æ€¼šå‡ºçް˜q™æ ·çš„æƒ…况,一个特定系列的构架样式可以被应用到与它相联¾pȝš„一个特定的领域中。如果构架师知道˜q™ç§æ˜ å°„关系åQŒé‚£ä¹ˆå¯¹ä»–的工作ž®†æ˜¯å¾ˆå¤§çš„帮助ã€?/p>

å› æ­¤åQŒä¸€ä¸ªå¥½çš„æž„架师ž®†ä¼šåœ¨èÊY件开发和商业领域的知识上面做出权衡。如果一个构架师å…ähœ‰å¾ˆå¥½çš„èÊY件开发经验但是不了解商业领域åQŒé‚£ä¹ˆä»–的解å†Ïx–¹æ¡ˆå¯èƒ½ä¸ä¼šè§£å†›_®žé™…的问题åQŒè€Œä»…仅只能反映出构架师是多么¾_ùN€šä»–的专业ã€?/p>

另外一个构架师需要精通商业领域知识的原因是,构架师要能够预见软äšg构架随时可能出现的变化。由于èÊY件构架受它被配置的环境的影响非常大,所以对商业领域有正¼‹®ç†è§£çš„æž„架师,可以从èÊY件构架的角度åQŒå¯¹ä¸æ–­å˜åŒ–的情况做出更有远见的决策。例如,如果构架师发觉哪¿Uæ–°çš„æ ‡å‡†åœ¨æœªæ¥å¾ˆå¯èƒ½æˆä¸ÞZ¸»‹¹ï¼Œé‚£ä¹ˆä»–将会ä‹É自己的èÊY件构架在可用寿命内符合这¿Uæ ‡å‡†ã€?/p>

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

软äšg构架的一个特定方面需要有一定的专业知识åQŒå› æ­¤ä¸€ä¸ªæž„架师必须具备˜q™ä¸ªæ°´åã^的知识才能够胜ä“Qä»–çš„å·¥ä½œã€‚å¯æ˜¯æž„æž¶å¸ˆä¸å¿…æˆäØ“æŠ€æœ¯ä¸“å®Óž¼Œ˜q™ä½“çŽîCº†˜q™ç¯‡æ–‡ç« ½W¬ä¸€éƒ¨åˆ†çš„æ€æƒ³â€”—构架师宏观上的决策。因此,构架师只需要了解宏观上的问题,而不必关心细节化的事情。由于技术的变化˜q‡äºŽé¢‘繁åQŒæ‰€ä»¥æž„架师要随时与˜q™äº›å˜åŒ–保持同步ã€?/p>

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

虽然软äšg构架òq¶ä¸ä»…ä»…æ˜¯è®¾è®¡ï¼Œä½†æ˜¯è®¾è®¡æ— ç–‘æ˜¯å¾ˆé‡è¦çš„ä¸€ä¸ªç»„æˆéƒ¨åˆ†ã€‚æž„æž¶å¸ˆåº”è¯¥æ‹¥æœ‰å¾ˆå¥½çš„è®¾è®¡æŠ€å·§ï¼Œå› äØ“è½¯äšg的构架包含整个èÊY件的关键性设计决½{–。这¿Uå†³å®šåŒ…括èÊY件主要结构的设计决策åQŒç‰¹å®šéƒ¨åˆ†çš„选择以及指导的说明文档等½{‰ã€‚äØ“äº†ç¡®ä¿ç³»¾lŸæž„架的完整性,上面那些要素都要被特别的应用到设计中åQŒè¿™å¯ÒŽ•´ä¸ªç³»¾lŸçš„æˆåŠŸå®Œæˆæœ‰å¾ˆå¤§çš„ä½œç”¨ã€‚å› æ­¤è¿™äº›è¦ç´ éœ€è¦æœ‰å›ºå®šçš„æ‹¥æœ‰è®¾è®¡æŠ€å·§çš„äººæ¥è´Ÿè´£â€”â€”è¿™ä¸ªähž®±æ˜¯æž„架师ã€?/p>

软äšg构架师需要拥有很好的½E‹åºè®¾è®¡æŠ€å·?/span>

开发äh员是整个™å¹ç›®å¼€å‘过½E‹ä¸­æœ€é‡è¦çš„一个小¾l„之一åQŒæž„架师要随时和他们保持联系。毕竟他们要¼‹®ä¿è½¯äšg在最后交付ä‹Éç”¨çš„æ—¶å€™èƒ½å¤ŸæˆåŠŸçš„æ‰§è¡Œã€‚å¦‚æžœæž„æž¶å¸ˆè®¤äØ“å¼€å‘äh员的工作是十分有价值的åQŒé‚£ä¹ˆä»–们之间的交流ž®†ä¼šå¾ˆæœ‰æ•ˆç”¨ã€‚因此,软äšg构架师需要拥有一定的½E‹åºè®¾è®¡æŠ€æœ¯ï¼Œå³ä‹É不需要他们编写程序ã€?/p>

大多数成功的构架师,在一些场合中都是核心½E‹åºå‘˜ï¼Œ˜q™äº›åœºåˆé€šå¸¸æ˜¯ä»–们的职业方向。即使是技术发展了åQŒæœ‰æ–°çš„½E‹åºè¯­è¨€å‡ºçްåQŒä¸€ä¸ªå¥½çš„æž„架师可以把以前学˜q‡çš„设计语言的概念和新的语言联系èµäh¥åQŒä»¥è¾‘Öˆ°å¯ÒŽ–°è¯­è¨€æ›´åŠ æ·±å…¥çš„äº†è§£ã€‚æ²¡æœ‰è¿™¿UçŸ¥è¯†ï¼Œè½¯äšg构架师就不能寚wœ€è¦æ‰§è¡Œçš„æž„架的重要元素做出完¾ŸŽçš„决策åQŒä¾‹å¦‚执行的¾l„织和程序标准的采用。这会ä‹Éçš„èÊY件构架师和开发äh员之间äñ”生沟通上的障¼„ã€?/p>

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

和以上提到的几种技术比èµäh¥åQŒæž„架师的沟通能力是最重要的。构架师需要精通所有的沟通手ŒDµï¼Œç‰¹åˆ«æ˜¯éœ€è¦æœ‰ä¸€å®šçš„语言能力åQŒåŒ…括说åQŒå†™å’Œæ¼”讲能力。交‹¹æ˜¯åŒå‘的,所以构架师˜q˜éœ€è¦æ˜¯ä¸€ä¸ªå¾ˆå¥½çš„聆听者与观察者ã€?/p>

ž®ç»„成员之间有效的沟通是™å¹ç›®æˆåŠŸçš„åŸºæœ¬æ¡ä»¶ã€‚äØ“äº†æ›´å¥½çš„ç†è§£æŠ•èµ„äººçš„éœ€æ±‚ï¼Œä¸Žä»–ä»¬çš„æ²Ÿé€šæ˜¾å¾—å°¤ä¸ºé‡è¦ï¼ŒåŒæ—¶˜q˜èƒ½å¤Ÿè®©æ‰€æœ‰çš„æŠ•资人在软äšg构架上达成共识。与™å¹ç›®ž®ç»„çš„æ²Ÿé€šåŒæ—¶ä¹Ÿå¾ˆé‡è¦ï¼Œå› äØ“æž„æž¶å¸ˆçš„èŒè´£ä¸å•å•æ˜¯æŠŠä¿¡æ¯ä¼ è¾„¡»™ž®ç»„åQŒåŒæ—¶è¿˜è¦æ¿€åŠ×ƒ»–们工作。构架师˜q˜è¦è´Ÿè´£æŠŠç³»¾lŸçš„æž„想传达¾l™å°¾l„成员,使得它们让全¾l„äh员了解,而不仅仅是构架师自己理解ã€?/p>

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

构架师不能在自己不了解的环境中做出决½{–,然而项目的开发周期也没有¾l™ä»–提供充èƒö的时间去探烦所有的环境åQŒæ‰€ä»¥åœ¨å¾ˆå¤§çš„压力下做的决策不太可能成功。这¿UçŽ¯å¢ƒæ˜¯è¢«æœŸæœ›çš„åQŒæˆåŠŸçš„æž„æž¶å¸ˆéžå¸¸æ»¡æ„è¿™¿UçŽ¯å¢ƒï¼Œè€Œä¸æ„¿åŽ»æ”¹å˜å®ƒã€‚å› æ­¤æž„æž¶å¸ˆéœ€è¦æ˜¯åŽšè„¸çš®çš„åQŒå› ä¸ÞZ»–们很可能在项目开发过½E‹ä¸­æ›´æ­£è‡ªå·±çš„决定,òq¶ä¸”按原路返回查æ‰ùN—®é¢˜ã€‚正如Philippe Kruchten所说的åQ?#8220;软äšg构架师的一生是一个æ˜Oé•¿çš„åQŒåœ¨é»‘æš—ä¸­ä¸æ–­æ‘¸ç´¢åÆˆä¸æ–­æ”¹è¿›è‡ªå·±çš„å†³å®šçš„˜q‡ç¨‹”ã€?a href="#notes"> 5

一个糟¾p•的决策很可能毁掉一个项目。项目小¾l„中的其他成员会å¯ÒŽž„架师失去信心åQŒè¿™æ—‰™¡¹ç›®ç»ç†å°±è¦å‚ä¸Žè¿›æ¥ï¼Œå› äØ“½{‰å¾…构架的完善不会让™å¹ç›®æœ‰æ‰€˜q›å±•。最危险的情冉|˜¯åQšå¦‚果构架师没有把自å·Þqš„决策文档化,那么ž®ç»„的其它成员可能会自己制定决策åQŒè€Œè¿™¿Uå†³å®šå¾ˆå¯èƒ½æ˜¯é”™è¯¯çš„ã€?/p>

软äšg构架师需要觉察组¾l‡çš„æ”¿ç­–

一个成功的构架师不会只兛_¿ƒæŠ€æœ¯é—®é¢˜ï¼Œä»–们˜q˜ä¼šå…›_¿ƒ¾l„织的权力动向,时刻了解团队的决定权在哪里。这可以保证他们正在和正¼‹®çš„äºø™®¨è®ºé¡¹ç›®çš„决策问题。忽略团队的权力是天真的æƒÏx³•。现实往往是这æ ïLš„åQšå›¢é˜Ÿç»å¸æ€¼šå¼ø™¿«™å¹ç›®ž®ç»„在规定时间交付系¾lŸï¼Œ˜q™éœ€è¦æž„架师正确的评估到˜q™ä¸ªæ—‰™—´ã€?/p>

软äšg构架师是一个谈判代è¡?/span>

ä¸ÞZº†äº†è§£è½¯äšg构架的很多尺度问题,构架师需要随时和投资人沟通。这¿Uæ²Ÿé€šå¸¸å¸”Rœ€è¦è°ˆåˆ¤æŠ€å·§ã€‚例如,构架师需要特别注意的一件事是:最ž®åŒ–™å¹ç›®ä¸­å¯èƒ½å‡ºçŽ°çš„é£Žé™©åQŒå› ä¸ø™¿™ç›´æŽ¥å…³ç³»åˆ°ç³»¾lŸæž„æž¶çš„½E›_®šæ€§ã€‚由于风险是和需求紧密相˜qžçš„åQŒæ‰€ä»¥å¯ä»¥é€šè¿‡¿U»é™¤æˆ–者减ž®è¿™æ–šw¢çš„需求来降低风险。因此把˜q™ç§éœ€æ±‚取消,需要构架师和投资äh达成å…Þp¯†çš„。这ž®±éœ€è¦æž„架师是一个有效的谈判人员åQŒæ¥æƒè¡¡˜q™äº›é—®é¢˜ã€?/p>

æ€È»“

˜q™ç¯‡æ–‡ç« ä»‹ç»äº†èÊY件构架师的一些工作。这个系列中的下几篇ž®†ä»‹¾lèÊY件构架过½E‹çš„ç‰ÒŽ€§ï¼Œä»¥åŠæŠŠèÊY件构架作为IT资äñ”的基¼‹€å¤„理的好处ã€?/p>

鸣谢

˜q™ç¯‡æ–‡ç« æ¥æºäºŽä¸‹é¢è¿™æœ¬ä¹¦åQŒä¹¦åæš‚å®šäØ“åQ?#8220;软äšg构架构徏的过½E?#8221;åQ›ä¸‹é¢æˆ‘è¦æ„Ÿè°¢äØ“˜q™ç¯‡æ–‡ç« ä¸­ä½œæ³¨é‡Šçš„äh员:Grady BoochåQŒDave BrainesåQŒAlan BrownåQŒMark DicksonåQŒLuan Doan-MinhåQŒHolger HeussåQŒKelli HoustonåQŒPhilippe KruchtenåQŒNick RozanskiåQŒDave Williams以及Eoin Woodsã€?br />
文章来自åQ?a >http://www.ibm.com/developerworks/cn/rational/rationaledge/content/apr06/eeles/



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ³¤º£ÏØ| ÆÕ¸ñÏØ| ¸£ÖÝÊÐ| ÓÀµÇÏØ| ½­´¨ÏØ| Ïå³ÇÏØ| Íû¿üÏØ| °àÂêÏØ| Ê®ÑßÊÐ| Ê¯Â¥ÏØ| ÏÄÒØÏØ| ¶Ø»ÍÊÐ| ¹ÛÌÁÇø| ºÍÁúÊÐ| ÃáÄþÏØ| ÓÀÄþÏØ| èë´¨ÏØ| ͬ½­ÊÐ| °ÍÀï| ¶¼À¼ÏØ| ÂíÁúÏØ| ôë½­ÏØ| ÍòÔ´ÊÐ| ÆÖÏØ| ³çÒåÏØ| ¸§Ë³ÏØ| ×ÔÖÎÏØ| Ì¨Ç°ÏØ| ÎÚÀ­ÌØÇ°Æì| µÃÈÙÏØ| Îå´óÁ¬³ØÊÐ| ¿Ë¶«ÏØ| ÓàÇìÏØ| ·ïÑôÏØ| ¿Æ¶û| ÄÏ¿ªÇø| µÂÇåÏØ| ³¤É³ÏØ| ºÎ÷ÊÐ| ºôÂ×±´¶ûÊÐ| ÆÑ³ÇÏØ|