<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>树欲静而风不止</title>
    <description>做人要厚道、积极、乐观、宽容、要有恒心、'狠心'、有自己的计划、目标,且要不打折扣的去执行.</description>
    <link>http://xujingbao.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>新太古代 </title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/191223" style="color:red;">http://xujingbao.javaeye.com/blog/191223</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          是太古宙的最后一个代,前一个是中太古代,后一个是元古宙的古元古代.<br />     新太古宙的年代大约在28~25亿年之间， 新太古代早期出现了地球形成以来的第一次冰河期,并延续5亿年,也就是28~23亿年之间。遵化新太古代蛇绿混杂岩中的地幔岩显微构造以粗粒镶嵌构造为主,矿物颗粒多以弧形边界紧密镶嵌,部分岩石出现粒间熔体.橄榄石出现残斑构造、动态重结晶和拉长变形,铬铁矿出现典型的高温拉分构造,表现出活跃的动态恢复、粒间滑移和扩散蠕变,显示出大洋上地幔高温条件下塑性流变的特征,是大洋板块侧向扩张的深部表现.遵化蛇绿岩的地幔岩除了具有强烈的构造变形之外,部分豆荚状铬铁矿保留有豆状、豆壳状等岩浆结构和构造,并且有未变形的纯橄岩和辉石岩侵入,说明位于一个岩浆较强烈活动的位置.高温塑性侧向剪切变形和强烈的岩浆活动表明遵化蛇绿岩形成于快速扩张的洋脊,类似阿曼蛇绿岩.遵化蛇绿岩的围岩出现石英条带、核幔构造、动态重结晶和云母鱼等显微构造变形,对应着蛇绿岩侵位到陆壳之后,从中部地壳向上地壳抬升的构造运动过程. <br />太古代<br />      太古代离我们久远，是地质发展史中最古老的时期，延续时间长达15亿年，是地球演化史中具有明确地质记录的最初阶段。由于年代久远，太古代的保存下来的地质纪录非常破碎、零散。但是，太古代又是地球演化的关键时期，地球的岩石圈、水圈、大气圈和生命的形成都发生在这一重要而又漫长的时期，大约39亿年前，地球形成最初的永久地壳，至35亿年前大气圈、海水开始形成。<br />      在太古代的最初期，地球上尚无生命出现。生命元素，如C，H，O，N等在强烈的宇宙射线、雷电轰击下首先形成简单有机分子，后发展为复杂有机分子，再形成准生命的凝聚体，进而由凝聚体进化成原始生命。在距今约33亿年前，形成了地球上最古老的沉积岩，大气圈中已含有一定的二氧化碳，并出现了最早的、与生物活动相关的叠层石；到 31亿年前，地球上开始出现比较原始的藻类和细菌。在29亿年前，地球上出现了大量蓝绿藻形成叠层石，这表明这一时期地球上已经出现了游离氧以及行光合作用的原核生物。<br />      经过了天文期以后，地球便正式成为太阳系的成员。大约又经过22亿年，地球发展便进入到地质时期——太古代。这段从46亿年～38亿年的地质时期有哪些特点？<br />     （1）薄而活动的原始地壳：根据资料分析，原始地壳的部分可能更接近于上地幔。硅铝质和硅镁质尚未进行较完全的分异，因此太古代时期的地壳是很薄的，也没有现在这样坚固复杂。由于地球内部放射性物质衰变反映较为强烈，地壳深处的融熔岩浆，不时从地壳深处，沿断裂涌出，形成岩浆岩和火山喷发。当时到处可见火山喷发的壮观景象。因此我们现在从太古代地层中，普遍可见火山岩系。<br />     （2）深浅多变的广阔海洋中散布少数孤岛：当时地球的表面，还是海洋占有绝对优势，陆地面积相对较少，海洋中散布着孤零的海岛，地壳处于十分活跃状态，海洋也因强烈的升降运动，而变得深浅多变。陆地上也有多次岩浆喷发和侵入，使上面局部地区固结硬化，使地壳慢慢向稳定方向发展，因此太古代晚期形成了稳定基底地块——“陆核”。陆核出现，标志地球有了真正的地壳。<br />      （3）富有CO2，缺少氧气的水体和大气圈：太古代地球表面，虽然已经形成了岩石圈、水圈和大气圈。但那时的地壳表面，大部分被海水覆盖，由于大量火山喷发，放出大量的CO2，同时又没有植物进行光合作用，海水和大气中含有大量的CO2，而缺少氧气。大气中的CO2随着降水，又进入到海洋，因此海洋中HCO3-浓度增大。岩浆活动和火山喷发的同时，带来大量的铁质，有可能被具有较强的溶解能力的降水和地表水溶解后带入海洋。含HCO3-高浓度海水同时具有较大的溶解能力和搬运能力，因此可将低价铁源源不断地搬运至深海区，这就是为什么太古代铁矿石占世界总储量60％，矿石质量好，并且在深海中也能富集成矿的原因。<br />     （4）太古代的地层：太古代的地层，都是一些经过变质的岩石，例如片麻岩、变粒岩、混合岩等深变质的岩石。我国太古代地层只分布在秦岭、淮河以北地区。出产鞍山式铁矿的鞍山、吕梁山、泰山、太行山等地均有太古代地层。<br /><br />      太古代（Archeozoic Era，Archeozoic）最古的地质时代。一般指距今46亿年前地球形成到25亿年前原核生物（包括细菌和蓝藻）普遍出现这段地质时期。“太古代”一词1872年由美国地质学家达纳（J.D.Dana）所创用。当时形成的地层叫“太古界”，代表符号为“Ar”。主要由片麻岩、花岗岩等组成，富含金、银、铁等矿产，构成各大陆地壳的核心。主要分布在澳大利亚、非洲、南美的东北部、加拿大、芬兰、斯堪的那维亚等地；我国辽东半岛、山东半岛和山西等地，亦有太古代地层露出。1970～1980年，一批科学家连续报道了在澳大利亚西部诺恩·波尔（NorthPole）地区35亿年前的瓦拉乌纳群（Warrawoonagroup）地层中，发现了一些丝状微化石。这是迄今在太古代地层中发现的、比较可信的最早化石记录。   <br />         蛇绿岩研究进展、存在问题及思考<br />20世纪70年代建立的蛇绿岩(Ophiolite)概念认为出露在缝合带中的一套镁铁-超镁铁岩组合是大洋岩石圈的残留,其岩性单元可以与现代大洋岩石圈各个层圈一一对应,所以蛇绿岩是确定古板块边界的重要证据,该认识促进了板块构造学说的发展.近年来完善的MOR型和SSZ型蛇绿岩理论体系认为MOR型蛇绿岩形成于洋中脊(MOR),SSZ型蛇绿岩形成于俯冲带上(Supra-Subduction Zone),二者的地幔橄榄岩、堆晶岩组合及上部熔岩在岩石学、矿物学和地球化学方面均有不同的特征,洋-陆俯冲和洋内俯冲是形成SSZ型蛇绿岩的两种机制,较为合理地解释了蛇绿岩的多样性及其与大洋岩石圈的差异.由于大洋板块的俯冲作用,在缝合带中MOR型蛇绿岩很少被保存下来,保存较好的大多数为SSZ型蛇绿岩.本文探讨了蛇绿岩研究中经常遇到的问题并提出了解决的思路,同时认为Rodinia超大陆前是否存在蛇绿岩、太古宙绿岩是否为蛇绿岩均为有待深入研究的问题.
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/191223#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 21:28:10 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/191223</link>
        <guid>http://xujingbao.javaeye.com/blog/191223</guid>
      </item>
      <item>
        <title>冥古代</title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/186060" style="color:red;">http://xujingbao.javaeye.com/blog/186060</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          冥古代&mdash;&mdash;从公元前45亿年至公元前38.5亿年期间，为地球形成时期。这期间，地球上无任何生命，也没有水和土壤，整个地球表面均为裸露的岩石。<br /><br />       地球起源于46亿年以前的原始太阳星云。经过微星的集聚、碰撞和挤压使其内部变热，以后则是放射性物质的衰变使地球内部进一步升温，约在距今45-40亿年前，当温度上升到铁的熔点时，大量融化的铁向地心沉降，并以热的方式释放重力能，其能量相当于一千多次百万吨级的核爆炸。大量的热使地球内部广泛融化和发生改变，逐步形成了分层结构，其中心是致密的铁核，熔点低的较轻物质则浮在表面，经冷却形成地壳。<br /><br />       当时地表的温度、大气和水体的组分和性质可能还不具备生命产生的条件，因而也不会出现风化侵蚀等地质作用及其产物。那时的地球就象一个巨大的岩浆球,火山爆发频繁，表面覆盖着熔化的岩浆海洋。随着聚合在内部的水气受热上升,在高空冷却成云致雨。这场大雨连续不断地下了足有几百万年,其中夹杂着一次次的闪电,岩石中的氮氢等元素被不断的催化,逐渐的形成了氨基这种低级生命所必须的有机分子。随着不间断的雨水的侵入，地表渐渐地冷却,氨基酸等大分子形成，原始大气圈和海洋随之诞生。这时大气圈中含有大量的二氧化碳，地球也被厚厚的云层封锁着，太阳光几乎穿不透地球橘红色的天空，海洋的温度高于150 摄氏度。在这沸腾的海洋里，孕育生命的各种元素在不断积累，生命的时代才刚刚拉开了序幕........<br /><br />CrypticEra（直译是神秘时代）&mdash;&mdash;4567.17 +/- 0.7年前<br /><br />       冥古代的第一个阶段，存在于距今大约456717万年前（由于同位素测试的精度，这个值有正负70万年的误差）。关于这个时代人类目前几乎一无所知，它的地质证据，如果曾经存在的话，也已经在整个冥古代持续不断的天体轰炸中被摧毁了。地球是在这个阶段成型的，地球的内部开始塌陷（就是密度较大的物质向球心集合，如果地球足够大就会通过这个过程变成一颗恒星）而熔液表面则开始凝固。这一形成过程约长5000万到一亿年。目前已知的地球上最古老的物质产生于这个年代（距今44亿年）。<br /><br />      BasinGroups（直译是盆地群）&mdash;&mdash;4150 - 4567.17年前<br /><br />       冥古代的第二个阶段，这个阶段持续到距今40亿年前。这个阶段可能因为地球表面的大量盆地得名。目前已知地球上最古老的岩石就形成于这个阶段（39亿6000万年前，发现于加拿大西北部/36亿5000万到37亿年前，发现于格陵兰岛西部）。<br /><br />Nectarian&mdash;&mdash;3975 - 4000年前<br /><br />       冥古代的第三个阶段，这个阶段只有短短的2500万年，在这一阶段发生了席卷太阳系内圈的天文轰炸，大量的天体撞击地球，所以在这个阶段，地球上应该还在不断地产生新的盆地。<br /><br />Nectarian 期间 运行从3920 百万年前到3850 百万年前。 这是期间的期间在 Nectaris 盆地 由大形成。Ejecta 从Nectaris 形成上部的密集地cratered 地形被发现在月球高地。<br /><br />       从所有证据消失了， 它被使用了作为一个非官方的期间的。疑义相似的事件未发生在地球上因为它比可观地更大和巨型的。Swazian Early Imbrian &mdash;&mdash;3900 - 3975年前<br /><br />从公元前45亿年至38.5亿年期间，为地球形成时期。这期间，地球上无任何生命，也没有水和土壤，整个地球表面均为裸露的岩石。在这个时代，称为冥古代。这时的地球就象一个巨大的岩浆球,聚合在内部的水气受热上升,在高空冷却成云致雨,这场大雨连续不断地下了足有几百万年,其中夹杂着一次次的闪电,岩石中的氮氢等元素被不断的催化,逐渐的形成了氨基这种低级生命所必须的有机分子.当地表渐渐地冷却,氨基酸等大分子形成，<br /><br />          从45亿年至38.5亿年期间，为地球形成时期。地球起源于46亿年以前的原始太阳星云。经过微星的集聚、碰撞和挤压使其内部变热，以后则是放射性物质的衰变使地球内部进一步升温，约在距今45-40亿年前，当温度上升到铁的熔点时，大量融化的铁向地心沉降，并以热的方式释放重力能，其能量相当于一千多次百万吨级的核爆炸。大量的热使地球内部广泛融化和发生改变，逐步形成了分层结构，其中心是致密的铁核，熔点低的较轻物质则浮在表面，经冷却形成地壳。<br /><br />           有些科学家称其为地球的天文时期、或地球的前地质时期、或前太古代、或原太古代。这一时期地球历史包括原始地壳、原始陆壳的性质和形成以及原始生命的形式和出现等复杂的问题。这期间，地球上无任何生命，也没有水和土壤，整个地球表面均为裸露的岩石。在这个时代，称为冥古代。<br /><br />           当时地表的温度、大气和水体的组分和性质可能还不具备生命产生的条件，因而也不会出现风化侵蚀等地质作用及其产物。那时的地球就象一个巨大的岩浆球,火山爆发频繁，表面覆盖着熔化的岩浆海洋。随着聚合在内部的水气受热上升,在高空冷却成云致雨。这场大雨连续不断地下了足有几百万年,其中夹杂着一次次的闪电,岩石中的氮氢等元素被不断的催化,逐渐的形成了氨基这种低级生命所必须的有机分子。随着不间断的雨水的侵入，地表渐渐地冷却,氨基酸等大分子形成，原始大气圈和海洋随之诞生。这时大气圈中含有大量的二氧化碳，地球也被厚厚的云层封锁着，太阳光几乎穿不透地球橘红色的天空，海洋的温度高于150 摄氏度。在这沸腾的海洋里，孕育生命的各种元素在不断积累，生命的时代才刚刚拉开了序幕........<br /><br />        从46亿年前地球诞生到距今38亿年前叫冥古宙。这时地球刚形成，温度极高，天上赤日炎炎，电闪雷鸣，地上火山喷发，熔岩横溢。从火山喷出的气体，构成了原始大气层。空气中的水汽冷却后化成暴雨，使地球慢慢冷却下来。地质特征：地球形成，极不稳定，温度高，火山活动剧烈；生物特征：环境恶劣，没有生物存在。<br /><br /><br /><br />      当时地表的温度、大气和水体的组分和性质可能还不具备生命产生的条件，因而也不会出现风化侵蚀等地质作用及其产物。那时的地球就象一个巨大的岩浆球,火山爆发频繁，表面覆盖着熔化的岩浆海洋。随着聚合在内部的水气受热上升,在高空冷却成云致雨。这场大雨连续不断地下了足有几百万年,其中夹杂着一次次的闪电,岩石中的氮氢等元素被不断的催化,逐渐的形成了氨基这种低级生命所必须的有机分子。随着不间断的雨水的侵入，地表渐渐地冷却,氨基酸等大分子形成，原始大气圈和海洋随之诞生。这时大气圈中含有大量的二氧化碳，地球也被厚厚的云层封锁着，太阳光几乎穿不透地球橘红色的天空，海洋的温度高于150 摄氏度。在这沸腾的海洋里，孕育生命的各种元素在不断积累，生命的时代才刚刚拉开了序幕........
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/186060#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 20:59:42 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/186060</link>
        <guid>http://xujingbao.javaeye.com/blog/186060</guid>
      </item>
      <item>
        <title>Ajax,xmlhttp同步与异步的区别</title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/186050" style="color:red;">http://xujingbao.javaeye.com/blog/186050</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="javascript">
   var returnValue = null;
   xmlhttp = createXmlHttp();
   xmlhttp.onreadystatechange = function() {
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        if (xmlhttp.responseText == "true") {
            returnValue = "true";
        }
        else {
            returnValue = "false"; 
        } 
    }
};
   xmlhttp.open("Post",url,true); //异步传输
   xmlhttp.setRequestHeader("If-Modified-Since","0"); //不缓存Ajax
   xmlhttp.send(sendStr);
   return returnValue;
</pre><br /><br /><br />如果是同步(false)，返回值是true或false，因为执行完send后，开始执行onreadystatechange，程序会等到 onreadystatechange都执行完，取得responseText后才会继续执行下一条语句，所以returnValue一定有值。<br />    如果是异步(true)，返回值一定是null，因为程序执行完send后不等xmlhttp的响应，而继续执行下一条语句，所以returnValue还没有来的及变化就已经返回null了。<br /><br /><br />    所有如果想获得xmlhttp返回值必须用同步，异步无法得到返回值。    <br /><br />    同步异步使用xmlhttp池时都要注意：取得xmlhttp时只能新建xmlhttp，不能从池中取出已用过的xmlhttp，因为被使用过的xmlhttp的readyState为4，所以同步异步都会send但不执行onreadystatechange。<br /><br />以上是我在往上查到的资料，对于同步异步的概念还是不甚理解，最后一段什么意思，还请各位赐教
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/186050#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 20:15:23 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/186050</link>
        <guid>http://xujingbao.javaeye.com/blog/186050</guid>
      </item>
      <item>
        <title>仿网上银行虚拟键盘脚本- keyboard.js</title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/185707" style="color:red;">http://xujingbao.javaeye.com/blog/185707</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          把附件内容解压,HEAD调用以下代码,<br /><div class="quote_title">js 写道</div><div class="quote_div"><br /><span style="color: darkred"> <br />&lt;script type="text/javascript" src="keyboard.js" charset="UTF-8">&lt;/script><br />&lt;link rel="stylesheet" type="text/css" href="keyboard.css"><br /></span><br /></div><br />input控件加入一个class属性<br /><div class="quote_title">html 写道</div><div class="quote_div"><br /><span style="color: darkred"><br />&lt;input class="keyboardInput" type="text" /><br /></span><br /></div><br /><img src="http://www.javaeye.com/upload/picture/pic/12665/68743177-8a2d-3197-a5a3-a0f360699eae.bmp?1208912910" />
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/185707#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 09:04:08 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/185707</link>
        <guid>http://xujingbao.javaeye.com/blog/185707</guid>
      </item>
      <item>
        <title>基于JDBC的数据库连接池高效管理策略</title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/183670" style="color:red;">http://xujingbao.javaeye.com/blog/183670</a>&nbsp;
          发表时间: 2008年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          作者：中国IT实验室 来源:中国IT实验室<br /><br />　在基于JDBC的数据库应用开发中，数据库连接的管理是一个难点，因为它是决定该应用性能的一个重要因素。本文在对数据库连接进行透彻分析的基础上，提出并实现了一个高效的连接管理策略，使得开发高性能的数据库应用变得相对容易。特别是，对于连接管理中的两个难点：事务和多线程问题进行了深入的剖析，并给出了一个基于设计模式的解决方案。<br />　　介绍<br />　　<br />　　在使用Java语言进行和数据库有关的的应用开发中，一般都使用JDBC来进行和数据库的交互，其中有一个关键的概念就是Connection（连接），它在Java中是一个类，代表了一个通道。通过它，使用数据的应用就可以从数据库访问数据了。<br />　　<br />　　对于一个简单的数据库应用，由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时，就新创建一个连接，用完后就关闭它，这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用，情况就完全不同了。频繁的建立、关闭连接，会极大的减低系统的性能，因为对于连接的使用成了系统性能的瓶颈。<br />　　<br />　　本文给出的方法可以有效的解决这个问题。在本方法中提出了一个合理、有效的连接管理策略，避免了对于连接的随意、无规则的使用。该策略的核心思想是：连接复用。通过建立一个数据库连接池以及一套连接使用管理策略，使得一个数据库连接可以得到高效、安全的复用，避免了数据库连接频繁建立、关闭的开销。另外，由于对JDBC中的原始连接进行了封装，从而方便了数据库应用对于连接的使用（特别是对于事务处理），提高了开发效率，也正是因为这个封装层的存在，隔离了应用的本身的处理逻辑和具体数据库访问逻辑，使应用本身的复用成为可能。<br />　　<br />　　问题产生<br />　　<br />　　我参与的项目是开发一个网管系统，不可避免的要和数据库打交道。刚开始时，由于对于数据库的访问不是很频繁，对于数据库连接的使用就是简单的需要时就建立，用完就关闭的策略，这很符合XP（eXtreme Programming）的口号："Do the Simplest Thing that Could Possibly Work"。确实，开始时工作的很好。随着项目的进展，对于数据库的访问开始变的频繁，问题就暴露出来了，原先的通过简单地获取和关闭数据库连接的方法将很大的影响系统的性能，这种影响是由于数据库资源管理器进程频繁的创建和摧毁那些连接对象而引起的。<br />　　<br />　　此时，就有必要对数据库访问方法进行重构（refactoring），因为我们确实需要进行改进，来提高系统的性能。<br />　　<br />　　解决方案<br />　　<br />　　可以看出，问题的根源就是由于对于连接资源的低效管理造成的。对于共享资源，有一个很著名的设计模式：资源池。该模式正是为了解决资源频繁分配、释放所造成的问题的。把该模式应用到数据库连接管理领域，就是建立一个数据库连接池，提供一套高效的连接分配、使用策略，最终目标是实现连接的高效、安全的复用。<br />　　<br />　　3.1、建立连接池<br />　　<br />　　第一步，就是要建立一个静态的连接池，所谓静态是指，池中的连接是在系统初始化时就分配好的，并且不能够随意关闭的。Java中给我们提供很多容器类可以方便的用来构建连接池，如：Vector、Stack等。在系统初始化时，根据配置创建连接并放置在连接池中，以后所使用的连接都是从该连接池中获取的，这样就可以避免连接随意建立、关闭造成的开销（当然，我们没有办法避免Java的Garbage Collection带来的开销）。<br />　　<br />　　3.2、分配、释放策略<br />　　<br />　　有了这个连接池，下面我们就可以提供一套自定义的分配、释放策略。<br />　　<br />　　当客户请求数据库连接时，首先看连接池中是否有空闲连接，这里的空闲是指，目前没有分配出去的连接。如果存在空闲连接则把连接分配给客户，并作相应处理，具体处理策略，在关键议题中会详述，主要的处理策略就是标记该连接为已分配。若连接池中没有空闲连接，就在已经分配出去的连接中，寻找一个合适的连接给客户（选择策略会在关键议题中详述），此时该连接在多个客户间复用。<br />　　<br />　　当客户释放数据库连接时，可以根据该连接是否被复用，进行不同的处理。如果连接没有使用者，就放入到连接池中，而不是被关闭。<br />　　<br />　　可以看出正是这套策略保证了数据库连接的有效复用。<br />　　<br />　　3.3、配置策略<br />　　<br />　　数据库连接池中到底要放置多少个连接，连接耗尽后该如何处理呢？这时一个配置策略。一般的配置策略是，开始时，根据具体的应用需求，给出一个初始的连接池中连接的数目以及一个连接池可以扩张到的最大连接数目。本方案就是按照这种策略实现的。<br />　　<br />　　关键议题<br />　　<br />　　本节将对上述解决方案中的关键细节进行详述，正是这些关键的策略保证了数据库连接复用的高效和安全。<br />　　<br />　　4.1、引用记数<br />　　<br />　　3.2节中的分配、释放策略对于有效复用连接非常重要，我们采用的方法也是采用了一个很有名的设计模式：Reference Counting（引用记数）。该模式在复用资源方面用的非常广泛，我们把该方法运用到对于连接的分配释放上。每一个数据库连接，保留一个引用记数，用来记录该连接的使用者的个数。具体的实现上，我们采用了两极连接池，空闲池和使用池。空闲池中存放目前还没有分配出去被使用的连接，一旦一个连接被分配出去，那么就会放入到使用池中，并且增加引用记数。<br />　　<br />　　这样做有一个很大的好处，使得我们可以高效的使用连接，因为一旦空闲池中的连接被全部分配出去，我们就可以根据相应的策略从使用池中挑选出一个已经正在使用的连接用来复用，而不是随意拿出一个连接去复用。策略可以根据需要去选择，我们采用的策略比较简单：复用引用记数最小的连接。Java的面向对象特性，使得我们可以灵活的选择不同的策略（提供一个不同策略共用的抽象接口，各个具体的策略都实现这个接口，这样对于策略的处理逻辑就和策略的实现逻辑分离）。<br />　　<br />　　4.2、事务处理<br />　　<br />　　前面谈到的都是关于使用数据库连接进行普通的数据库访问。对于事务处理，情况就变得比较复杂。因为事务本身要求原子性的保证，此时就要求对于数据库的操作符合"All-All-Nothing"原则，即要么全部完成，要么什么都不做。如果简单的采用上述的连接复用的策略，就会发生问题，因为没有办法控制属于同一个事务的多个数据库操作方法的动作，可能这些数据库操作是在多个连接上进行的，并且这些连接可能被其他非事务方法复用。<br />　　<br />　　Connection本身具有提供了对于事务的支持，可以通过设置Connection的AutoCommit属性为false，显式的调用commit或者rollback方法来实现。但是要安全、高效的进行Connection进行复用，就必须提供相应的事务支持机制。我们采用的方法是：采用显式的事务支撑方法，每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性（如果事务不独占一条连接，那么要保证事务的原子性并且又不妨碍复用该连接的其他和该事务无关的操作，基本上不可能，除非Connection类是你开发的），并且又不会妨碍连接的复用，因为隶属于该事务的所有数据库操作都是通过这一个连接完成的，并且事务方法又复用了其他一些数据库方法。<br />　　<br />　　在我们的连接管理服务提供了显式的事务开始、结束（commit或者rollback）声明，以及一个事务注册表，用于登记事务发起者和事务使用的连接的对应关系，通过该表，使用事务的部分和我们的连接管理部分就隔离开，因为该表是在运行时根据实际的调用情况，动态生成的。事务使用的连接在该事务运行中不能被复用。<br />　　<br />　　当使用者需要使用事务方法时，首先调用连接管理服务提供的beginTrans方法，该方法主要处理流程如下(伪码描述)：<br />　　<br />　　public void beginTrans( ) {<br />　　…<br />　　conn = getIdleConnectionFromPoll( );<br />　　userId = getUserId( );<br />　　registerTrans(userId, conn);<br />　　…<br />　　} <br />　　<br />　　<br />　　<br />　　<br />　　<br />　　<br />　　在我们的实现中，用户标识是通过使用者所在的线程来标识的。后面的所有对于数据库的访问都是通过查找该注册表，使用已经分配的连接来完成的。当事务结束时，从注册表中删除相应表项。<br />　　<br />　　对于嵌套的事务如何处理呢？我们采用的方法仍为引用记数，不过这里的引用记数是指的"嵌套层次"，具体的细节，不再赘述。<br />　　<br />　　4.3、封装<br />　　<br />　　从上面的论述可以看出，普通的数据库方法和事务方法对于连接的使用（分配、释放）是不同的，为了便于使用，对外提供一致的操作接口，我们对连接进行了封装：即普通连接和事务连接。在此，我们利用了Java中的强大的面向对象特性：多态。普通连接和事务连接均实现了一个DbConnection接口，对于接口中定义的方法，分别根据自己的特点作了不同的实现，这样在对于连接的处理上就非常的一致了。<br />　　<br />　　4.4、并发问题<br />　　<br />　　为了是我们的连接管理服务有更大的通用性，就必须要考虑到多线程环境，即并发问题。在一个多线程的环境下，我们必须要保证连接管理自身数据的一致性和连接内部数据是一致性，还好Java提供对这方面的很好的支持（synchronized关键字），这样我们就很容易使连接管理成为线程安全的。<br />　　<br />　　5、结论<br />　　<br />　　本文给出了一个基本的连接管理框架，在其中使用了一些广泛使用的设计模式（资源池，引用记数等），使得高效、安全的复用数据库连接成为可能。当然，还有一些问题没有考虑到，比如：没有实现对不同种类的数据库的联合管理；没有提供定时检测机制，查询连接的状态等。另外在连接管理的使用包装上比起一些商用的系统还显粗糙，但是底层的基理是一致的，所以通过本文相信对于这些商用的产品中的相关功能会有更好的理解。<br />　　<br />　　参考文献<br />　　《Thinking in Java》Bruce Eckel<br />　　<br />　　《Real-Time Design Patterns》 Bruce
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/183670#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Apr 2008 10:19:50 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/183670</link>
        <guid>http://xujingbao.javaeye.com/blog/183670</guid>
      </item>
      <item>
        <title>setInterval和clearInterval </title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/182540" style="color:red;">http://xujingbao.javaeye.com/blog/182540</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          clearInterval类似JS的clearTimeout<br /><br />时间间隔可以用 setInterval 命令来创建并用 clearInterval 命令来终止。setInterval 所用的参数有两种格式。在第一种格式中，你传递给 setInterval 的参数可以是一个函数名，一段时间上的间隔以及一些传递给前面函数的相关参数。当 setInterval 运行时它会依照规定的时间间隔依次将列出的参数传递给指定的函数，直到你调用 clearInterval 将其终止。相关的示范代码如下：<br /><br />function updateStockPrices(whichStock) {<br />        // Update code here<br />        trace('Updating prices for '+whichStock);<br />}<br />stockInterval = setInterval(updateStockPrices, 1000, "Stratford Flash Products");<br /><br />setInterval全面的介绍<br />setInterval动作的作用是在播放动画的时，每隔一定时间就调用函数，方法或对象。可以使用本动作更新来自数据库的变量或更新时间显示。setInterval动作的语法格式如下：<br />setInterval(function,interval[,arg1,arg2,......argn])<br />setInterval(object,methodName,interval[,arg1,arg2,.....argn])<br />第一种格式是标准动作面板中setInterval函数的默认语法，第二种格式是在专家模式动作中使用的方法。<br />其中的参数function是一个函数名或者一个对匿名函数的引用。object参数指定从Object对象派生的对象。methodName制定object参数中要调用的方法。interval制定对function或methodName调用两次之间的时间，单位是毫秒。后面的arg1等是可选的参数，用于制定传递给function或是methodName的参数。<br />setInterval它设置的时间间隔小于动画帧速（如每秒10帧，相当于100毫秒），则按照尽可能接近interval的时间间隔调用函数。而且必须使用updateAfterEvent动作来确保以足够的频率刷新屏幕。如果interval大于动画帧速，则只用在每次播放头进入某一帧是才调用，以减小每次刷新屏幕的影响。<br />下面的例子每隔1秒调用一次匿名函数。<br /><br />setInterval(function(){trace("每隔1秒钟我就会显示一次")},1000);//这里的function(){}是没有函数名<br />的函数。成为匿名函数，后面的1000是时间间隔，单位是毫秒。<br />下面的例子为我们展示如何带参数运行。<br /><br />function show1(){<br />trace("每隔1秒我就会显示一次");<br />}<br />function show2(str){<br />trace(str);<br />}<br />setInterval(show1,1000);<br />setInterval(show2,2000,"每隔2秒我就会显示一次");<br />上面已经将函数的setInterval方法介绍了。<br />下面我们将介绍对象的setInterval方法。<br />首先，写一个setInterval在动作中调用对象的方法的例子，该例子不需要传递参数。<br /><br />myobj=new Object();//创建一个新的对象<br />myobj.interval=function){<br />trace("每隔1秒我就会显示一次");<br />}//创建对象的方法。<br />setInterval(myobj,"interval",1000);//设定时间间隔调用对象的方法。<br /><br />接下来介绍如何传递参数。其实道理和函数的传递参数是一样的。<br /><br />myobj=new Object();<br />myobj.interval-function(str){<br />trace(str);<br />}<br />setInterval(myobj,"interval",2000," 每隔2秒我就会显示一次");<br /><br />注意。要调用为对象定义的方法时，必须在专家模式中使用第二种语法格式。<br />这样子的话呢，我们来作一个动态显示时间的画面。可以用下面的代码实现。<br /><br />setInterval(show,1000);<br />function show(){<br />time=new Date();<br />hour=time.getHours();<br />minu=time.getMinutes();<br />sec=time.get.Seconds();<br />datetime=hour ":" minu ":" sec;<br />}//这里的datetime是一个动态文本框的变量名字。<br /><br />这样子呢，setInterval这个方法大家应该学的很好了。现在呢，我们学习clearInterval.<br />clearInterval动作的作用是清楚对setInterval函数的调用，它的语法格式如下clearInterval(intervalid);intervalid是调用setInterval函数后返回的对象。<br />下面举一个简单的例子。<br /><br />function show(){<br />trace("每隔一秒我就会显示一次");<br />}<br />var sh;<br />sh=setInterval(show,1000);<br />clearInterval(sh); <br /><br />一个例子<br /><div class="quote_title">js 写道</div><div class="quote_div"><br />function auto(){<br />	 alert("到時間了")<br />}<br />var monitorInterval = null;  <br />function setAuto(time,isFrist){<br />	var intervalTime=time;<br />	if(isFrist!="1"){		<br />		if(intervalTime!="off"){<br />			monitorInterval= setInterval("auto()", intervalTime*1000);<br />		}else{<br />			if(monitorInterval){		   	 	<br />				clearInterval(monitorInterval);				<br />				monitorInterval = null;			<br />			}<br />		}<br />	}<br />}<br /></div><br /><div class="quote_title">html 写道</div><div class="quote_div"><br />&lt;table><br />	&lt;tr><br />		&lt;td nowrap="nowrap" bgcolor="#E8E8E8">自動更新&lt;/td><br />		&lt;td align="left" bgcolor="#E8E8E8">&lt;select<br />			onchange="setAuto(this.value,'0')"><br />			&lt;option value="10">10sec&lt;/option><br />			&lt;option value="20">20sec&lt;/option><br />			&lt;option value="30">30sec&lt;/option><br />			&lt;option value="60">1min&lt;/option><br />			&lt;option value="300">5min&lt;/option><br />			&lt;option value="600">10min&lt;/option><br />			&lt;option value="1800">30min&lt;/option><br />			&lt;option value="3600">60min&lt;/option><br />			&lt;option value="off">Stay&lt;/option><br />		&lt;/select>&lt;/td><br />	&lt;/tr><br />&lt;/table><br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/182540#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 13:09:46 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/182540</link>
        <guid>http://xujingbao.javaeye.com/blog/182540</guid>
      </item>
      <item>
        <title>提高查询效率</title>
        <author>xujingbao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xujingbao.javaeye.com">xujingbao</a>&nbsp;
          链接：<a href="http://xujingbao.javaeye.com/blog/182048" style="color:red;">http://xujingbao.javaeye.com/blog/182048</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.对查询进行优化，应尽量避免全表扫描，首先应考虑在 where 及 order by 涉及的列上建立索引。 <br /><br />2.应尽量避免在 where 子句中对字段进行 null 值判断，否则将导致引擎放弃使用索引而进行全表扫描，如：<br />select id from t where num is null<br />可以在num上设置默认值0，确保表中num列没有null值，然后这样查询：<br />select id from t where num=0<br /><br />3.应尽量避免在 where 子句中使用!=或&lt;>操作符，否则将引擎放弃使用索引而进行全表扫描。<br /> <br />4.应尽量避免在 where 子句中使用 or 来连接条件，否则将导致引擎放弃使用索引而进行全表扫描，如：<br />select id from t where num=10 or num=20<br />可以这样查询：<br />select id from t where num=10<br />union all<br />select id from t where num=20<br /> <br />5.in 和 not in 也要慎用，否则会导致全表扫描，如：<br />select id from t where num in(1,2,3)<br />对于连续的数值，能用 between 就不要用 in 了：<br />select id from t where num between 1 and 3<br /> <br />6.下面的查询也将导致全表扫描：<br />select id from t where name like '%abc%'<br />若要提高效率，可以考虑全文检索。<br /> <br />7.如果在 where 子句中使用参数，也会导致全表扫描。因为SQL只有在运行时才会解析局部变量，但优化程序不能将访问计划的选择推迟到运行时；它必须在编译时进行选择。然而，如果在编译时建立访问计划，变量的值还是未知的，因而无法作为索引选择的输入项。如下面语句将进行全表扫描：<br />select id from t where num=@num<br />可以改为强制查询使用索引：<br />select id from t with(index(索引名)) where num=@num<br /> <br />8.应尽量避免在 where 子句中对字段进行表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如：<br />select id from t where num/2=100<br />应改为:<br />select id from t where num=100*2<br /> <br />9.应尽量避免在where子句中对字段进行函数操作，这将导致引擎放弃使用索引而进行全表扫描。如：<br />select id from t where substring(name,1,3)='abc'--name以abc开头的id<br />select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id<br />应改为:<br />select id from t where name like 'abc%'<br />select id from t where createdate>='2005-11-30' and createdate&lt;'2005-12-1'<br /> <br />10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。<br /> <br />11.在使用索引字段作为条件时，如果该索引是复合索引，那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引，否则该索引将不会被使用，并且应尽可能的让字段顺序与索引顺序相一致。<br /> <br />12.不要写一些没有意义的查询，如需要生成一个空表结构：<br />select col1,col2 into #t from t where 1=0<br />这类代码不会返回任何结果集，但是会消耗系统资源的，应改成这样：<br />create table #t(...)<br /> <br />13.很多时候用 exists 代替 in 是一个好的选择：<br />select num from a where num in(select num from b)<br />用下面的语句替换：<br />select num from a where exists(select 1 from b where num=a.num)<br /> <br />14.并不是所有索引对查询都有效，SQL是根据表中数据来进行查询优化的，当索引列有大量数据重复时，SQL查询可能不会去利用索引，如一表中有字段sex，male、female几乎各一半，那么即使在sex上建了索引也对查询效率起不了作用。<br /> <br />15.索引并不是越多越好，索引固然可以提高相应的 select 的效率，但同时也降低了 insert 及 update 的效率，因为 insert 或 update 时有可能会重建索引，所以怎样建索引需要慎重考虑，视具体情况而定。一个表的索引数最好不要超过6个，若太多则应考虑一些不常使用到的列上建的索引是否有必要。<br /> <br />16.应尽可能的避免更新 clustered 索引数据列，因为 clustered 索引数据列的顺序就是表记录的物理存储顺序，一旦该列值改变将导致整个表记录的顺序的调整，会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列，那么需要考虑是否应将该索引建为 clustered 索引。<br /> <br />17.尽量使用数字型字段，若只含数值信息的字段尽量不要设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。<br /> <br />18.尽可能的使用 varchar/nvarchar 代替 char/nchar ，因为首先变长字段存储空间小，可以节省存储空间，其次对于查询来说，在一个相对较小的字段内搜索效率显然要高些。<br /> <br />19.任何地方都不要使用 select * from t ，用具体的字段列表代替“*”，不要返回用不到的任何字段。<br /> <br />20.尽量使用表变量来代替临时表。如果表变量包含大量数据，请注意索引非常有限（只有主键索引）。<br /> <br />21.避免频繁创建和删除临时表，以减少系统表资源的消耗。<br /> <br />22.临时表并不是不可使用，适当地使用它们可以使某些例程更有效，例如，当需要重复引用大型表或常用表中的某个数据集时。但是，对于一次性事件，最好使用导出表。<br /> <br />23.在新建临时表时，如果一次性插入数据量很大，那么可以使用 select into 代替 create table，避免造成大量 log ，以提高速度；如果数据量不大，为了缓和系统表的资源，应先create table，然后insert。<br /> <br />24.如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先 truncate table ，然后 drop table ，这样可以避免系统表的较长时间锁定。<br /> <br />25.尽量避免使用游标，因为游标的效率较差，如果游标操作的数据超过1万行，那么就应该考虑改写。<br /> <br />26.使用基于游标的方法或临时表方法之前，应先寻找基于集的解决方案来解决问题，基于集的方法通常更有效。<br /> <br />27.与临时表一样，游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法，尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许，基于游标的方法和基于集的方法都可以尝试一下，看哪一种方法的效果更好。<br /> <br />28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ，在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。<br /> <br />29.尽量避免大事务操作，提高系统并发能力。<br /> <br />30.尽量避免向客户端返回大数据量，若数据量过大，应该考虑相应需求是否合理
          <br/>
          <span style="color:red;">
            <a href="http://xujingbao.javaeye.com/blog/182048#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Apr 2008 12:56:19 +0800</pubDate>
        <link>http://xujingbao.javaeye.com/blog/182048</link>
        <guid>http://xujingbao.javaeye.com/blog/182048</guid>
      </item>
  </channel>
</rss>