﻿<?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>博客园-有心栽花花不开，无心插柳柳成荫</title><link>http://www.cnblogs.com/xuebing/</link><description>人生不易，自得其乐</description><language>zh-cn</language><lastBuildDate>Thu, 28 Aug 2008 05:25:58 GMT</lastBuildDate><pubDate>Thu, 28 Aug 2008 05:25:58 GMT</pubDate><ttl>60</ttl><item><title>系分成绩查到了,应该过了</title><link>http://www.cnblogs.com/xuebing/archive/2006/12/08/586540.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Fri, 08 Dec 2006 08:02:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/12/08/586540.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/586540.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/12/08/586540.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/586540.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/586540.html</trackback:ping><description><![CDATA[今天查到系分成绩了,45/53/48,应该过了.两个月的努力没有白费,开心.
<img src ="http://www.cnblogs.com/xuebing/aggbug/586540.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item><item><title>关于工作</title><link>http://www.cnblogs.com/xuebing/archive/2006/11/11/557597.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Sat, 11 Nov 2006 07:14:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/11/11/557597.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/557597.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/11/11/557597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/557597.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/557597.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;<span>前段时间想换工作，投了两份简历，面试了一家单位。方正软件，应聘的是</span><span>ERP</span><span>技术顾问。可能我的资历还是浅了，加上要的薪水偏高，没有收到进一步面试的通知。也罢，还是好好工作，暂时不换了。</span>
<p>&nbsp;<span>粗略想了一下自己的发展方向，觉得应该向业务分析，系统总体设计方面发展。继续在外企发展，做到系统分析方面的职位或者能够做到主管，向管理方向转变。专业知识一定要再广，再深入。外语水平也有不小的差距。感觉外语已经突破开口讲的障碍了，但进入了一个停滞，该练内功了。</span></p>
<p>&nbsp;<span>努力，加油，挣钱！</span></p>
<img src ="http://www.cnblogs.com/xuebing/aggbug/557597.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41930/" target="_blank">[新闻]科学家在世界最大对撞机中观察到首批粒子</a>]]></description></item><item><title>准备11月的系统分析师考试</title><link>http://www.cnblogs.com/xuebing/archive/2006/08/18/480051.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Fri, 18 Aug 2006 00:43:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/08/18/480051.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/480051.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/08/18/480051.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/480051.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/480051.html</trackback:ping><description><![CDATA[买了4本书，其中三本是希赛的考试辅导，一本清华的系统分析基础知识，还有朋友送的一本教程和辅导，正式开始备考。前天做了2005年11月的上午题，只得了32分，很受刺激。还是满难的阿。
<img src ="http://www.cnblogs.com/xuebing/aggbug/480051.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41929/" target="_blank">[新闻]阿里巴巴利润增1.36倍</a>]]></description></item><item><title>换工作了</title><link>http://www.cnblogs.com/xuebing/archive/2006/06/25/435263.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Sun, 25 Jun 2006 07:34:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/06/25/435263.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/435263.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/06/25/435263.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/435263.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/435263.html</trackback:ping><description><![CDATA[最近要到苏州工作了。新生活，新起点，新气象！
<img src ="http://www.cnblogs.com/xuebing/aggbug/435263.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41928/" target="_blank">[新闻]Google Gears覆盖四大浏览器 Safari版推出</a>]]></description></item><item><title>眼睛干涩时吃根香蕉可缓解 </title><link>http://www.cnblogs.com/xuebing/archive/2006/04/18/377980.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Tue, 18 Apr 2006 03:20:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/04/18/377980.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/377980.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/04/18/377980.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/377980.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/377980.html</trackback:ping><description><![CDATA[<p>　　在电脑前工作的人常常会觉得眼睛干涩或红肿、疼痛，如果每天吃一根香蕉，就能起到一定的缓解作用。这是台湾番薯藤健康网站的一篇文章日前告诉读者的。<br>　　<br>　　文章中指出，香蕉保护眼睛的功能首先和其中含量丰富的钾有关。人体摄入盐份过多，会导致细胞中存留大量的水分，引起眼睛红肿。香蕉中的钾可以帮助人体排出这些多余的盐分，让身体达到钾钠平衡，缓解眼睛的不适症状。<br>　　<br>　　此外，香蕉中含有大量的&#946;胡萝卜素。当人体缺乏这种物质时，眼睛就会变得疼痛、干涩、眼珠无光、失水少神，多吃香蕉不仅可减轻这些症状，还可在一定程度上缓解眼睛疲劳，避免其过早衰老。 <br></p>
<img src ="http://www.cnblogs.com/xuebing/aggbug/377980.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>春季调养最好能多吃两种菜 </title><link>http://www.cnblogs.com/xuebing/archive/2006/04/18/377977.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Tue, 18 Apr 2006 03:18:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/04/18/377977.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/377977.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/04/18/377977.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/377977.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/377977.html</trackback:ping><description><![CDATA[<p><br>　　春天人们常常感到困乏无力，昏昏欲睡，这是人体的生理功能随着季节的变化而出现的一种正常的生理现象。然而您知道吗？这些生理变化也可能会引发一些疾病。<br>　　<br>　　1.容易引起人们的焦虑与困惑。&#8220;一年之计在于春&#8221;，今年要做的各项工作或学习刚刚开始，所以给人们心理上造成比较大的压力。<br>　　<br>　　2.精神分裂症的患者容易复发。春天天气变化无常，人体的内分泌也随之而产生波动，精神分裂症的患者情绪上特别容易出现躁动不安。<br>　　<br>　　3.上火的人较多，人们经常觉着口干舌燥，容易发火，工作效率还低，还有些人脸上长疙瘩、痤疮。<br>　　<br>　　建议从以下3个方面预防：首先，保证充足睡眠，早晨起床后用冷水洗脸，冷水洗脸可以刺激皮肤和大脑，以尽快刺激血液循环变化。<br>　　<br>　　其次，注意室内通风，要有午休时间，尽量不要&#8220;开夜车&#8221;。<br>　　<br>　　最后，多锻炼身体，这样可以加快大脑处理信息的反应速度，改善机体的新陈代谢过程，促进血液循环，对中枢神经系统、内分泌系统有很好的刺激作用。<br>　　<br>　　下面为大家推荐两道菜：1.大蒜豆腐鱼头汤。研究发现，鱼和豆腐搭配不仅有营养互补的作用，还有一定防病治病的作用。鱼的白质含量高达17.3％，还含有钙、铁、脂肪、维生素D，营养物质的含量非常丰富。豆腐作为食药兼备的食品，具有益气补虚的作用，钙的含量也非常高，每100克的豆腐中含140毫克~160毫克的钙。而大蒜，杀菌力比较强，对春天一些常发疾病如感冒、腹泻、胃肠道炎以及扁桃腺炎都有一定的作用，还可以促进新陈代谢，增加食欲，预防动脉硬化、高血压。<br>　　<br>　　2.素炒西兰花。研究发现，西兰花的营养价值非常高，它的防病作用也超过其他素菜，而且维生素C含量也很高。在春天应多吃蔬菜水果，所以素炒西兰花，是个不错的选择。 </p>
<img src ="http://www.cnblogs.com/xuebing/aggbug/377977.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>日常学会科学喝水有助长寿 </title><link>http://www.cnblogs.com/xuebing/archive/2006/04/18/377975.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Tue, 18 Apr 2006 03:17:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/04/18/377975.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/377975.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/04/18/377975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/377975.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/377975.html</trackback:ping><description><![CDATA[<p>　<br>　　人的生活离不开水。成人体内水分约占60%左右，如果水分减少到原有体重的20% ，人就无法存活。人要维持生命，每天要从食物中摄入大约2升水。3月22日是世界水日，也是提醒公众重视水资源问题的一个特殊的日子。学会科学喝水能够帮助我们健康长寿。<br>　　<br>　　下面几点是我们日常生活中常有的不良饮水习惯：<br>　　<br>　　一、每日饮水量不足。有人认为不渴就不用喝水，其实，人体内细胞不断进行代谢、排除废物、散发热量都会损失水分，因此保持人体每日水分摄入与排出平衡十分必要。当饮水不足时，身体内缺水程度严重者会引起血循环渗透压增高，若这时水分补充不及时，细胞内液的水则流向组织间液产生细胞内脱水。要是等到口渴时再喝水，表明体内失水已经严重，因此我们应养成随时主动饮水的习惯。<br>　　<br>　　二、饮料水等同于饮用水。许多人不爱喝水，而喜欢喝带气、带甜味、带酸味的饮料。其实饮料不能代替饮水，饮料不但容易造成厌食与厌水，长期下去会造成营养缺乏症，而饮用过多酸性饮料会使机体血液呈酸性,不利于血液循环，且肌肉内乳酸堆积多，容易产生疲劳感，进而导致机体免疫力下降，并容易患感冒、龋齿、牙周炎等多种疾病。<br>　　<br>　　三、生饮自来水。一些人错误地认为生饮自来水有营养，尤其是在夏天喜欢图方便，对着自来水龙头拧开就喝，很容易感染痢疾、伤寒、霍乱等肠道疾病。<br>　　<br>　　四、经常饮用纯净水。矿泉水和纯净水都是通过天然矿泉水加工、除菌而得到的水，几乎不含有任何杂质，各种微量元素含量丰富。但作为日常饮用水，它们的价位较高，难以适应人们的生活需要。另外，长期饮用不含有任何养分的纯净水，可能会由于各种元素缺乏导致疾病，轻者会吃不香、睡不着、浑身乏力，重者会神经紊乱、骨质疏松、贫血等。<br>　　<br>　　五、长期喝千滚水。我们提倡喝开水，但反对长期喝千滚水。在炉上沸腾了很长时间的水，还有电热水器中反复煮沸的水就叫千滚水。其水中钙、镁等重金属成分和亚硝酸盐含量很高，长期饮这种水会干扰人的胃肠功能，导致腹泻、腹胀，而有毒的亚硝酸盐还会造成肌体缺氧，并引起神经、泌尿和造血系统病变。 </p>
<img src ="http://www.cnblogs.com/xuebing/aggbug/377975.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>(转载)静态页面的生成</title><link>http://www.cnblogs.com/xuebing/archive/2006/04/18/377893.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Tue, 18 Apr 2006 02:11:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/04/18/377893.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/377893.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/04/18/377893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/377893.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/377893.html</trackback:ping><description><![CDATA[内容发布系统的开发 <br>　　在站点流量很大的时候，为了提高系统性能，减短系统响应时间，我们很多时候考虑把站点做成静态的，用后台的发布系统发布出来。静态页面在性能上具有不少优势，但是，相对动态页面灵活性不够，扩展性不好，以后维护起来也比较麻烦。下面，就我的经验谈谈怎样生成这些静态站点。<br>　　生成静态页面一般来说都是做好静态页面的模板，然后从数据源读取数据，生成html代码块替换模板中的标签，然后生成静态文件。比如文章页面模板部分如下：<br>　　&lt;table border="1" style="BORDER-COLLAPSE: collapse" width="100%" cellpadding="2" cellspacing="2"&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>&lt;a href="(#ArticleUrl#)"&gt;(#Title#)&lt;/a&gt;<br>&lt;br&gt;作者(#Author#) 时间2006-3-24 13:38:00<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>摘要：(#Description#)<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>(#Content#)<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;/table&gt;<br>　　我们可以用如下的方法读取该模板的内容<br>/// &lt;summary&gt;<br>　　/// 读取文件内容<br>　　/// &lt;/summary&gt;<br>　　/// &lt;param name="strFilePath"&gt;文件路径&lt;/param&gt;<br>　　/// &lt;returns&gt;文件内容字符串&lt;/returns&gt;<br>public string ReadFile(string strFilePath, string strEncodingName)<br>{<br>string strFile = string.Empty;<br>StreamReader sr = new StreamReader(strFilePath, System.Text.UnicodeEncoding.GetEncoding(strEncodingName));<br>try<br>{ <br>strFile = sr.ReadToEnd();<br>}<br>catch(Exception e)<br>{<br>}<br>finally<br>{<br>sr.Close();<br>}<br>return strFile;<br>}<br>　　假设返回的字符串是strTemplate,从数据库中读取的文章标题为strTitle，作者为strAuthro,发布时间为strPostTime,描述为strDescription，内容为strContent，我们就可以用string的Replace方法把标签替换为实际要显示的内容了<br>strArticle = strTemplate.Replace("(#Title#)", strTitle);<br>strArticle = strArticle.Replace("(#Author#)", strAuthor);<br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br>　　这样，strArticle就是要显示页面的html代码了，再用如下的方法写入文件<br>/// &lt;summary&gt;<br>/// 写Html文件<br>/// &lt;/summary&gt;<br>/// &lt;param name="strHtml"&gt;写入的字符串&lt;/param&gt;<br>/// &lt;param name="strDestinationFilePath"&gt;目的文件路径&lt;/param&gt;<br>public void WriteFile(string strHtml, string strDestinationFilePath, string strEncodingName)<br>{<br>StreamWriter sw = new StreamWriter(strDestinationFilePath, false, System.Text.UnicodeEncoding.GetEncoding(strEncodingName));<br>try<br>{<br>sw.Write(strHtml);<br>sw.Flush();<br>}<br>catch(Exception e)<br>{<br>strErrorMessage = e.Message.ToString();<br>}<br>finally<br>{<br>sw.Close();<br>}<br>}<br>　　这里要注意的是Replace方法有时候替换会失效，比如&lt;a href="<a href='http://(/#UserID#).it.com.cn">one</a' href_cetemp='http://(/#UserID#).it.com.cn">one</a'>http://(#UserID#).it.com.cn"&gt;one&lt;/a</a>&gt;这里的(#UserID#)不能用Replace方法替换，可以这样来替换<br>strArticle = Regex.Replace(Article, "<a href="file://(%23UserID%23//">\\(#UserID#\\</a>)", strUserID);<br>　　现在，生成静态文件的方法我们会了，再来看看一些个性化技巧，如何给用户提供不同风格的各种页面。<br>　　现在一般是通过div+css的方法给每个用户提供不同风格的页面。也就是说每个用户页面的html代码结构是一样的，只是外部css不一样，这样在写页面的时候，我们可以把基本的html代码硬编码到我们的程序中，减少了复杂度。css可以很好的控制页面布局，实现起来很方便。这种方法中，所有风格的同一页面模板只有一个，一个风格对应一个css文件。这样，可以满足一般的需求了，很多的blog都是采用这种方法来实现，比如blogcn,douban，还有我们的数字家园。<br>　　但是，这种方法也有个缺陷，因为html代码是硬编码到后台代码中，所有风格的同一页面模板只有一个，所以页面的个性化也受到了一定限制。比如我想让一个风格的文章列表用表格形式，另一个采用其他方式，就无法实现了，因为我们已经把具体内容写在后台代码中了，只是引用的css文件不同。只要我们稍加改进，就完全可以随心所欲定制页面了，我的方法如下：<br>　　每个风格一套模板，一个css。比如文章页面的另一个风格模板如下：<br>&lt;div&gt;<br>&lt;a href="(#ArticleUrl#)"&gt;(#Title#)&lt;/a&gt;<br>&lt;br&gt;作者(#Author#) 时间2006-3-24 13:38:00<br>&lt;hr&gt;<br>摘要：(#Description#)<br>&lt;br&gt;(#Content#)<br>&lt;div&gt;<br>　　同样，我们也可以用上面替代的方法生成页面，只是每次要根据用户所选择的模板来选择不同的模板文件，而不是所有的用户选择同一个。看到这里，你可能会问，那要是列表怎么办？以前是把列表的html代码直接写在后台代码中，现在呢？遇到这样的情况，我们可以做下面这样的模板。<br>&lt;table&gt;<br>&lt;!-- ArticlesList Start --&gt;<br>&lt;!-- Article (#ArticleID#) Start --&gt;<br>&lt;tr&gt;<br>&lt;td height="20"&gt;&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>&lt;table border="1" style="BORDER-COLLAPSE: collapse" width="100%" cellpadding="2" cellspacing="2" ID="Table2"&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>&lt;a href="(#ArticleUrl#)"&gt;(#Title#)&lt;/a&gt;<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>摘要：(#Description#)<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;tr&gt;<br>&lt;td&gt;<br>发表于(#ReleaseTime#)&amp;nbsp;|&amp;nbsp;评论((#CommentCount#))&amp;nbsp;|&amp;nbsp;访问((#VisitCount#))<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;/table&gt;<br>&lt;/td&gt;<br>&lt;/tr&gt;<br>&lt;!-- Article (#ArticleID#) End --&gt;<br>&lt;!-- ArticlesList End --&gt;<br>&lt;/table&gt;<br>　　上面的模板中&lt;!-- Article (#ArticleID#) Start --&gt;和&lt;!-- Article (#ArticleID#) End --&gt;之间的内容就是文章列表中一个文章的代码，我们只需要用正则表达式把这部分找出来，替换标签就得到了一个列表中一个文章的html代码，把所有文章的代码连起来就得到了文章列表的代码，再让得到的代码替换模板中&lt;!-- ArticlesList Start --&gt;和&lt;!-- ArticlesList End --&gt;的内容就得到了最终要写入页面的代码。虽然比以前div+css的方式多了些步骤，但是，这样确实有效可行。<br>　　既然是为了性能，我们把页面发布成静态，那我们不如再进一步，看看怎样提高写静态页面的性能。<br>　　1.提取所有页面的公共部分，放外部外部文件进行引用。<br>　　比如所有页面的导航部分是相同的，这些部分经常要根据用户的操作进行更新，如果把它完全写在每个页面中，更新起来代价是很大的，必须重写每个页面。我们可以把这些内容外挂到js中，更新这些内容的时候，更新相应的js文件就可以了，一次更新，整站更新。这里，要注意的是要对js的特殊字符要进行转义，比如;'"等特殊字符要在前面加上/进行转义。<br>　　2.局部更新，而不是整体更新<br>　　我们可以用&lt;!-- ArticlesList Start --&gt;和&lt;!-- ArticlesList End --&gt;这样的标记把文章列表标记出来，更新文章页面的时候，我们只需要生成文章列表html代码，代替原页面（非模板）这两个标记之间的内容就可以了。这样，能大量减少读数据库的次数，性能自然也提高不少。在不同内容越多的页面，性能优势越明显。<br>　　3.使用分层树结构存放文件<br>　　这个其实是对读取性能的优化了。我们不要把大量的文件都生成在同一个根目录下，这样服务器遍历文件就会影响性能。我们可以使用分层树结构来生成文件，比如按年/月/日的形式组织文件目录。<br>　　综合有目的性的使用以上方法可以提高发布系统的性能，也能使用户界面最大限度地个性化。有时，我们可以采用静态和动态结合的方法提高系统性能，比如文章列表第一页生成静态，后面的采用动态方式。总之，对访问频率越高的页面生成静态越有优势，更新频率越高的页面动态方式越有优势，所以我们要均衡两者，有的放矢的选择。 
<img src ="http://www.cnblogs.com/xuebing/aggbug/377893.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>(转载)ADO.NET 的数据存取性能</title><link>http://www.cnblogs.com/xuebing/archive/2006/04/18/377866.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Tue, 18 Apr 2006 01:55:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/04/18/377866.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/377866.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/04/18/377866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/377866.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/377866.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>本文介绍了使用</span><span> ADO.NET </span><span>开发数据库应用程序时应考虑的一些基本的数据访问性能问题。</span></p>
<p><span>简介</span><span><br>数据访问在商业应用程序中扮演着关键角色。性能在任何数据密集型的应用程序中都是应该考虑的关键因素。有很多因素能够对数据访问性能产生负面影响，像网络负载、数据库服务器负载、未优化的 SQL 语句，等等。除此以外，还有一些其他因素要考虑，包括大多数应用程序执行的各种数据访问操作，比如打开和关闭连接、获取结果集、blob 访问以及元数据检索。在本文中，我将分析一些数据访问操作和提出一些提高数据库访问性能的建议。</span></p>
<p>在本文中，我将使用<span> Borland&#174; C#Builder&#8482; 附带的 Borland Data Provider (BDP) for .NET 和 Borland&#174; Delphi&#8482; 8 for the Microsoft&#174; .NET Framework (简写为&#8220;Delphi 8 for .NET&#8221;)，以及 IBM&#174; DB2&#174; 数据提供者来访问 IBM&#174; DB2&#174; Universal Database&#8482; (UDB)。</span></p>
<p><span>连接池</span><span><br>建立新的数据库连接有时代价非常昂贵，因为它涉及到分配客户机和服务器资源、授权用户，以及其他的验证。通过建立连接和在随后请求中重用同一连接，能够显著提高应用程序的性能。当客户机在本地处理数据时，数据库连接不一定是活动的，所以单个连接有可能被多个客户机共享访问。因此，连接池（也就是数据库连接的缓存）能够提高应用的性能和可伸缩性，尤其是在多层体系结构中。</span></p>
<p>在<span> ADO.NET 中，连接池通过唯一的连接字符串来标识。当新连接打开时，如果连接字符串没有精确匹配任何现有的池，则创建新的连接池。新连接池创建之后，则创建最小数量的连接对象，并添加到后台的池中。如果池中所有已存在的连接都是忙碌的，那么新的连接被添加到池中，直到达到池的最大尺寸。默认情况下，连接池参数的默认值可以用连接字符串覆盖，比如 Min Pool Size 和 Max Pool Size。</span></p>
<p>池中的连接分为不带事务上下文的连接和带详细事务上下文的连接。当打开一个<span> ADO.NET 连接时，根据事务上下文从池中取得连接。如果连接还未关联事务，那么它将从非事务连接池中取得。</span></p>
<p>关闭连接操作会将占用的连接返回给连接池，以便于重用。池中的连接与生命周期相关联，连接池管理器定期扫描无用和过期的连接，并从池中删除掉。一旦创建完成，连接池在整个生命周期过程中将保持活动状态。</p>
<p>为了展示连接池实际提供的性能收益，我将编写一个简单的<span> .NET 远程管理应用程序。有关.NET 远程管理的一些基本知识，您可以参阅我以前的文章 <a href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/0309theivendran/0309theivendran.html">在 .NET 中使用 BDP 和 DB2 构建分布式数据库应用程序</a>。 </span></p>
<p>远程服务器公开了两个方法，<span>GetDataBDP() 和 GetDataDB2() ，通过这两个方法，可以分别使用 Borland Data Provider (BDP) (Borland.Data.Provider) 和 IBM DB2 Data Provider (IBM.Data.DB2) 来填充和返回数据集。对于来自客户机的每一请求，都会打开连接，并在处理完 SQL 请求之后关闭连接。GetDataDB2() 利用一个标志来决定是否启用连接池。当前版本的 BDP 不支持连接池。</span></p>
<p>下面是一些基本的测试结果，显示了按分钟计算所占用的时间。这些结果不应作为基准来考虑。但是，您可以看到，随着更多的请求到达服务器，如果在中间层没有连接池的话，应用程序的性能将会变差。</p>
<table cellSpacing=0 cellPadding=0 width="70%" border=1>
    <tbody>
        <tr>
            <td>
            <p>&nbsp;</p>
            </td>
            <td>
            <p align=right><b><span>请求数：</span></b> </p>
            </td>
            <td>
            <p align=center><b><span>250 </span></b><b><span>个请求</span><span> <br></span></b><b><span>带连接池</span> </b></p>
            </td>
            <td>
            <p align=center><b><span>250 </span></b><b><span>个请求</span><span> <br></span></b><b><span>不带连接池</span> </b></p>
            </td>
            <td>
            <p align=center><b><span>500 </span></b><b><span>个请求</span><span> <br></span></b><b><span>带连接池</span> </b></p>
            </td>
            <td>
            <p align=center><b><span>500 </span></b><b><span>个请求</span><span> <br></span></b><b><span>不带连接池</span> </b></p>
            </td>
        </tr>
        <tr>
            <td rowSpan=2>
            <p><b><span>数据提供者：</span></b> </p>
            </td>
            <td>
            <p align=center><span>IBM DB2</span></p>
            </td>
            <td>
            <p align=center><span>00:17.5468750</span></p>
            </td>
            <td>
            <p align=center><span>02:01.4531250</span></p>
            </td>
            <td>
            <p align=center><span>00:32.8750000</span></p>
            </td>
            <td>
            <p align=center><span>04:03.5468750</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><span>BDP - DB2</span></p>
            </td>
            <td>
            <p align=center><span>N/A</span></p>
            </td>
            <td>
            <p align=center><span>02:01.1406250</span></p>
            </td>
            <td>
            <p align=center><span>N/A</span></p>
            </td>
            <td>
            <p align=center><span>04:01.6718750</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>下面是用于服务器和客户机的两段代码。请参考完整的源代码列表。</p>
<p><b><span>RemoteServer.cs</span></b><span> </span></p>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span>public class RemoteDataProvider :</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>&nbsp;MarshalByRefObject, IRemoteDataProvider</code></span></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public DataSet GetDataBDP()</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DataSet ds = null;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String connString =</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>&nbsp;"Provider=DB2;Assembly=Borland.Data.Db2,Version=1.</code></span></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>5.1.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1</code></span></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>b1b;Database=toolsdb;UserName=myuser;Password=mypasswd";</code></span></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ds = new DataSet();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>BdpConnection Conn = new BdpConnection(connString);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Conn.Open();</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>BdpDataAdapter adapter = new BdpDataAdapter(m_commText, Conn);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.WriteLine("SQL to DB2 : " + m_commText);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>adapter.Fill(ds,"Table1");</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Conn.Close();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch (Exception e)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw e;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return ds;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public DataSet GetDataDB2( bool bPool )</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DataSet ds = null;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String connString = "Database=toolsdb;UID=myuser;PWD=mypasswd;";</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if ( bPool )</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Console.WriteLine("Connection Pooling ON ...");</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>connString = connString + "pooling=true;Min pool size=100";</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.WriteLine("Connection Pooling OFF ...");</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>connString = connString + "pooling=false";</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ds = new DataSet();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DB2Connection Conn = new DB2Connection(connString);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Conn.Open();</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DB2DataAdapter adapter = new DB2DataAdapter(m_commText, Conn);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.WriteLine("SQL to DB2 : " + m_commText);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>adapter.Fill(ds,"Table1");</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Conn.Close();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch (Exception e)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw e;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return ds;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span><br><b>RemoteClient.cs</b> </span></p>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span>public class RemotingClient</span></code></pre>
            <pre><code><span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>public static void Main()</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TestPooling();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>private static void TestPooling()</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IRemoteDataService remDS = null;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ArrayList stat = new ArrayList();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HttpChannel channel = new HttpChannel();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ChannelServices.RegisterChannel(channel);</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String ClientID = Guid.NewGuid().ToString();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>remDS =</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>&nbsp;(IRemoteDataService)Activator.GetObject(typeof(IRemoteDataService),</code></span></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>"http://testserver:8000/RemoteDataService.soap");</code></span></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (remDS != null)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>stat.Add(GetData(remDS, 250, false, true));</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>stat.Add(GetData(remDS, 250, false, false));</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>stat.Add(GetData(remDS, 250, true, false));</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Console.WriteLine();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for( int i = 0; i &lt; stat.Count; i++)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.WriteLine((String)stat[i]);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch (Exception e)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.WriteLine(e.Message);</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>private static String</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code><span><br>
            <code>&nbsp;GetData(IRemoteDataService remDS , int noofRequest, bool bBDP, bool bPool)</code></span></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IRemoteDataProvider remDP = null;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DataSet ds = null;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String Out = "";</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DateTime stime = DateTime.Now;</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String ClientID = Guid.NewGuid().ToString();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for (int i = 0; i &lt; noofRequest; i++)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>remDP = remDS.GetDataProvider(ClientID);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>remDP.CommandText = "SELECT * FROM ADDRESSBOOK";</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if ( bBDP )</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ds = remDP.GetDataBDP();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if ( bPool )</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ds = remDP.GetDataDB2(true);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ds = remDP.GetDataDB2(false);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (ds != null)</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.WriteLine("Data received from the remoteserver");</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Utils.PrintData(ds);</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TimeSpan ts = DateTime.Now - stime; </span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if ( bBDP )</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Out = "Time duration without Pooling (BDP) =&nbsp;" + ts.ToString();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>if ( bPool )</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Out = "Time duration with Pooling<span>&nbsp;&nbsp;&nbsp; </span>(DB2) =&nbsp;" + ts.ToString();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Out = "Time duration without Pooling (DB2) =&nbsp;" + ts.ToString();</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return Out;</span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp; </span>}</span></code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></code></pre>
            <pre><code><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span>单向（<span>forward only）游标</span></span><span><br>单向、只读游标提供更好的吞吐量，还使用了更少的客户机和服务器资源。使用单向游标的话，在数据访问层无需任何缓存，并且无需维护与服务器中记录相关的当前记录位置。数据作为流来读取，而记录一个接一个地处理。单向结果集对于报表、数据处理应用程序来说是很理想的，因为这些应用程序在获取数据时执行同样的操作。</span></p>
<p>在<span> ADO.NET 中，DataReader 返回单向的结果集。DataAdapter 扮演的角色是数据库和数据集之间的管道，使用 DataReader 从数据库中提取记录并填入数据集。数据集缓存数据，同时起到了一个 in-memory 关系数据库的作用。</span></p>
<p>因此，视应用程序的需要，您可以直接使用<span> DataReader 每次处理一条记录，或者使用 DataAdapter 来填充数据集，这样可以提供记录的完整集合，并在稍后分析数据集在客户机上的更改，再保存回数据库。不管哪种情况，选择 SQL 语句对于更好的吞吐量和整体性能来说都是非常重要的。</span></p>
<p><span><span>Blob 访问</span></span><span><br>Blob 数据最大可达 4 GB。由于海量数据可能通过线路传输，因此最好不要同时提取 blob 数据及其他标量数据。使用 blob 数据时，很重要的一点是要理解数据库客户机库中的底层访问机制。大多数数据库客户机提供了不止一种访问 blob 数据类型的方法。根据 blob 数据类型的不同，客户机可以绑定巨大的缓冲区或者使用 blob 定位器来获取 blob 数据。</span></p>
<p>在绑定每次提取的巨大缓冲区时，可用的<span> blob 数据，或者高达最大缓存大小的 blob 数据，均传输到客户机。而另一方面，blob 定位器基本上是引用数据库服务器上的 blob 数据。在最初提取数据期间，只有定位器被传输到客户机。一旦客户机获得了 blob 定位器，它稍后会调用 blob 访问方法，以便读取和写入 blob 数据。</span></p>
<p>因此，要改进应用程序处理<span> blob 数据的性能，必须注意分别提取 blob 数据，或采用新的 SQL 请求，或使用定位器。同时，由于不一定会处理 blob 数据，只有在必要时或是应用程序显式请求时才提取它们。</span></p>
<p><span>元数据检索</span><span><br>元数据检索是另一种昂贵的操作（因为它可能涉及到连接几个系统表，检索特定数据库对象的元数据），在运行时应该尽量减少或者完全消除。大多数数据库对象的元数据检索可以在设计时完成，而模式信息可以持久存储为 XML 或者任何特定于应用程序的格式。</span></p>
<p>运行时元数据无法完全消除。在一些要分析关系数据或者对象持久性的复杂应用程序中，，可能需要发现运行时数据库对象的特征。在这些情况下，必须调整访问系统表的<span> SQL 语句。</span></p>
<p>在当前版本的<span> ADO.NET 中，元数据检索功能还无法足以检索有关数据库对象的所信息。DataReader 和 DataAdapter 分别有 GetSchemaTable 和 FillSchema 方法，用于提取当前 SQL 请求的提供者元数据。BDP 扩展了 ADO.NET，并提供了检索各种数据库对象元数据的功能。</span></p>
<p>下面的测试结果显示了<span> BDP 和 IBM DB2 数据提供者在大多数基本数据访问操作上执行得同样好。然而，我的确注意到，如果使用 CHAR 数据类型来取代 VARCHAR 数据类型，IBM DB2 数据提供者看来要对数据进行空白填充（blank-pad），这导致了性能下降。</span></p>
<table cellSpacing=0 cellPadding=0 width="70%" border=1>
    <tbody>
        <tr>
            <td>
            <p>&nbsp;</p>
            </td>
            <td>
            <p align=right><b><span>数据访问</span></b> </p>
            </td>
            <td>
            <p align=center><b><span>使用</span><span> DataReader <br></span></b><b><span>提取</span><span> 10,000 </span></b><b><span>条记录</span> </b></p>
            </td>
            <td>
            <p align=center><b><span>利用</span><span> GetSchemaTable <br></span></b><b><span>提取</span><span> 10,000 </span></b><b><span>条记录</span> </b></p>
            </td>
            <td>
            <p align=center><b><span>利用</span><span> 6K BLOB </span></b><b><span>数据</span><span> <br></span></b><b><span>提取</span><span> 100 </span></b><b><span>条记录</span> </b></p>
            </td>
        </tr>
        <tr>
            <td rowSpan=2>
            <p><b><span>数据提供者：</span></b> </p>
            </td>
            <td>
            <p align=center><span>BDP - DB2</span></p>
            </td>
            <td>
            <p align=center><span>00:51.7243760</span></p>
            </td>
            <td>
            <p align=center><span>00:52.1049232</span></p>
            </td>
            <td>
            <p align=center><span>1:46:2527840</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><span>IBM DB2</span></p>
            </td>
            <td>
            <p align=center><span>00:51.7444048</span></p>
            </td>
            <td>
            <p align=center><span>00:51.9246640</span></p>
            </td>
            <td>
            <p align=center><span>1:38.2012064</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>读写数据块</span><span><br>数据库客户机库允许客户机绑定单个缓冲区和每次提取一条记录。每次提取需要一次网络往返，这在应用程序处理海量结果集时会影响性能。虽然不推荐对海量结果集进行检索，但这是无法避免的，特别是在类似于 OLAP 或收集历史数据统计信息这样的应用程序场景中。一些数据库客户机库允许读取记录块，客户机会绑定缓冲区的数组，并在单次往返中检索记录块。</span></p>
<p>在任何非连接的数据访问模型中（比如<span> Borland DataSnap），当 ADO.NET 将所有客户机更改持久存储回数据库时，需要为每一修改的记录执行一条 SQL 语句。例如，如果有 <i>n</i>条插入记录的话，不是执行 <i>n</i>次相同的 INSERT 语句，客户机可以传递一组参数缓冲区，以便执行批量插入。块读写能够显著改进性能，特别是在 WAN 环境中，因为记录可以在单次网络往返中以批量形式接收和发送。BDP 当前不支持块读写。 </span></p>
<p><span>异步执行</span><span><br>长时间运行的查询，比如复杂连接或涉及整个表扫描的查询，会对应用程序的响应能力产生负面影响。当数据库正在处理 SQL 请求时，如果 SQL 请求未阻塞的话，客户机可以处理本地应用程序内部事务。如果异步执行不可用， SQL 请求可以在而主线程继续运行的情况下，通过单独的线程进行。</span></p>
<p>目前，<span>ADO.NET 框架不支持异步执行模式，但未来版本可能会支持。</span></p>
<p><span>结束语</span><span><br>如果各种优化因素未考虑周到的话，数据访问可能会成为主要瓶颈。除了调优数据库和调优 SQL 使之具有更佳的选择性（selectivity）之外，其他度量因素（比如连接池、运行时最小化元数据检索、移除长期运行的查询以分开线程、只有在必要时才提取 blob）也可以优化数据访问性能，从而为任何数据密集型应用程序提供更好的响应能力。因此，根据应用程序的需要，选择合适的数据访问操作可以提高性能和可伸缩性。</span></p>
<p><span><span>下载</span></span></p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p><b><span>Name</span></b></p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p><b><span>Size</span></b></p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p><b><span>Download method</span></b></p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p><span>source.zip</span></p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p><span>35.5 KB</span></p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top noWrap>
            <p><span><a href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0404theivendran/source.zip"><b>HTTP</b></a></span></p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
            <td vAlign=top width=10>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span><a href="http://www-128.ibm.com/developerworks/cn/whichmethod.html"><span>关于下载方法的信息</span></a><br></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span><span>关于作者</span></span><span><br><b>Ramesh Theivendran</b></span><span>从</span><span> 1995 </span><span>年开始就是</span><span> Borland RAD database connectivity R&amp;D </span><span>小组成员。目前，他正在他们的</span><span> Win32 </span><span>和</span><span> .NET </span><span>产品小组中致力于数据库连接性研究，并担任</span><span> dbExpress </span><span>和</span><span> Borland Data Provider (BDP) for .NET </span><span>的架构师。</span> </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnblogs.com/xuebing/aggbug/377866.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>(转载) 怎样从一名程序员过渡到项目经理(整理自csdn论坛) </title><link>http://www.cnblogs.com/xuebing/archive/2006/04/18/377858.html</link><dc:creator>薛冰</dc:creator><author>薛冰</author><pubDate>Tue, 18 Apr 2006 01:50:00 GMT</pubDate><guid>http://www.cnblogs.com/xuebing/archive/2006/04/18/377858.html</guid><wfw:comment>http://www.cnblogs.com/xuebing/comments/377858.html</wfw:comment><comments>http://www.cnblogs.com/xuebing/archive/2006/04/18/377858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xuebing/comments/commentRss/377858.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xuebing/services/trackbacks/377858.html</trackback:ping><description><![CDATA[&nbsp; <span>1.</span><span>从程序员到</span><span>PM</span><span>，是一条脱变的路，事实上程序员走的路最终不应该是项目经理。首先有一点需要明白的就是，一定规模的项目中，项目经理不需要太懂技术，他可以是一知半解。项目经理的任务不是在技术方面，技术相关的应该交给</span><span>SA</span><span>去做。项目经理更多地是做管理，沟通等工作，你如果可以的话到书店查看一下关于项目管理的书籍，你就会明白。当然对于小项目来说，有可能是</span><span>PM</span><span>，</span><span>SA</span><span>是同一个人，而这样的项目经理更多只是</span><span>SA</span><span>加上一些管理工作。要做项目经理，你就首先告诉自己不再去碰技术细节了。程序员并不是一个培养项目经理的好环境。所以没有什么从</span><span>Coder</span><span>到什么</span><span>developer</span><span>再到</span><span>SA</span><span>然后是</span><span>PM</span><span>的路，这是一条比较悲哀的路。在大公司，</span><span>SA</span><span>下一个目标不是</span><span>PM</span><span>，而</span><span>consultant</span><span>，然后是</span><span>senior consultant</span><span>，</span><span>PM</span><span>走的是另一条路，所需要的技能不是技术，技术给</span><span>PM</span><span>带来的能力提升是很少的。在项目中你最后能分清楚</span><span>PM</span><span>与</span><span>SA</span><span>的关系及各自在项目中的分工与用途。</span>
<div>
<p><span>2.</span><span>其实我蛮同意</span><span> gzlucky(Lucky) </span><span>的看法的，确实是我们公司不少项经理就是不很能跟得上现在的一些技术，因为很多人都快年近四十，儿子都上高中了，要他们再学新技术真的难度比较大，他们的工作基本上就是天天找手下的程序员，布置这个任务，询问那个任务做的怎么样了。不过我的头倒是和我一样编程，他手下写代码的就我一个人，他自己也会</span><span>ASP</span><span>和</span><span>JSP</span><span>，但是可能对</span><span>.NET</span><span>不熟，就由我来主负责了。我觉得项目经理还是像他这样的好，自己也能懂不少技术，可以服人。但是我的头儿好像在沟通这一块不是非常出色，当然也有可能是俺太内向，不太与他沟通，所以他也只是在交待任务后就不再多询问，而不像别的项目经理天天追程序员后头问。我想问问各位，你们看哪种项目经理才是比较好的，像我的头儿这样的，还是像某些喜欢追程序员后面问进展的。</span></p>
<p><span>3.</span><span>（作者是两黄星）原来在一个小公司做过半年的</span><span>DM</span><span>，一年的</span><span>PM</span><span>，后来为了让自己的技术更扎实一些，离开了原来公司，现在在大公司做程序员，开始后悔了，在大公司里很难接触管理方面的东西，也很难晋升，个人认为在小公司做</span><span>DM,PM</span><span>，有经验后直接找大公司的</span><span>PM</span><span>，这样也是一条路。</span><span><br></span><span>或者考</span><span>PMP</span><span>之类的证书，然后直接找管理的工作。</span><span><br></span><span>希望过来人能给予更好的意见和建议，我也现在想往管理层发展。</span></p>
<p><span>技术很硬了再去做</span><span>PM</span><span>，这种想法是错误的，我就犯了这个错，边搞好技术</span><span>(</span><span>为了生计</span><span>)</span><span>边学管理知识</span><span>(</span><span>为了将来</span><span>)</span><span>，慢慢向管理发展，不能等。有句话说的好，机会是属于那些有准备的人的。利用业余时间多学些管理方面的东西，所谓人的差异在业余时间。</span></p>
<p><span>要走向管理层，英语一定要学好。</span></p>
<p><span>沟通很重要，要做好管理者，先学会做人。多跟下属沟通，多为下属着想，而不要去巴解讨好上司。体谅下属，把项目计划做的尽量合理，不要让下属加班，给下属发展和晋升的空间，这样才能是下属有干劲，才能把项目做好，你才有更高的升迁机会。</span><span><br></span><span>只有把自己知道的不断的让你得力下属知道，只有提拔起一些得力的下属来，你才有时间和精力去向上爬，不然你抱着不放，就没有升迁的机会。</span></p>
<p><span>管理不是喝酒抽烟那么简单，那只是过去的那种不思上进，耽误自己前程。</span><span><br></span><span>吃尽苦中苦，方为人上人。</span><span><br></span><span>做</span><span>PM</span><span>不是混，是要把项目做好，这跟做人是一个道理，这也就是为什么做管理要先学会做人的道理。</span></p>
<p><span>pm</span><span>的整个工作重点是什么？如果做为一个</span><span>PM</span><span>，技术不高怎么对付组里的牛人</span><span><br>--------------------------------------<br></span><span>我们经常会因为公司里的顶尖人才、个性化太强，不能与其他人合作而感到棘手，要解决这一问题其实也是有法可寻的。</span><span><br></span><span>一、在肯定其价值和优势的前提下，明确地制定改进的目标；</span><span><br></span><span>二、&#8221;顶尖人才能够面对中肯的，明确及一对一的批评作正面反应，所以要加强与他沟通的力度；</span><span><br></span><span>三、可以根据具体情况调整考核目标，加强与其他员工合作的内容；</span><span><br></span><span>四、把&#8220;顶尖人才&#8221;调到相对能独立发挥其才能的岗位，减少与别人发生矛盾的机会。</span></p>
<p><span>技术总监的职责：</span><span>(</span><span>各个公司都可以不一样</span><span>)<br>------------------------------------------<br>1.</span><span>负责产品中心的日常管理工作；规划部门的年度发展计划和发展方向；制定、确立部门内部管理的规章制度和工作规范；制定本部门年度财务预算；负责部门人员招聘、任用、考核的管理与控制等。</span><span>(</span><span>占工作量的</span><span>40%)<br>2.</span><span>根据公司整体发展要求，制定部门研发产品的发展规划和方向；负责组织、协调完成产品的规划升级、专项产品的开发与实施；进行市场调研、用户</span><span>/</span><span>代理回访等。</span><span>(</span><span>占工作量的</span><span>40%)<br>3.</span><span>及时了解、掌握新的开发技术，研究探求新的开发技术和方法方法，进一步完善产品结构和功能；从质量和易用性等方面不断发展、提升现有的产品。</span><span><br>(</span><span>占工作量的</span><span>20%)</span></p>
<p><span>4.</span><span>多为他人着想，这样他人才乐于为你着想。适当提拨一些下属，不是让自己有精力向上爬，而是他们为了向上爬只有一个方法，把你再往上顶。每个人心中的委屈都是天底下最大的，这时你需要无限的耐心；每个人都有极需要帮助的一面，这时你需要无限的关心；当别人有意思向你倾诉或表述的时候，这时你需要的是爱心。</span></p>
<p><span>5.</span><span>劝大家如果学精了</span><span>,</span><span>还是到非</span><span>it</span><span>的企业里去比较好，把自己的专业知识和行业知识结合起来，这样对自己的长远发展有好处，不要把自己封闭在</span><span>it</span><span>企业里，以后到</span><span>35</span><span>岁以上就没有出路了</span></p>
<p><span>6.</span><span>能够勇敢大胆的换工作，开始几年不要为了赚钱，而是为了赚经验，我工作</span><span>2</span><span>、</span><span>3</span><span>年了，身上的存款还是个</span><span>4</span><span>位数，你们肯定认为很搞笑。。。但我走过</span><span>5-6</span><span>家公司了。。每个一个公司都有不同的感受。各方面都有了些进步。。</span></p>
<p><span>7.</span><span>多学些管理知识，多进行管理实践！</span></p>
<p><span>8.</span><span>其实</span><span>,</span><span>我觉得做一个好的项目经理不是那么容易的</span><span>,</span><span>项目经理</span><span>,</span><span>主要的任务是协调程序员的开发与项目的进展</span><span>.</span><span>在面对程序员的时候</span><span>,</span><span>首先要抓住作为程序员的特点</span><span>,</span><span>如果你的技术过硬的话</span><span>,</span><span>那么你用你的技术去让下面的人佩服你的技术</span><span>,</span><span>那么他们会服服帖帖的</span><span>,</span><span>如果你的技术不过硬的话</span><span>,</span><span>那么你就谦虚点</span><span>,</span><span>不要太吹牛皮了</span><span>,</span><span>不然的话</span><span>,</span><span>下面的人忍得了你一时</span><span>,</span><span>忍不了你一世</span><span>,</span><span>迟早会反你的</span><span>(</span><span>当年我就反过</span><span>,</span><span>哈哈哈</span><span>)!</span><span>所以</span><span>,</span><span>我觉得</span><span>,</span><span>从一个程序员到项目经理过渡的话</span><span>,</span><span>还是掌握足够的技术是关键</span><span>,</span><span>当然</span><span>,</span><span>培养起自己的人格魅力也很重要</span><span>.</span><span>如果是从别的行业的人想去做项目经理的话呢</span><span>,</span><span>最重要还是谦虚</span><span>,</span><span>不要以职位压人</span><span>!</span></p>
<p><span>9.</span><span>项目经理主要工作就是&#8220;沟通&#8221;，目的是保证项目高品质完成，合理利用资源，这里还有对下属的培养，要善于用人，待下属要不遗余力的帮助，不要害怕被下属取代，在信任的前提下要适当放权，因为当你培养出一批可以取代你的下属时，正是你升职之时。</span></p>
<p><span>附：转载文章</span></p>
<p><span>如果你曾经以为自己在启蒙阶段就已经了解了需要了解的全部东西，那么你肯定从来都没有做过</span><span>IT</span><span>经理。曾经身为</span><span>IT</span><span>专业人士的你该如何成功过渡为</span><span>IT</span><span>管理者？下面这位经验丰富的专业人士所介绍的技巧应该能帮助你避免很多错误的发生。</span>&nbsp;</p>
<p><span>从一位纯技术人员向一位</span><span>IT</span><span>管理者的过渡是一条充满了艰辛和曲折的漫长道路。已经在</span><span>IT</span><span>业打拼了十六年的</span><span>Steven Crane</span><span>对此可谓是深有体会。他曾经在一些实力雄厚的大公司（如吉列公司、派克公司）担任</span><span>IT</span><span>经理长达八年之久。在那段日子里，他成功的应对了很多来自管理工作的挑战。为了帮助新上任的</span><span>IT</span><span>经理们避免重犯他当年曾经犯过的错误，他根据自己的经验向大家介绍了十五项技巧。</span><span> </span></p>
<p><span>培养管理能力的技巧</span></p>
<p><span>1</span><span>、阅读</span><span>Ken Blanchard</span><span>撰写的&#8220;一分钟经理&#8221;系列丛书。根据</span><span>Ken Blanchard</span><span>在书中的定义，所谓的一分钟经理是指那些不需要花费很长的时间，应用他三个简单的管理步骤就可以达到很好的效果的管理者。</span><span> </span></p>
<p><span>2</span><span>、了解自己所在公司的规章制度，与自己的同事和上级建立良好的关系。认真听取他们的建议。管理人员们通常都愿意给其他管理者提供帮助。</span></p>
<p><span>3</span><span>、尽快发现并了解自己的弱点和不足。要记住，你是可以通过培训来弥补自己的不足的。</span></p>
<p><span>4</span><span>、学着把预算控制到最低限度，让大家清楚的了解资金是在哪些地方被节省下来的。</span><span><br></span><span>同公司主管人员增强交流的技巧</span></p>
<p><span>5</span><span>、不要把每天的工作当中所出现的问题都汇报给自己的上级。相反，要善于发现那些重复出现的问题并为之寻找解决办法。然后再就几种不同的解决方案征求上级的意见。</span></p>
<p><span>6</span><span>、如果你做项目同做支持工作一样出色，那么一定要把这两种工作区分开。只要把新增加的员工的薪水计算在整个项目的成本之内，那么你就可以为了新项目的进行而招募新的员工。不要让自己手下的员工在做支持工作的同时又陷入到正在进行的项目当中。</span></p>
<p><span>7</span><span>、详尽记录、及时汇报。要求项目小组的成员填写时间记录，这样你就能够明白时间都花在了哪里。当你需要证明项目工期应该延长的时候，这些记录会起到帮助作用。当然，有了这些记录，你在向公司主管撰写月度报告的时候也会轻松许多。</span></p>
<p><span>8</span><span>、当公司系统出现问题而瘫痪的时候，要知道你的小组的任务是让系统恢复正常。要保证关键系统的灾难恢复计划的到位，并且能够恢复其他的项目。</span><span><br></span><span>激励员工的技巧</span></p>
<p><span>9</span><span>、如果公司以前没有正式的服务平台协议，而你又在实际工作中发现有大量的服务电话需要接听，那么就创建一个集中化的服务平台。如果必要的话可以寻求外包。如果真的需要外包的话，一定要制定服务水平协议。</span></p>
<p><span>10</span><span>、花时间激励自己的员工走向成功，尽可能多的排除来自其他部门的不利因素。</span></p>
<p><span>11</span><span>、学会&#8220;猴子管理&#8221;：当员工来向你寻求帮助时，要让他们知道自己接下来应该如何继续行动。不要帮助员工分担他们的工作，因为你会发现那样的工作永远都做不完。</span></p>
<p><span>12</span><span>、每年至少对员工进行一到两次的业绩评估。让员工有明确的目标，并且帮助他们去实现自己的目标。</span></p>
<p><span>13</span><span>、定期召开小组会议。由于工作任务总是一个接着一个，所有人看上去都是那么忙碌，要想做到这一点是有些困难。如果绝对必要的话，可以选择工作午餐的形式，只是别忘了给大家提供三明治就是了。</span></p>
<p><span>14</span><span>、至少每个季度邀请小组成员一起外出就餐一次。如果预算控制的好，应付这笔花消是没有问题的。</span></p>
<p><span>15</span><span>、要知道所有员工的能力的总和就是整个小组的最大工作产出。不要仅仅因为你自己给自己树立了高标准就希望所有的小组成员都能够做到和你一样。要根据他们的实际情况去赞扬和鼓励他们，并且针对他们的不足而对他们进行培训。</span></p>
<p><span>成功总会到来</span></p>
</div>
<span>成功的管理技能帮助</span><span>Crane</span><span>成为了独立的管理顾问。现在，他帮助很多中小型公司策划</span><span>IT</span><span>电子销售系统和电子商务服务战略。上面所介绍的这些技巧至今仍在帮助着他。</span> 
<img src ="http://www.cnblogs.com/xuebing/aggbug/377858.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item></channel></rss>