﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-大龙的博客</title><link>http://www.cppblog.com/fwxjj/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 13 Mar 2026 02:30:21 GMT</lastBuildDate><pubDate>Fri, 13 Mar 2026 02:30:21 GMT</pubDate><ttl>60</ttl><item><title>淘宝可伸缩高性能互联网架构HSF --------- 转</title><link>http://www.cppblog.com/fwxjj/archive/2014/10/22/208651.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Wed, 22 Oct 2014 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2014/10/22/208651.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/208651.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2014/10/22/208651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/208651.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/208651.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 时间过得很快，来淘宝已经两个月了，在这两个月的时间里，自己也感受颇深。下面就结合淘宝目前的一些底层技术框架以及自己的一些感触来说说如何构建一个可 伸缩，高性能，高可用性的分布式互联网应用。一&nbsp;应用无状态（淘宝session框架）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;俗话说，一个系 统的伸缩性的好坏取决于应用的状态如何管理。为什么这么说呢？咱们...&nbsp;&nbsp;<a href='http://www.cppblog.com/fwxjj/archive/2014/10/22/208651.html'>阅读全文</a><img src ="http://www.cppblog.com/fwxjj/aggbug/208651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2014-10-22 15:01 <a href="http://www.cppblog.com/fwxjj/archive/2014/10/22/208651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hashcode重复的可能性超大(转)</title><link>http://www.cppblog.com/fwxjj/archive/2014/08/31/208188.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Sun, 31 Aug 2014 06:59:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2014/08/31/208188.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/208188.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2014/08/31/208188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/208188.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/208188.html</trackback:ping><description><![CDATA[<div>用String的hashcode得到int类型作为主键。其实hashcode重复的可能性超大，下面是java的缺省算法： <br /> <div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid"> <div><img id="Codehighlighter1_23_277_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hashCode()&nbsp;</span><span id="Codehighlighter1_23_277_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;h&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;hash; <br /><img id="Codehighlighter1_53_253_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(h&nbsp;</span><span style="color: #000000">==</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_53_253_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;off&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;offset; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;val[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;count; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img id="Codehighlighter1_168_221_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;len;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_168_221_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">31</span><span style="color: #000000">*</span><span style="color: #000000">h&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;val[off</span><span style="color: #000000">++</span><span style="color: #000000">]; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;h; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span> </div></div>但是什么情况下会重复？下面是测试代码 <br /><br /> <div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid"> <div><br /><br /><br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" height="16" width="11"  alt="" /><span style="color: #000000">import&nbsp;java.util.HashMap; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" height="16" width="11"  alt="" /> <br /><img id="Codehighlighter1_45_1191_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11"  alt="" /></span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="Codehighlighter1_45_1191_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;HashMap&nbsp;map&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap(); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;startChar&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">'</span><span style="color: #000000">A</span><span style="color: #000000">'</span><span style="color: #000000">; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;endChar&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">'</span><span style="color: #000000">z</span><span style="color: #000000">'</span><span style="color: #000000">; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;offset&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;endChar&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;startChar&nbsp;</span><span style="color: #000000">+</span>&nbsp;<span style="color: #000000">1</span><span style="color: #000000">; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;dup&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img id="Codehighlighter1_287_421_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_287_421_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">3</span><span style="color: #000000">; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;chars&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #0000ff">new</span>&nbsp;<span style="color: #0000ff">char</span><span style="color: #000000">[len]; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tryBit(chars,&nbsp;len); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff">out</span><span style="color: #000000">.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.pow(offset,&nbsp;len)&nbsp;</span><span style="color: #000000">+</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;dup); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img id="Codehighlighter1_473_614_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;tryBit(</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;chars,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;</span><span id="Codehighlighter1_473_614_Open_Text"><span style="color: #000000">{ <br /><img id="Codehighlighter1_521_611_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;startChar;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;endChar;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_521_611_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chars[i&nbsp;</span><span style="color: #000000">-</span>&nbsp;<span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">&gt;</span>&nbsp;<span style="color: #000000">1</span><span style="color: #000000">) <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tryBit(chars,&nbsp;i&nbsp;</span><span style="color: #000000">-</span>&nbsp;<span style="color: #000000">1</span><span style="color: #000000">); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(chars); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img id="Codehighlighter1_657_1189_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;test(</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;chars)&nbsp;</span><span id="Codehighlighter1_657_1189_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(chars).replaceAll(</span><span style="color: #000000">"</span><span style="color: #000000">[^a-zA-Z_]</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">).toUpperCase();</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;195112:0 <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">String&nbsp;str&nbsp;=&nbsp;new&nbsp;String(chars).toLowerCase();</span><span style="color: #008000">//</span><span style="color: #008000">195112:6612 <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">String&nbsp;str&nbsp;=&nbsp;new&nbsp;String(chars).replaceAll("[^a-zA-Z_]","");</span><span style="color: #008000">//</span><span style="color: #008000">195112:122500 <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">String&nbsp;str&nbsp;=&nbsp;new&nbsp;String(chars);</span><span style="color: #008000">//</span><span style="color: #008000">195112:138510</span><span style="color: #008000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hash&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.hashCode(); <br /><img id="Codehighlighter1_999_1121_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(map.containsKey(hash))&nbsp;</span><span id="Codehighlighter1_999_1121_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.</span><span style="color: #0000ff">get</span><span style="color: #000000">(hash); <br /><img id="Codehighlighter1_1062_1117_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">s.equals(str))&nbsp;</span><span id="Codehighlighter1_1062_1117_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dup</span><span style="color: #000000">++</span><span style="color: #000000">; <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff">out</span><span style="color: #000000">.println(s&nbsp;</span><span style="color: #000000">+</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;str); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img id="Codehighlighter1_1128_1186_Open_Image" src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span>&nbsp;<span style="color: #0000ff">else</span>&nbsp;<span id="Codehighlighter1_1128_1186_Open_Text"><span style="color: #000000">{ <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(hash,&nbsp;str); <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println(str);</span><span style="color: #008000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" height="16" width="11"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" height="16" width="11"  alt="" />}</span></span><span style="color: #000000"> <br /><img src="http://steeven.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" height="16" width="11"  alt="" /></span> </div></div><br />在A-z范围内有特殊字符，从结果看，仅仅3位长度的字符串： <br />不处理：　138510次重复 <br />去掉字母意外字符：　122500次重复 <br />所有字符转小写：6612次重复(少了很多） <br />去掉字母意外字符，并且转小写：没有重复！4位字符串也没见重复 <br /><br />不难看出： <br />1. 缺省实现为英文字母优化 <br />2. 字母大小写可能导致重复 <br /><br />可能： <br />长字符串可能hashcode重复 <br />中文字符串和特殊字符可能hashcode重复  		</div><br /><br /><span style="color: red;">注：由于是2006年的事，所以上面得出的数据有误。可自己进行测试。hash冲突次数大大减少。</span><br /><img src ="http://www.cppblog.com/fwxjj/aggbug/208188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2014-08-31 14:59 <a href="http://www.cppblog.com/fwxjj/archive/2014/08/31/208188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP/IP协议选项——TCP_KEEPALIVE</title><link>http://www.cppblog.com/fwxjj/archive/2014/08/18/208055.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Mon, 18 Aug 2014 09:41:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2014/08/18/208055.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/208055.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2014/08/18/208055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/208055.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/208055.html</trackback:ping><description><![CDATA[<h3><a name="t0"></a>1、KEEPALIVE作用</h3>
<p>KEEPALIVE机制，是TCP协议规定的TCP层（非应用层业务代码实现的）检测TCP本端到对方主机的TCP连接的连通性的行为。避免服务器在客户端出现各种不良状况时无法感知，而永远等在这条TCP连接上。</p>
<h3><a name="t1"></a>2、KEEPALIVE代码示例</h3>
<p>该选项可以设置这个检测行为的细节，如下代码所示：</p>
<div class="dp-highlighter bg_cpp">
<div class="bar">
<div class="tools"><strong>[cpp]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/gdutliuyun827/article/details/17377035#">view plain</a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/gdutliuyun827/article/details/17377035#">copy</a><a class="PrintSource" title="print" href="http://blog.csdn.net/gdutliuyun827/article/details/17377035#">print</a><a class="About" title="?" href="http://blog.csdn.net/gdutliuyun827/article/details/17377035#">?</a><a style="text-indent: 0px" title="在CODE上查看代码片" href="https://code.csdn.net/snippets/115863" target="_blank"><img style="position: relative; top: 1px; left: 2px" alt="在CODE上查看代码片" src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" /></a><a style="text-indent: 0px" title="派生到我的代码片" href="https://code.csdn.net/snippets/115863/fork" target="_blank"><img style="position: relative; top: 2px; left: 2px" alt="派生到我的代码片" src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" /></a></div></div>
<ol class="dp-cpp"><li class="alt"><span class="datatypes">int</span><span>&nbsp;keepAlive&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;非0值，开启keepalive属性 </span><span>&nbsp;&nbsp;</span></li><li><span></span><span class="datatypes">int</span><span>&nbsp;keepIdle&nbsp;=&nbsp;60;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;如该连接在60秒内没有任何数据往来,则进行此TCP层的探测 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="datatypes">int</span><span>&nbsp;keepInterval&nbsp;=&nbsp;5;&nbsp;</span><span class="comment">//&nbsp;探测发包间隔为5秒 </span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="datatypes">int</span><span>&nbsp;keepCount&nbsp;=&nbsp;3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;尝试探测的次数.如果第1次探测包就收到响应了,则后2次的不再发 </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>setsockopt(sockfd,&nbsp;SOL_SOCKET,&nbsp;SO_KEEPALIVE,&nbsp;(</span><span class="keyword">void</span><span>&nbsp;*)&amp;keepAlive,&nbsp;</span><span class="keyword">sizeof</span><span>(keepAlive));&nbsp;&nbsp;</span></span></li><li><span>setsockopt(sockfd,&nbsp;SOL_TCP,&nbsp;TCP_KEEPIDLE,&nbsp;(</span><span class="keyword">void</span><span>*)&amp;keepIdle,&nbsp;</span><span class="keyword">sizeof</span><span>(keepIdle));&nbsp;&nbsp;</span></span></li><li class="alt"><span>setsockopt(sockfd,&nbsp;SOL_TCP,&nbsp;TCP_KEEPINTVL,&nbsp;(</span><span class="keyword">void</span><span>&nbsp;*)&amp;keepInterval,&nbsp;</span><span class="keyword">sizeof</span><span>(keepInterval));&nbsp;&nbsp;</span></span></li><li><span>setsockopt(sockfd,&nbsp;SOL_TCP,&nbsp;TCP_KEEPCNT,&nbsp;(</span><span class="keyword">void</span><span>&nbsp;*)&amp;keepCount,&nbsp;</span><span class="keyword">sizeof</span><span>(keepCount));&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="cpp" code_snippet_id="115863" snippet_file_name="blog_20131217_1_4175906" name="code">int keepAlive = 1;    // 非0值，开启keepalive属性
int keepIdle = 60;    // 如该连接在60秒内没有任何数据往来,则进行此TCP层的探测
int keepInterval = 5; // 探测发包间隔为5秒
int keepCount = 3;        // 尝试探测的次数.如果第1次探测包就收到响应了,则后2次的不再发
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&amp;keepAlive, sizeof(keepAlive));
setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void*)&amp;keepIdle, sizeof(keepIdle));
setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&amp;keepInterval, sizeof(keepInterval));
setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&amp;keepCount, sizeof(keepCount));</pre>
<p>设置该选项后，如果60秒内在此套接口所对应连接的任一方向都没有数据交换，TCP层就自动给对方发一个保活探测分节(keepalive probe)。这是一个对方必须响应的TCP分节。它会导致以下三种情况：<br />&nbsp;&nbsp;&nbsp; 对方接收一切正常：以期望的ACK响应。60秒后，TCP将重新开始下一轮探测。<br />&nbsp;&nbsp;&nbsp; 对方已崩溃且已重新启动：以RST响应。套接口的待处理错误被置为ECONNRESET。<br />&nbsp;&nbsp;&nbsp; 对方无任何响应：比如客户端那边已经断网，或者客户端直接死机。以设定的时间间隔尝试3次，无响应就放弃。套接口的待处理错误被置为ETIMEOUT。</p>
<h3><a name="t2"></a>3、KEEPALIVE脚本设置</h3>
<p>全局设置可更改/etc/sysctl.conf,加上:<br />net.ipv4.tcp_keepalive_intvl = 5<br />net.ipv4.tcp_keepalive_probes = 3<br />net.ipv4.tcp_keepalive_time = 60<br />在程序中表现为：<br />阻塞模型下，当TCP层检测到对端socket不再可用时，内核无法主动通知应用层出错，只有应用层主动调用read()或者write()这样的IO系统调用时，内核才会利用出错来通知应用层。<br />非阻塞模型下，select或者epoll会返回sockfd可读,应用层对其进行读取时，read()会报错。</p>
<p><br />一点经验：<br />实际上我们在做服务器程序的时候，对客户端的保活探测基本上不依赖于这个TCP层的keepalive探测机制。<br />而是我们自己做一套应用层的请求应答消息，在应用层实现这样一个功能。</p><img src ="http://www.cppblog.com/fwxjj/aggbug/208055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2014-08-18 17:41 <a href="http://www.cppblog.com/fwxjj/archive/2014/08/18/208055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>haproxy+keepalived实现高可用负载均衡</title><link>http://www.cppblog.com/fwxjj/archive/2014/08/15/208027.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Fri, 15 Aug 2014 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2014/08/15/208027.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/208027.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2014/08/15/208027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/208027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/208027.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 软件负载均衡一般通过两种方式来实现：基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载，HAProxy就是开源的并且基于第三应用实现的软负载。HAProxy相比LVS的使用要简单很多，功能方面也很丰富。当 前，HAProxy支持两种主要的代理模式:"tcp"也即4层（大多用于邮件服务器、内部协议通信服务器等），和7层（HTTP）。在4层模式 下，...&nbsp;&nbsp;<a href='http://www.cppblog.com/fwxjj/archive/2014/08/15/208027.html'>阅读全文</a><img src ="http://www.cppblog.com/fwxjj/aggbug/208027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2014-08-15 16:15 <a href="http://www.cppblog.com/fwxjj/archive/2014/08/15/208027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HAProxy负载均衡器的安装及配置</title><link>http://www.cppblog.com/fwxjj/archive/2014/08/15/208026.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Fri, 15 Aug 2014 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2014/08/15/208026.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/208026.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2014/08/15/208026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/208026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/208026.html</trackback:ping><description><![CDATA[<div bgf8f8f8"="" style="background-color: #f8f8f8; width: 597px; padding-top: 12px; padding-right: 18px; padding-left: 18px; margin-top: 10px; border-top-color: #d8d9d9; border-right-color: #d8d9d9; border-left-color: #d8d9d9; border-top-width: 1px; border-right-width: 1px; border-left-width: 1px; border-style: solid solid none; color: #333333; font-family: 宋体; font-size: 12px; line-height: 18px;"><div style="background-color: #ffffff; border: 1px dashed #73a0cf; line-height: 26px; padding: 8px 12px; background-position: initial initial; background-repeat: initial initial;"><p green"="" style="margin: 0px; padding: 0px; color: #006600; background-color: transparent; font-size: 14px;">软件负载均衡一般通过两种方式来实现：基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载，HAProxy就是开源的并且基于第三应用实现的软负载。</p><p style="margin: 0px; padding: 0px; background-color: transparent;">AD：</p></div></div><div bgf8f8f8=""  f14"="" style="background-color: #f8f8f8; padding-top: 12px; padding-right: 18px; padding-left: 18px; line-height: 28px; margin-bottom: 10px; position: relative; min-height: 500px; overflow: hidden; color: #333333; font-family: 宋体;"><div id="content"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"></p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">【51CTO.com 独家特稿】软件负载均衡一般通过两种方式来实现：基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS就是基于Linux操作系统实现的一种软负载，HAProxy就是开源的并且基于第三应用实现的软负载。</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">HAProxy相比LVS的使用要简单很多，功能方面也很丰富。当 前，HAProxy支持两种主要的代理模式:"tcp"也即4层（大多用于邮件服务器、内部协议通信服务器等），和7层（HTTP）。在4层模式 下，<strong><a target="_blank" href="http://network.51cto.com/art/201005/198215.htm" style="color: #004276;">HAProxy</a></strong>仅在客户端和服务器之间转发双向流量。7层模式下，HAProxy会分析协议，并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议，这种操作要基于特定规则。</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">我现在用HAProxy主要在于它有以下优点，这里我总结下：</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"><strong>一、</strong>免费开源，稳定性也是非常好，这个可通过我做的一些小项目可以看出来，单Haproxy也跑得不错，稳定性可以与LVS相媲美；</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"><strong>二、</strong>根据官方文档，HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express)，这个作为软件级负载均衡，也是比较惊人的；</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"><strong>三、</strong>HAProxy可以作为MySQL、邮件或其它的非web的<strong>负载均衡</strong>，我们常用于它作为MySQL(读)负载均衡；</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"><strong>四、</strong>自带强大的监控服务器状态的页面，实际环境中我们结合Nagios进行邮件或短信报警，这个也是我非常喜欢它的原因之一；</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"><strong>五、</strong>HAProxy支持虚拟主机。</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">实验环境也很简单：</p><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;">HAProxy&nbsp; IP:192.168.4.192 Centos5.5-64bit<br style="clear: both; width: 0px; height: 0px;" />Web1 IP:192.168.4.45 Centos5.4-64bit<br style="clear: both; width: 0px; height: 0px;" />Web2 IP:192.168.21.45 FreeBSD8.0-64bit</pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">具体安装及配置文档如下：</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">一、HAProxy的下载及安装过程：</p><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;">wget <span style="color: #0000ff;">http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz<br style="clear: both; width: 0px; height: 0px;" /></span>make TARGET=linux26 prefix=/usr/local/haproxy install<br style="clear: both; width: 0px; height: 0px;" />cd /usr/local/haproxy<br style="clear: both; width: 0px; height: 0px;" />mkdir conf<br style="clear: both; width: 0px; height: 0px;" />cd conf<br style="clear: both; width: 0px; height: 0px;" />vim haproxy.conf</pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">内容 如下：</p><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">global<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log 127.0.0.1&nbsp;&nbsp; local0<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxconn 4096<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chroot /usr/local/haproxy<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid 501<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gid 501<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; daemon<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nbproc 1<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pidfile /usr/local/haproxy/logs/haproxy.pid<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">defaults<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log&nbsp;&nbsp;&nbsp;&nbsp; 127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local3<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode&nbsp;&nbsp;&nbsp; http<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option httplog<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option httpclose<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option dontlognull<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option forwardfor<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option redispatch<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retries 2<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxconn 2000<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; balance roundrobin<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stats&nbsp;&nbsp; uri&nbsp;&nbsp;&nbsp;&nbsp; /haproxy-stats<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contimeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clitimeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50000<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srvtimeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50000</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">listen web_proxy 192.168.4.192:80<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #option httpchk HEAD /index.php&nbsp; HTTP/1.0<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server web1_192.168.21.45 192.168.21.45:80 cookie app1inst1 check inter 2000 rise 2 fall 5<br style="clear: both; width: 0px; height: 0px;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server web2_192.168.4.45&nbsp; 192.168.4.45:80 cookie app1inst2 check inter 2000 rise 2 fall 5</p></pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">配置文件刚从服务器上copy下来的，保证可用。这里有个事情说明一下，有时候我们进入页面<span style="color: #0000ff;">http://192.168.4.192/</span>就会报如下错误：</p><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">503 Service UnavailableNo server is available to handle this request.</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">option httpchk HEAD /check.txt HTTP/1.0</p></pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">此问题出在这句话上面，它的意思是Haproxy会判断你的后端web的根上存在check.txt没有，以此作为haproxy-status的监控状态依据，将它#掉即可；如果是生产环境，你可将check.txt改为index.jsp或index.php即可；</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">另外，建议配置一个HAProxy的启动、关闭、重启脚本，放在/etc/init.d下，我们在平时的工作中应该养成一个习惯，服务器的启动或重启应该是最简单的，万一到了生产环境下出错时，我们可以以最快的方式启动，如果不用脚本的话，我们就要尝试以如下方式启动：</p><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;">/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg</pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">以下脚本生成后，我们直接可以用/etc/init.d/haproxy&nbsp; start来启动HAProxy服务了。</p><pre style="margin-top: 0px; padding: 0px; font-family: 'Courier New', monospace; font-size: 12px; width: 591.015625px; overflow: auto; background-color: #e6e6e6;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">#!/bin/bash<br style="clear: both; width: 0px; height: 0px;" />BASE_DIR="/usr/local/haproxy"<br style="clear: both; width: 0px; height: 0px;" />ARGV="$@"</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">start()<br style="clear: both; width: 0px; height: 0px;" />{<br style="clear: both; width: 0px; height: 0px;" />echo "START HAPoxy SERVERS"<br style="clear: both; width: 0px; height: 0px;" />$BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.cfg<br style="clear: both; width: 0px; height: 0px;" />}</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">stop()<br style="clear: both; width: 0px; height: 0px;" />{<br style="clear: both; width: 0px; height: 0px;" />echo "STOP HAPoxy Listen"<br style="clear: both; width: 0px; height: 0px;" />kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)<br style="clear: both; width: 0px; height: 0px;" />echo "STOP HAPoxy process"<br style="clear: both; width: 0px; height: 0px;" />kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)<br style="clear: both; width: 0px; height: 0px;" />}<br style="clear: both; width: 0px; height: 0px;" />case $ARGV in</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">start)<br style="clear: both; width: 0px; height: 0px;" />start<br style="clear: both; width: 0px; height: 0px;" />ERROR=$?<br style="clear: both; width: 0px; height: 0px;" />;;</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">stop)<br style="clear: both; width: 0px; height: 0px;" />stop<br style="clear: both; width: 0px; height: 0px;" />ERROR=$?<br style="clear: both; width: 0px; height: 0px;" />;;</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">restart)<br style="clear: both; width: 0px; height: 0px;" />stop<br style="clear: both; width: 0px; height: 0px;" />start<br style="clear: both; width: 0px; height: 0px;" />ERROR=$?<br style="clear: both; width: 0px; height: 0px;" />;;</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">*)<br style="clear: both; width: 0px; height: 0px;" />echo "hactl.sh [start|restart|stop]"<br style="clear: both; width: 0px; height: 0px;" />esac<br style="clear: both; width: 0px; height: 0px;" />exit $ERROR</p></pre><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">我们在Firefox或IE上输入<span style="color: #0000ff;">http://192.168.4.192</span>&nbsp; 就可以轮询的看到后端的web的页面了，另外我们可以随时监控页面<span style="color: #0000ff;">http://192.168.4.192/haproxy-status/</span>，效果图如下：</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;"><a target="_blank" href="http://images.51cto.com/files/uploadimg/20110317/0939540.jpg" style="color: #004276;"><img border="0" alt="效果图" width="498" height="184" src="http://images.51cto.com/files/uploadimg/20110317/0939540.jpg" style="border: 0px;" /></a></p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">另外，如果要做HAProxy的高可用，我推荐用HAProxy+Keepalived，网上成功的安例也有许多，大家可以googel学习下，如果你对此篇文章有疑问或其它，希望通过我在51cto的博客与我交流<a href="http://andrewyu.blog.51cto.com/" style="color: #004276;">http://andrewyu.blog.51cto.com</a>(抚琴煮酒)。</p><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">【51CTO.com独家特稿，非经授权谢绝转载！合作媒体转载请注明原文出处及出处！】</p><div align="right">【责任编辑：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#111;&#110;&#103;&#121;&#119;&#64;&#53;&#49;&#99;&#116;&#111;&#46;&#99;&#111;&#109;" style="color: #004276; text-decoration: none;">佟媛微</a>&nbsp;TEL：（010）68476606】</div></div></div><img src ="http://www.cppblog.com/fwxjj/aggbug/208026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2014-08-15 15:52 <a href="http://www.cppblog.com/fwxjj/archive/2014/08/15/208026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python fabric实现远程操作和部署 -- 转</title><link>http://www.cppblog.com/fwxjj/archive/2014/06/02/207174.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Mon, 02 Jun 2014 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2014/06/02/207174.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/207174.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2014/06/02/207174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/207174.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/207174.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: fabrictitle是开发，但是同时要干开发测试还有运维的活 (o(&#9583;&#9633;&#9584;)o)近期接手越来越多的东西，发布和运维的工作相当机械，加上频率还蛮高，导致时间浪费还是优点多。修复bug什么的，测试，提交版本库(2分钟)，ssh到测试环境pull部署（2分钟），rsync到线上机器A,B,C,D,E（1分钟），分别ssh到ABCDE五台机器，逐一重启(8-10分钟)...&nbsp;&nbsp;<a href='http://www.cppblog.com/fwxjj/archive/2014/06/02/207174.html'>阅读全文</a><img src ="http://www.cppblog.com/fwxjj/aggbug/207174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2014-06-02 11:21 <a href="http://www.cppblog.com/fwxjj/archive/2014/06/02/207174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】PHP有关跨域的请求header("P3P: CP=CURa ADMa...)cookie -session解决方法</title><link>http://www.cppblog.com/fwxjj/archive/2013/12/29/205056.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Sun, 29 Dec 2013 06:23:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2013/12/29/205056.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/205056.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2013/12/29/205056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/205056.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/205056.html</trackback:ping><description><![CDATA[<div><p>对于<strong>IE</strong>来说(默认安全级别下)，<strong>iframe、img、link等标签</strong>都是只发送session cookie（又叫 第一方cookie），拦截本地cookie发送（又叫第三方cookie）。当这些标签跨域引用一个页面，实际上是发起了一次GET请求。</p><p>在php文件头部加 header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"')</p>或者加 header("P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");<br />如果这个<strong>跨域的请求</strong>，HTTP返回头中带有<strong>Set-Cookie</strong> ， 那么这个cookie对浏览器来说，实际上是无效的。<br /><br />看如下测试<br /><br />假设有 www.a.com&nbsp;&nbsp;&nbsp; 与 www.b.com 两个域<br /><br />在 www.b.com 上有一个页面，其中包含一个指向 www.a.com 的iframe<br /><br />http://<strong>www.b.com/test.html</strong> 的内容为：<br />----------------------------------------------------------------------<br /><br />&lt;iframe width=300 height=300 src="http://<strong>www.a.com/test.php</strong>" &gt;&lt;/iframe&gt;<br /><br />----------------------------------------------------------------------<br /><br /><br />http://www.a.com/test.php 是一个对 a.com 域设置 cookie的页面，其内容为：<br />----------------------------------------------------------------------<br /><br />&lt;?php<br /><br />header("<strong>Set-Cookie: test=axis; domain=.a.com; path=/</strong>");<br /><br />?&gt;<br /><br />&lt;script&gt;<br />&nbsp;&nbsp;&nbsp; alert(document.cookie);<br />&lt;/script&gt;<br /><br />----------------------------------------------------------------------<br /><br /><br />此时我们请求 http://www.b.com/test.html , 他包含一个iframe，会去跨域请求 www.a.com/test.php ，该php页面会尝试 set-cookie<br /><br />第一次请求， test.php 会 set-cookie，所以浏览器会收到一个cookie。<br /><br />如果 set-cookie 成功，再次请求该页面，浏览器应该会 <strong>sent </strong>刚才 recieve 到的cookie。可是由于前面说的跨域限制，在IE里的iframe标签是 set-cookie不成功的，所以无法sent刚才收到的cookie。 <strong>这里无论是 session cookie 还是本地cookie都是一样。</strong><br /><br /><img src="http://hiphotos.baidu.com/cubeking/pic/item/d95440c865e2c827f31fe751.jpg" height="158" width="800"  alt="" /><br />可以看到，第二次发包，还是没能sent出去cookie<br /><br /><br />但是这种情况在加入了<strong>P3P header </strong>后会改变。<br /><br /><strong>P3P header允许跨域访问隐私数据，从而可以跨域set-cookie成功</strong><br /><br />我们修改 www.a.com/test.php 为<br />----------------------------------------------------------------------<br /><br />&lt;?php<br /><br />header("<strong>P3P</strong>: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");<br /><br />header("<strong>Set-Cookie</strong>: test=axis; expires=Sun, 23-Dec-2018 08:13:02 GMT; domain=.a.com; path=/");<br /><br />?&gt;<br /><br />&lt;script&gt;<br />&nbsp;&nbsp;&nbsp; alert(document.cookie);<br />&lt;/script&gt;<br /><br />----------------------------------------------------------------------<br /><br />再次访问两次上面的测试过程<br /><img src="http://hiphotos.baidu.com/cubeking/pic/item/27b8290b494a34456a60fb51.jpg" height="175" width="800"  alt="" /><br />可以看到第二个包已经发送出了收到的cookie<br /><br />而我们写的javascript也能够弹出cookie了。<br /><br /><br />值得注意的是，<strong>P3P header只需要设置一次</strong>，这样跟在这个P3P header后面的所有 set-cookie，都可以跨域访问了。也就是说: <strong>被P3P header设置过一次后，之后的请求不再需要P3P header，也能够在iframe里跨域发送这些cookie。</strong><br /><br />但是如果用 set-cookie 去改变设置好的cookie，则不再具有这种跨域访问特性。<br /><br /><br />P3P header 还有一个特点就是<strong>同一个包里</strong>只能设置一次，后面的P3P Header不会覆盖前面的P3P header，浏览器只认第一个。<br /><br />P3P 是 <strong>The Platform for Privacy Preferences</strong> 的简称<br /><br />更多具体的内容可以参阅<strong>W3C</strong>的标准 <a href="http://www.w3.org/TR/P3P/" target="_blank">http://www.w3.org/TR/P3P/<br /></a><br />在这里，我们看到的很乱的 P3P header里的东西，都不知道是什么乱七八糟的策略内容，实际上这是一些简写<br /><br />比如 上面用到的<br /><br />P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR<br /><br />CP 是 Compact Policy 的简写<br /><br />CURa 中 CUR 是 &lt;current/&gt; 的简写， a 是 always 的简写<br /><br />当然P3P header也可以直接 引用一个 xml 策略文件<br /><br />比如这么写<br />HTTP/1.1 200 OK<br /><strong>P3P: policyref="http://catalog.example.com/P3P/PolicyReferences.xml"</strong><br />Content-Type: text/html<br />Content-Length: 7413<br />Server: CC-Galaxy/1.3.18使用P3P的方法还有很多，这里不一一列举了。<br /><br /><br />最后，利用P3P Header 的这种特性，在实际攻击中，还是可以利用一下的。<br /><br />比如利用<strong>CRLF</strong>插入一个P3P header后，改变一个本地cookie的值，该cookie在之后的过程中可以被iframe引用到，也许会发生一些很奇妙的事情。<br /><br />具体会变成什么样我也不知道，毕竟web应用安全和环境的关系是越来越紧密了。</div><img src ="http://www.cppblog.com/fwxjj/aggbug/205056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2013-12-29 14:23 <a href="http://www.cppblog.com/fwxjj/archive/2013/12/29/205056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 提高数据更新效率(UPDATE/INSERT)  --- 转</title><link>http://www.cppblog.com/fwxjj/archive/2013/12/10/204702.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Tue, 10 Dec 2013 11:27:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2013/12/10/204702.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/204702.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2013/12/10/204702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/204702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/204702.html</trackback:ping><description><![CDATA[<div><div id="blog_content">     <p>有多种方法可以提高更新的效率.<br />简单说来：<br />１、暂停索引，更新后恢复.避免在更新的过程中涉及到索引的重建.<br />２、批量更新，每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.<br />３、创建一临时的大的表空间用来应对这些更新动作．<br />=========================================================================不同看法<br />如果UPDATE的是索引字段，就会涉及到索引的重建，暂停索引不会提高多少的速度，反而有可能降低UPDATE速度，<br />因为在更新是索引可以提高数据的查询速度，重建索引引起的速度降低影响不大。</p> <p>ORACLE优化修改参数最多也只能把性能提高15%，大部分都是<a target="_self"><span style="text-decoration: underline;"><strong>SQL</strong></span></a>语句的优化！</p> <p><br />=========================================================================不同位置<br />update总体来说比insert要慢&nbsp;&nbsp;<br />几点建议：&nbsp;&nbsp;<br />&nbsp; 1、如果更新的数据量接近整个表，就不应该使用index而应该采用全表扫描&nbsp;&nbsp;<br />&nbsp; 2、减少不必要的index，因为update表通常需要update index&nbsp;&nbsp;<br />&nbsp; 3、如果你的服务器有多个cpu，采用parellel hint，可以大幅度的提高效率&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp; 前年我也遇到类似的问题，300万纪录的一个表，每天要全表更新20次左右，最初通过cursor多进程（18个进程）更新，耗时30分钟，<br />&nbsp; 后来采用full+parallel&nbsp;&nbsp; hint，耗时降低到3分钟左右。服务器是ibm&nbsp;&nbsp; rs6000&nbsp;&nbsp; s590，18个CPU，64GB内存。&nbsp;&nbsp;<br />&nbsp;<br />&nbsp; 另外，建表的参数非常重要，对于更新非常频繁的表，建议加大PCTFREE的值，以保证数据块中有足够的空间用于UPDATE，<br />&nbsp; 从而降低CHAINED_ROWS。&nbsp;</p> <p><br />=========================================================================不同位置<br />如果有足夠CPU以及I/O 的話....<br />ALTER SESSION ENABLE PARALLEL DML;</p> <p>INSERT /*+ PARALLEL(tableA, 2) */<br />INTO tableA NOLOGGING<br />SELECT * FROM tableB;</p> <p>當中的 2 是多少個進程同時執行. 可應不同情況加減.&nbsp;</p> <p><br />=========================================================================不同位置<br />2比较可行的方法<br />方法一：使用oracle中包含在注释中的提示信息<br />insert /*+append*/ into ...nologing<br />select * from ...</p> <p>方法二：使用批量拷贝方法<br />set arraysize 20<br />set copycommit 5000<br />copy from<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#111;&#114;&#97;&#99;&#108;&#101;&#95;&#110;&#97;&#109;&#101;">username/password@oracle_name</a>append table_name1<br />using select * from table_name2;</p> <p>实际效果，方法一要比方法二速度还要快些</p> <p>/*+append */ nologging 的方法不错.<br />bulk insert好像需要内容足够大才可以.</p> <p>=========================================================================不同位置<br />set autocommit 100;----------每一百条记录提交一次<br />set transaction use rollback segment RBS1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO table1 NOLOGGING<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM table2;<br />&nbsp;&nbsp;&nbsp;&nbsp; commit;</p> <p>改变表的存储策略：<br />ALTER TABLE aaaa1<br />&nbsp;&nbsp;&nbsp; PCTFREE 30<br />&nbsp;&nbsp;&nbsp; PCTUSED 60;<br />---------这两个值相加要小于100，把PCTFREE搞大，PCTUSED搞小，可能会快一点</p> <p>=========================================================================不同位置<br />再提供一种方法，俺曾经用过的：<br />alter session set sort_area_size=100000000;<br />insert into tableb select * from tablea;<br />commit;</p> <p><br />=========================================================================总结<br />提高更新速度总结：<br />１、暂停索引，更新后恢复.避免在更新的过程中涉及到索引的重建.<br />&nbsp;&nbsp;&nbsp; 缺点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果UPDATE的是索引字段，就会涉及到索引的重建，暂停索引不会提高多少的速度，反而有可能降低UPDATE速度。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果表比较庞大，停索引后重键需要花比较长的时间<br />&nbsp;&nbsp;&nbsp; 优点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果更新的数据量接近整个表，此方法比较好。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />２、批量更新，每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.<br />３、创建一临时的大的表空间用来应对这些更新动作．<br />４、如果你的服务器有多个cpu，采用parellel hint，可以大幅度的提高效率<br />&nbsp;&nbsp;&nbsp; ALTER SESSION ENABLE PARALLEL DML;</p> <p>&nbsp;&nbsp;&nbsp; INSERT /*+ PARALLEL(tableA, 2) */INTO tableA NOLOGGING<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM tableB;<br />&nbsp;&nbsp;&nbsp; 當中的 2 是多少個進程同時執行. 可應不同情況加減.&nbsp;</p> <p>５、建表的参数非常重要，对于更新非常频繁的表，建议加大PCTFREE的值，以保证数据块中有足够的空间用于UPDATE，从而降低CHAINED_ROWS<br />&nbsp;&nbsp;&nbsp; ALTER TABLE aaaa1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCTFREE 30<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCTUSED 60;<br />&nbsp;&nbsp;&nbsp; ---------这两个值相加要小于100，把PCTFREE搞大，PCTUSED搞小，可能会快一点</p> <p>６、oracle提示及批量拷贝<br />&nbsp;&nbsp;&nbsp; 方法一：使用oracle中包含在注释中的提示信息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert /*+append*/ into ...nologing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select * from ...</p> <p>&nbsp;&nbsp;&nbsp; 方法二：使用批量拷贝方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set arraysize 20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set copycommit 5000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy from<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#111;&#114;&#97;&#99;&#108;&#101;&#95;&#110;&#97;&#109;&#101;">username/password@oracle_name</a>append table_name1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using select * from table_name2;</p> <p>&nbsp;&nbsp;&nbsp; 实际效果，方法一要比方法二速度还要快些</p> <p>７、加大排序缓冲区<br />&nbsp;&nbsp;&nbsp; alter session set sort_area_size=100000000;<br />&nbsp;&nbsp;&nbsp; insert into tableb select * from tablea;<br />&nbsp;&nbsp;&nbsp; commit;</p>   </div></div><img src ="http://www.cppblog.com/fwxjj/aggbug/204702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2013-12-10 19:27 <a href="http://www.cppblog.com/fwxjj/archive/2013/12/10/204702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Android框架进阶〖00〗】ThinkAndroid注解机制  --- 转</title><link>http://www.cppblog.com/fwxjj/archive/2013/12/10/204701.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Tue, 10 Dec 2013 11:20:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2013/12/10/204701.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/204701.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2013/12/10/204701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/204701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/204701.html</trackback:ping><description><![CDATA[<div><p style="color:#362e2b; line-height:25.98958396911621px"><span style="font-weight:bold">由于项目需要，开始研究ThinkAndroid。</span></p> <p style="color:#362e2b; line-height:25.98958396911621px"><span style="font-weight:bold">个人认为该框架的注解机制十分新颖，所以先研究这个，顺便学习下 Java 的annotation。</span></p> <p><strong>粗略的看了看，该机制在BaseActivity中初始化。而BaseActivity是所有Activity的基类。</strong></p> <p><strong>对BaseActivity进行了代码剖离，发现在BaseActivity中在onCreate函数里启动注解机制。</strong></p>  <ul><li>首先注入布局资源（绑定layout布局）</li><li>其次注入成员资源（绑定组件资源）</li><li>然后注入成员变量（初始化普通变量）</li></ul>  <p>暂时先搞清楚第二个，怎么绑定组件资源的：</p> <p><strong>我写了个小demo，MyAnno</strong></p>  <ul><li><img src="http://blog.csdn.net/mkrcpp/article/details/13509051" alt="" /><img src="http://img.blog.csdn.net/20131029160827031" alt="" /></li></ul>  <p><strong>InjectView.java</strong></p>  <div bg_java"=""><ol start="1"><li><span>package&nbsp;com.myanno;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>import&nbsp;java.lang.annotation.ElementType;&nbsp;&nbsp;</span></li><li><span>import&nbsp;java.lang.annotation.Retention;&nbsp;&nbsp;</span></li><li><span>import&nbsp;java.lang.annotation.RetentionPolicy;&nbsp;&nbsp;</span></li><li><span>import&nbsp;java.lang.annotation.Target;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li><span>/**&nbsp;</span></li><li><span>&nbsp;*&nbsp;自定义注解，获取资源ID&nbsp;</span></li><li><span>&nbsp;*&nbsp;@使用方法&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@InjectView(id&nbsp;=&nbsp;R.id.settingIv)&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;ImageView&nbsp;imgSetting;&nbsp;&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;</span></li><li><span>&nbsp;*&nbsp;@author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;michael.mao@sosino.com&nbsp;</span></li><li><span>&nbsp;*&nbsp;@date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2013-10-29&nbsp;</span></li><li><span>&nbsp;*&nbsp;@description&nbsp;@Retention:&nbsp;定义注解的保留策略&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Retention(RetentionPolicy.SOURCE)&nbsp;&nbsp;//注解仅存在于源码中，在class字节码文件中不包含&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Retention(RetentionPolicy.CLASS)&nbsp;&nbsp;&nbsp;//默认的保留策略，注解会在class字节码文件中存在，但运行时无法获得，&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Retention(RetentionPolicy.RUNTIME)&nbsp;//注解会在class字节码文件中存在，在运行时可以通过反射获取到&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Inherited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//说明子类可以继承父类中的该注解&nbsp;</span></li><li><span>&nbsp;*&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.TYPE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接口、类、枚举、注解&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.FIELD)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//字段、枚举的常量&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.METHOD)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//方法&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.PARAMETER)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//方法参数&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.CONSTRUCTOR)&nbsp;&nbsp;&nbsp;&nbsp;//构造函数&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.LOCAL_VARIABLE)&nbsp;//局部变量&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.ANNOTATION_TYPE)//注解&nbsp;</span></li><li><span>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Target(ElementType.PACKAGE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//包&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>@Target(ElementType.FIELD)&nbsp;&nbsp;</span></li><li><span>@Retention(RetentionPolicy.RUNTIME)&nbsp;&nbsp;</span></li><li><span>public&nbsp;@interface&nbsp;InjectView&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/**&nbsp;View的ID&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;int&nbsp;id()&nbsp;default&nbsp;-1;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li></ol></div> <br /> <strong>MainActivity.java</strong>   <div bg_java"=""><ol start="1"><li><span>package&nbsp;com.myanno;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>import&nbsp;java.lang.reflect.Field;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>import&nbsp;android.app.Activity;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.os.Bundle;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.util.Log;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.view.View;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.widget.ImageView;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.widget.TextView;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>public&nbsp;class&nbsp;MainActivity&nbsp;extends&nbsp;Activity&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/**&nbsp;注解绑定UI元素&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@InjectView(id=R.id.myimgview)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;ImageView&nbsp;myimageview;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@InjectView(id=R.id.mytext)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;TextView&nbsp;mytext;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>protected&nbsp;void&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onCreate(savedInstanceState);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.activity_main);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//初始化注解绑定的成员变量&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;injectView(<span>this);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//直接使用UI元素&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mytext.setText(<span>"Text0");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myimageview.setImageResource(R.drawable.junny);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/**&nbsp;实例化@InjectView&nbsp;注解的成员*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;injectView(Activity&nbsp;activity)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field[]&nbsp;fields&nbsp;=&nbsp;activity.getClass().getDeclaredFields();<span>//得到Activity中的所有定义的字段&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(fields&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;fields.length&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>for&nbsp;(Field&nbsp;field&nbsp;:&nbsp;fields)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(field.isAnnotationPresent(InjectView.class))//方法返回true，如果指定类型的注解存在于此元素上&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Field",&nbsp;field.toString());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InjectView&nbsp;mInjectView&nbsp;=&nbsp;field.getAnnotation(InjectView.<span>class);&nbsp;//获得该成员的annotation&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;viewId&nbsp;=&nbsp;mInjectView.id();&nbsp;&nbsp;//获得该注解的id&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;view=activity.findViewById(viewId);<span>//获得ID为viewID的组件对象&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Field",&nbsp;String.valueOf(viewId));&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Field",&nbsp;view.getClass().toString());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field.setAccessible(<span>true);//设置类的私有成员变量可以被访问&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field.set(activity,&nbsp;view);<span>//field.set(object,value)===object.fieldValue&nbsp;=&nbsp;value&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;e.printStackTrace();}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Field",&nbsp;"该字段没有被注解");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> <br /> <strong>布局文件 activity_main.xml</strong>   <div bg_html"=""><ol start="1"><li><span>&lt;LinearLayout&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>xmlns:tools="http://schemas.android.com/tools"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="match_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="match_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:background="#000000"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:orientation="vertical"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>tools:ignore="ContentDescription"&nbsp;&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;ImageView&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:id="@+id/myimgview"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_gravity="center"/&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;TextView&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:id="@+id/mytext"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="match_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="0dp"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_weight="1"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:gravity="center"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:background="@android:color/darker_gray"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:textSize="30sp"&nbsp;/&gt;&nbsp;&nbsp;</span></li><li><span>&lt;/LinearLayout&gt;&nbsp;&nbsp;</span></li></ol></div> <br /> <strong>实验结果</strong>   <ul><li><img src="http://img.blog.csdn.net/20131029160835046" alt="" height="427" width="240" /><br /> </li></ul>  <p><span style="color:#009900"><strong>即注入成功了</strong></span>&nbsp;<img alt="大笑" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif" /></p> <p><br /> </p> <p>需要说下我遇到的问题，在以上的基础上，如果将布局文件里的TextView 和ImageView两个布局换个位置，这时候再运行下，会出现空指针异常。</p> <p>将Log向上翻会发现一个警告</p>  <ul><li><img src="http://blog.csdn.net/mkrcpp/article/details/13509051" alt="" /><img src="http://img.blog.csdn.net/20131029160840859" alt="" /></li></ul>  <p>即非法<strong><span style="color:#ff0000">参数异常</span></strong></p> <p>定位到这一行</p>  <div bg_java"=""><ol start="1"><li><span>field.set(activity,&nbsp;view);&nbsp;&nbsp;</span></li></ol></div> <br /> 通过观察Log打印的日志   <ul><li><img src="http://blog.csdn.net/mkrcpp/article/details/13509051" alt="" /><img src="http://img.blog.csdn.net/20131029160851984" alt="" /></li></ul>  <p>发现<strong><u>第一二行</u></strong>是对的，即获得注解的<span style="color:#ff0000"><strong>类型和ID(ImageView 2131230720)</strong></span>都是正确的，但是通过findViewById获取view的时候，Log<strong><u>第三行</u></strong>显示的<strong><span style="color:#ff0000">却是TextView。</span></strong></p> <p>百思不得其解，最后无赖之下，清理一下项目，搞定。</p> <p>我不知道是怎么回事，暂且推测为资源缓存吧。</p></div><img src ="http://www.cppblog.com/fwxjj/aggbug/204701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2013-12-10 19:20 <a href="http://www.cppblog.com/fwxjj/archive/2013/12/10/204701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 提高数据更新效率(UPDATE/INSERT)  --- 转</title><link>http://www.cppblog.com/fwxjj/archive/2013/12/04/204579.html</link><dc:creator>大龙</dc:creator><author>大龙</author><pubDate>Wed, 04 Dec 2013 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/fwxjj/archive/2013/12/04/204579.html</guid><wfw:comment>http://www.cppblog.com/fwxjj/comments/204579.html</wfw:comment><comments>http://www.cppblog.com/fwxjj/archive/2013/12/04/204579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fwxjj/comments/commentRss/204579.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fwxjj/services/trackbacks/204579.html</trackback:ping><description><![CDATA[<div><div id="blog_content">     <p>有多种方法可以提高更新的效率.<br />简单说来：<br />１、暂停索引，更新后恢复.避免在更新的过程中涉及到索引的重建.<br />２、批量更新，每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.<br />３、创建一临时的大的表空间用来应对这些更新动作．<br />=========================================================================不同看法<br />如果UPDATE的是索引字段，就会涉及到索引的重建，暂停索引不会提高多少的速度，反而有可能降低UPDATE速度，<br />因为在更新是索引可以提高数据的查询速度，重建索引引起的速度降低影响不大。</p> <p>ORACLE优化修改参数最多也只能把性能提高15%，大部分都是<a target="_self"><span style="text-decoration: underline;"><strong>SQL</strong></span></a>语句的优化！</p> <p><br />=========================================================================不同位置<br />update总体来说比insert要慢&nbsp;&nbsp;<br />几点建议：&nbsp;&nbsp;<br />&nbsp; 1、如果更新的数据量接近整个表，就不应该使用index而应该采用全表扫描&nbsp;&nbsp;<br />&nbsp; 2、减少不必要的index，因为update表通常需要update index&nbsp;&nbsp;<br />&nbsp; 3、如果你的服务器有多个cpu，采用parellel hint，可以大幅度的提高效率&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp; 前年我也遇到类似的问题，300万纪录的一个表，每天要全表更新20次左右，最初通过cursor多进程（18个进程）更新，耗时30分钟，<br />&nbsp; 后来采用full+parallel&nbsp;&nbsp; hint，耗时降低到3分钟左右。服务器是ibm&nbsp;&nbsp; rs6000&nbsp;&nbsp; s590，18个CPU，64GB内存。&nbsp;&nbsp;<br />&nbsp;<br />&nbsp; 另外，建表的参数非常重要，对于更新非常频繁的表，建议加大PCTFREE的值，以保证数据块中有足够的空间用于UPDATE，<br />&nbsp; 从而降低CHAINED_ROWS。&nbsp;</p> <p><br />=========================================================================不同位置<br />如果有足夠CPU以及I/O 的話....<br />ALTER SESSION ENABLE PARALLEL DML;</p> <p>INSERT /*+ PARALLEL(tableA, 2) */<br />INTO tableA NOLOGGING<br />SELECT * FROM tableB;</p> <p>當中的 2 是多少個進程同時執行. 可應不同情況加減.&nbsp;</p> <p><br />=========================================================================不同位置<br />2比较可行的方法<br />方法一：使用oracle中包含在注释中的提示信息<br />insert /*+append*/ into ...nologing<br />select * from ...</p> <p>方法二：使用批量拷贝方法<br />set arraysize 20<br />set copycommit 5000<br />copy from<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#111;&#114;&#97;&#99;&#108;&#101;&#95;&#110;&#97;&#109;&#101;">username/password@oracle_name</a>append table_name1<br />using select * from table_name2;</p> <p>实际效果，方法一要比方法二速度还要快些</p> <p>/*+append */ nologging 的方法不错.<br />bulk insert好像需要内容足够大才可以.</p> <p>=========================================================================不同位置<br />set autocommit 100;----------每一百条记录提交一次<br />set transaction use rollback segment RBS1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT INTO table1 NOLOGGING<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM table2;<br />&nbsp;&nbsp;&nbsp;&nbsp; commit;</p> <p>改变表的存储策略：<br />ALTER TABLE aaaa1<br />&nbsp;&nbsp;&nbsp; PCTFREE 30<br />&nbsp;&nbsp;&nbsp; PCTUSED 60;<br />---------这两个值相加要小于100，把PCTFREE搞大，PCTUSED搞小，可能会快一点</p> <p>=========================================================================不同位置<br />再提供一种方法，俺曾经用过的：<br />alter session set sort_area_size=100000000;<br />insert into tableb select * from tablea;<br />commit;</p> <p><br />=========================================================================总结<br />提高更新速度总结：<br />１、暂停索引，更新后恢复.避免在更新的过程中涉及到索引的重建.<br />&nbsp;&nbsp;&nbsp; 缺点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果UPDATE的是索引字段，就会涉及到索引的重建，暂停索引不会提高多少的速度，反而有可能降低UPDATE速度。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果表比较庞大，停索引后重键需要花比较长的时间<br />&nbsp;&nbsp;&nbsp; 优点：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果更新的数据量接近整个表，此方法比较好。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />２、批量更新，每更新一些记录后及时进行提交动作.避免大量占用回滚段和或临时表空间.<br />３、创建一临时的大的表空间用来应对这些更新动作．<br />４、如果你的服务器有多个cpu，采用parellel hint，可以大幅度的提高效率<br />&nbsp;&nbsp;&nbsp; ALTER SESSION ENABLE PARALLEL DML;</p> <p>&nbsp;&nbsp;&nbsp; INSERT /*+ PARALLEL(tableA, 2) */INTO tableA NOLOGGING<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT * FROM tableB;<br />&nbsp;&nbsp;&nbsp; 當中的 2 是多少個進程同時執行. 可應不同情況加減.&nbsp;</p> <p>５、建表的参数非常重要，对于更新非常频繁的表，建议加大PCTFREE的值，以保证数据块中有足够的空间用于UPDATE，从而降低CHAINED_ROWS<br />&nbsp;&nbsp;&nbsp; ALTER TABLE aaaa1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCTFREE 30<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCTUSED 60;<br />&nbsp;&nbsp;&nbsp; ---------这两个值相加要小于100，把PCTFREE搞大，PCTUSED搞小，可能会快一点</p> <p>６、oracle提示及批量拷贝<br />&nbsp;&nbsp;&nbsp; 方法一：使用oracle中包含在注释中的提示信息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert /*+append*/ into ...nologing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select * from ...</p> <p>&nbsp;&nbsp;&nbsp; 方法二：使用批量拷贝方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set arraysize 20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set copycommit 5000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; copy from<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#111;&#114;&#97;&#99;&#108;&#101;&#95;&#110;&#97;&#109;&#101;">username/password@oracle_name</a>append table_name1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using select * from table_name2;</p> <p>&nbsp;&nbsp;&nbsp; 实际效果，方法一要比方法二速度还要快些</p> <p>７、加大排序缓冲区<br />&nbsp;&nbsp;&nbsp; alter session set sort_area_size=100000000;<br />&nbsp;&nbsp;&nbsp; insert into tableb select * from tablea;<br />&nbsp;&nbsp;&nbsp; commit;</p>   </div></div><img src ="http://www.cppblog.com/fwxjj/aggbug/204579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fwxjj/" target="_blank">大龙</a> 2013-12-04 11:39 <a href="http://www.cppblog.com/fwxjj/archive/2013/12/04/204579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>