<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>leaderbird 的个人博客</title>
	<atom:link href="http://leaderbird.blogcn.com/feed" rel="self" type="application/rss+xml" />
	<link>http://leaderbird.blogcn.com</link>
	<description>又一个 WordPress 站点</description>
	<lastBuildDate>Wed, 22 Feb 2012 05:35:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>说说大型高并发高负载网站的系统架构</title>
		<link>http://leaderbird.blogcn.com/articles/%e8%af%b4%e8%af%b4%e5%a4%a7%e5%9e%8b%e9%ab%98%e5%b9%b6%e5%8f%91%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%bd%91%e7%ab%99%e7%9a%84%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84.html</link>
		<comments>http://leaderbird.blogcn.com/articles/%e8%af%b4%e8%af%b4%e5%a4%a7%e5%9e%8b%e9%ab%98%e5%b9%b6%e5%8f%91%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%bd%91%e7%ab%99%e7%9a%84%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84.html#comments</comments>
		<pubDate>Wed, 22 Feb 2012 05:32:42 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[系统架构设计]]></category>
		<category><![CDATA[大型]]></category>
		<category><![CDATA[系统架构]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[高并发]]></category>
		<category><![CDATA[高负载]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/?p=217</guid>
		<description><![CDATA[读 《构建可扩展的Web站点》笔记 从目录中就可以看出来, 这是一本超越纯粹代码范畴的书. 涉及到开发工具, 开发方法, 开发过程, 体系结构, 应用分层, 常用web功能举例和注意事项, 性能瓶颈, 扩展并提出一些解决方法, 最后还涉及到性能的监控方法. 扩展Web应用程序 一、概念 简单的来说，如果一个系统可扩展，那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集，并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种： 1. 垂直扩展（stade up），通俗的说就是将某台单一的机器的性能提升的更高，如添加内存、更换更强的处理器等等。 2. 水平扩展（out），通俗的说就是添加新的机器。 对比可以发现，水平扩展比垂直扩展有更强大的扩展性，可以说是“无限”扩展，毕竟单台的机器的性能总是有限的，硬件的技术发展还赶不上web的发展。但同时，水平扩展也来了更高的维护成本。实际中，需要根据具体情况来寻求一个平衡点。 二、冗余 机器总可能会发生故障，而唯一的保证故障状况下服务依然可用的办法就是由多个硬件备份。备份可以分为热备份和冷备份，注意的区别在于数据服务是否在线，数据在线服务的同时进行的备份成为热备份。例如将mysql服务器关闭，然后拷贝数据文件到备份位置，则是典型的冷备份行为。 三、负载均衡 当我们使用了水平扩展之后，我们开始考虑新的问题了，如何将大量的请求“均衡”到我们的扩展机器上呢？ 两种负载均衡模式：有状态（如有携带session）和无状态 两种负载均衡方式：硬件均衡和软件均衡 硬件均衡比较简单，通常接入一个设备即可，之后的均衡和故障检测等等都由硬件自动完成。成本较高。 软件均衡则是通过软件来转发各种请求，更加容易的定义转发规则，有较多的开源产品选择。 第四层和第七层 经常在负载均衡中看到第四层和第七层这两个名词。它们实际上是指它们各自工作时所处理的网络协议的层数（使用ISO模型）。 第四层是数据传输层，包括TCP和UDP，第七层则是应用层，通常web中为HTTP应用。如Apache、nginx等支持第七层的均衡，而且可配置性都相当强大，能够适应较复杂的应用。例如可以简单的将流量分担到各个负载机上，也可以定义一套业务规则，将应用划分为不同的池，每个池处理某些固定规则的URL。 对比软件均衡与硬件均衡，可以发现它们各自的优缺点： 1. 硬件均衡成本比较高，软件均衡多数可以使用免费的开源软件来实现。 2. 硬件均衡对于故障检测比软件均衡更加强大、快速。在采用硬件均衡时，一旦某台机器出现故障，马上就可以检测出来并立即屏蔽。 3. 硬件均衡可以快速的添加机器（接入硬件接口即可），而软件均衡除了添加机器外还要添加一些配置信息，以将某些流量导入到新的机器。 &#8230; <a href="http://leaderbird.blogcn.com/articles/%e8%af%b4%e8%af%b4%e5%a4%a7%e5%9e%8b%e9%ab%98%e5%b9%b6%e5%8f%91%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%bd%91%e7%ab%99%e7%9a%84%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>读 《构建可扩展的Web站点》笔记</p>
<p>从目录中就可以看出来, 这是一本超越纯粹代码范畴的书. 涉及到开发工具, 开发方法, 开发过程, 体系结构, 应用分层, 常用web功能举例和注意事项, 性能瓶颈, 扩展并提出一些解决方法, 最后还涉及到性能的监控方法.</p>
<p>扩展Web应用程序</p>
<p>一、概念</p>
<p>简单的来说，如果一个系统可扩展，那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集，并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种：</p>
<p>1. 垂直扩展（stade up），通俗的说就是将某台单一的机器的性能提升的更高，如添加内存、更换更强的处理器等等。</p>
<p>2. 水平扩展（out），通俗的说就是添加新的机器。</p>
<p>对比可以发现，水平扩展比垂直扩展有更强大的扩展性，可以说是“无限”扩展，毕竟单台的机器的性能总是有限的，硬件的技术发展还赶不上web的发展。但同时，水平扩展也来了更高的维护成本。实际中，需要根据具体情况来寻求一个平衡点。</p>
<p>二、冗余</p>
<p>机器总可能会发生故障，而唯一的保证故障状况下服务依然可用的办法就是由多个硬件备份。备份可以分为热备份和冷备份，注意的区别在于数据服务是否在线，数据在线服务的同时进行的备份成为热备份。例如将mysql服务器关闭，然后拷贝数据文件到备份位置，则是典型的冷备份行为。</p>
<p>三、负载均衡</p>
<p>当我们使用了水平扩展之后，我们开始考虑新的问题了，如何将大量的请求“均衡”到我们的扩展机器上呢？</p>
<p>两种负载均衡模式：有状态（如有携带session）和无状态</p>
<p>两种负载均衡方式：硬件均衡和软件均衡</p>
<p>硬件均衡比较简单，通常接入一个设备即可，之后的均衡和故障检测等等都由硬件自动完成。成本较高。</p>
<p>软件均衡则是通过软件来转发各种请求，更加容易的定义转发规则，有较多的开源产品选择。</p>
<p>第四层和第七层</p>
<p>经常在负载均衡中看到第四层和第七层这两个名词。它们实际上是指它们各自工作时所处理的网络协议的层数（使用ISO模型）。</p>
<p>第四层是数据传输层，包括TCP和UDP，第七层则是应用层，通常web中为HTTP应用。如Apache、nginx等支持第七层的均衡，而且可配置性都相当强大，能够适应较复杂的应用。例如可以简单的将流量分担到各个负载机上，也可以定义一套业务规则，将应用划分为不同的池，每个池处理某些固定规则的URL。</p>
<p>对比软件均衡与硬件均衡，可以发现它们各自的优缺点：</p>
<p>1. 硬件均衡成本比较高，软件均衡多数可以使用免费的开源软件来实现。</p>
<p>2. 硬件均衡对于故障检测比软件均衡更加强大、快速。在采用硬件均衡时，一旦某台机器出现故障，马上就可以检测出来并立即屏蔽。</p>
<p>3. 硬件均衡可以快速的添加机器（接入硬件接口即可），而软件均衡除了添加机器外还要添加一些配置信息，以将某些流量导入到新的机器。</p>
<p>4. 软件均衡可以定义非常复杂的业务规则，而硬件均衡在这方面相对较弱。</p>
<p>5. 多数的硬件均衡方案都有捆<u style=display:none>佳节又重阳</u>绑附加的一些服务如HTTPS加速、DOS防火墙等等。</p>
<p>还有一种比较流行的方案：DNS解析。这种方式对解决用户分布在不同地理位置、不同网络的情况有着相当好的效果，每个用户都可以根据自己的网络得到一个较快速的访问IP。缺点也比较明显：DNS更新缓慢，对于实时性的均衡几乎没有什么作用，因为DNS的更新往往需要一两个小时，甚至一两天。</p>
<p>四、使用缓存</p>
<p>使用缓存将某些实时性要求不高的服务结果缓存起来是大型应用解决方案的一个共识，合理的使用缓存将极大的改善应用体验和性能。</p>
<p>常用的几类缓存：</p>
<p>缓存数据：memcached memcachedb</p>
<p>缓存HTTP请求： squid</p>
<p>用户浏览器缓存</p>
<p>说说大型高并发高负载网站的系统架构</p>
<p>发布：倪海涛<br>
来自：BudiChina.com<br>
更新：2010-03-15 11:53:58<br>
转帖：http://www.toplee.com/blog/71.html<br>
摘要：一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了。随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。</p>
<p>前言<br>
鄙人先后在CERNET做过拨号接入，在Yahoo&amp;3721搞过搜索前端，在猫扑处理过mop.com的架构升级，在6.cn视频网站从事开发工作，还在多年的工作中接触和开发过不少大中型网站的模块，因此在大型网站应对高负载和并发的解决方案上有一些积累和经验，希望和大家一起探讨。</p>
<p>一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。</p>
<p>大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。</p>
<p>上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。</p>
<p>1、HTML静态化<br>
其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。</p>
<p>除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。目前很多博客也都实现了静态化，我使用的这个Blog程序WordPress还没有静态化，所以如果面对高负载访问，www.toplee.com一定不能承受</p>
<p>同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。</p>
<p>在进行html静态化的时候可以使用一种折中的方法，就是前端使用动态实现，在一定的策略下进行定时静态化和定时判断调用，这个能实现很多灵活性的操作，我开发的台球网站故人居(www.8zone.cn)就是使用了这样的方法，我通过设定一些html静态化的时间间隔来对动<u style=display:none>帘卷西风</u>态网站内容进行缓存，达到分担大部分的压力到静态页面上，可以应用于中小型网站的架构上。故人居网站的地址：http://www.8zone.cn，顺便提一下，有喜欢台球的朋友多多支持我这个免费网站 <img src='http://leaderbird.blogcn.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley'></p>
<p>2、图片服务器分离<br>
大家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃。</p>
<p>在应用服务器和图片服务器上，可以进行不同的配置优化，比如Apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。</p>
<p>我的台球网站故人居8zone.cn也使用了图片服务器架构上的分离，目前是仅仅是架构上分离，物理上没有分离，由于没有钱买更多的服务器 <img src='http://leaderbird.blogcn.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley'> ，大家可以看到故人居上的图片连接都是类似img.9tmd.com或者img1.9tmd.com的URL。</p>
<p>另外，在处理静态页面或者图片、js等访问方面，可以考虑使用lighttpd代替Apache，它提供了更轻量级和更高效的处理能力。</p>
<p>3、数据库集群和库表散列<br>
大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。</p>
<p>在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。</p>
<p>上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。</p>
<p>4、缓存<br>
缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。</p>
<p>架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的mod_proxy缓存模块，也可以使用外加的Squid进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。</p>
<p>网站程序开发方面的缓存，Linux上提供的Memcached是常用的缓存方案，不少web编程语言都提供memcache访问接口，php、perl、c和java都有，可以在web开发中使用，可以实时或者Cron的把数据、对象等内容进行缓存，策略非常灵活。一些大型社区使用了这样的架构。</p>
<p>另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块和eAccelerator加速和Cache模块，还要知名的Apc、XCache（国人开发的，支持！）php缓存模块，Java就更多了，.net不是很熟悉，相信也肯定有。</p>
<p>5、镜像<br>
镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。</p>
<p>6、负载均衡<br>
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。</p>
<p>负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。另外有关初级的负载均衡DNS轮循和较专业的CDN架构就不多说了。</p>
<p>6.1 硬件四层交换<br>
第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。</p>
<p>在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。</p>
<p>6.2 软件四层交换<br>
大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。</p>
<p>软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。</p>
<p>一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。</p>
<p>6.3 七层交换<br>
大家都知道TCP/IP的七层协议，四层交换是基于传输层的，在这一层只能处理连接的管理，但是无法和业务关联起来，通常只能针对tcp、udp的连接来进行处理，而真正的业务逻辑需要后面的服务器群自己来处理，随着技术的发展，今天，我们在很多高级的应用中出现了七层交换。</p>
<p>七层交换是基于TCP/IP的第七层应用层来实现的，在这一层上，首先我们可以区分出具体的应用，比如HTTP、TELNET、FTP、DNS等等，还能根据应用中传送的内容来进行策略的管理，比如我们有这么两个网站的路径 a.com/music/… 和a.com/photo/… 原来基于四层交换只能把这两个url的请求都分发到后面一组服务器上，但是七层交换可以判断访问的是music/还是photo/路径，然后分别分发到不通的服务器群上，从而实现更灵活的系统架构设计。</p>
<p>当然，七层交换也分硬件和软件的实现方式，在这里我不细说了，硬件有著名的F5、Nortel等，软件有Haproxy等，当然，七层交换的软件目前还是在性能上要远远差别于硬件实现的，要知道，这些硬件都价格不菲</p>
<p>总结：<br>
对于大型网站来说，前面提到的每个方法可能都会被同时使用到，Michael这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/%e8%af%b4%e8%af%b4%e5%a4%a7%e5%9e%8b%e9%ab%98%e5%b9%b6%e5%8f%91%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%bd%91%e7%ab%99%e7%9a%84%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hibernate二级缓存攻略[转]</title>
		<link>http://leaderbird.blogcn.com/articles/hibernate%e4%ba%8c%e7%ba%a7%e7%bc%93%e5%ad%98%e6%94%bb%e7%95%a5%e8%bd%ac.html</link>
		<comments>http://leaderbird.blogcn.com/articles/hibernate%e4%ba%8c%e7%ba%a7%e7%bc%93%e5%ad%98%e6%94%bb%e7%95%a5%e8%bd%ac.html#comments</comments>
		<pubDate>Tue, 21 Feb 2012 02:55:42 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[Hibernate]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/?p=220</guid>
		<description><![CDATA[hibernate二级缓存攻略 <a href="http://leaderbird.blogcn.com/articles/hibernate%e4%ba%8c%e7%ba%a7%e7%bc%93%e5%ad%98%e6%94%bb%e7%95%a5%e8%bd%ac.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://www.iteye.com/topic/18904">hibernate二级缓存攻略</a></strong><br>
我的经验主要来自hibernate2.1版本，基本原理和3.0、3.1是一样的，请原谅我的顽固不化。</p>
<p>hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。</p>
<p>二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是<br>
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider<br>
如果使用查询缓存，加上<br>
hibernate.cache.use_query_cache=true</p>
<p>缓存可以简单的看成一个Map，通过key在缓存里面找value。</p>
<p><strong>Class</strong><strong>的缓存</strong><br>
对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置：<br>
&amp;lt;cache usage="read-write"/&amp;gt;<br>
如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml<br>
&amp;lt;cache maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /&amp;gt;<br>
其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。<br>
每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。<br>
当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。<br>
这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为iterate没有什么用，总是会有1+N的问题。<br>
（题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择若干字段，比iterate第一条select id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是list快。）<br>
如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了</p>
<p><strong>查询缓存</strong><br>
首先需要配置hibernate.cache.use_query_cache=true<br>
如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了<br>
&amp;lt;cache<br>
&nbsp;&nbsp; maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"<br>
&nbsp;&nbsp; timeToLiveSeconds="7200" overflowToDisk="true"/&amp;gt;<br>
&amp;lt;cache<br>
&nbsp;&nbsp; maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/&amp;gt;<br>
然后<br>
query.setCacheable(true);//激活查询缓存<br>
query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选<br>
第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它：<br>
&amp;lt;cache maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /&amp;gt;<br>
如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache</p>
<p>对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。<br>
比如hql：<br>
from Cat c where c.name like ?<br>
生成大致如下的sql：<br>
select * from cat c where c.name like ?<br>
参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）：<br>
select * from cat c where c.name like ? , parameter:tiger%<br>
这样，保证了同样的查询、同样的参数等条件下具有一样的key。<br>
现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。<br>
可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。<br>
<strong>这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是</strong><strong>list</strong><strong>方法也可能遇到</strong><strong>1+N</strong><strong>的问题！</strong>相同条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意了。</p>
<p>另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。</p>
<p>当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？<br>
hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。<br>
当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。<br>
可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。</p>
<p><strong>Collection</strong><strong>缓存</strong><br>
需要在hbm的collection里面设置<br>
&amp;lt;cache usage="read-write"/&amp;gt;<br>
假如class是Cat，collection叫children，那么ehcache里面配置<br>
&amp;lt;cache<br>
&nbsp;&nbsp; maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"<br>
&nbsp;&nbsp; overflowToDisk="true" /&amp;gt;<br>
Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。<br>
这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。</p>
<p><strong>缓存策略</strong><br>
只读缓存（read-only）：没有什么好说的<br>
读/写缓存（read-write）:程序可能要的更新数据<br>
不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好<br>
事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过</p>
<p>读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。<br>
在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。<br>
不严格读写缓存不锁定缓存中的数据。</p>
<p><strong>使用二级缓存的前置条件</strong><br>
你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的，但是据说3.1已经解决了这个问题。<br>
这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。<br>
SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是：<br>
void evict(Class persistentClass)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict all entries from the second-level cache.<br>
void evict(Class persistentClass, Serializable id)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict an entry from the second-level cache.<br>
void evictCollection(String roleName)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict all entries from the second-level cache.<br>
void evictCollection(String roleName, Serializable id)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict an entry from the second-level cache.<br>
void evictQueries()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict any query result sets cached in the default query cache region.<br>
void evictQueries(String cacheRegion)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict any query result sets cached in the named query cache region.<br>
不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用evictQueries(String cacheRegion)移除了3个查询缓存，然后用evict(Class persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？</p>
<p>----------------------------------------------------</p>
<p><strong>总结：</strong><br>
不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。<br>
如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。<br>
在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/hibernate%e4%ba%8c%e7%ba%a7%e7%bc%93%e5%ad%98%e6%94%bb%e7%95%a5%e8%bd%ac.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高并发网站解决方案</title>
		<link>http://leaderbird.blogcn.com/articles/%e9%ab%98%e5%b9%b6%e5%8f%91%e7%bd%91%e7%ab%99%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88.html</link>
		<comments>http://leaderbird.blogcn.com/articles/%e9%ab%98%e5%b9%b6%e5%8f%91%e7%bd%91%e7%ab%99%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88.html#comments</comments>
		<pubDate>Tue, 21 Feb 2012 02:51:48 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[系统架构设计]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/?p=218</guid>
		<description><![CDATA[高并发网站解决方案 一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、webserver、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。 大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。 上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。 1、html静态化 其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统cms，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的cms是必不可少的。 除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像mop的大杂烩就是使用了这样的策略，网易社区等也是如此。 同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。 2、图片服务器分离 大家知道，对于web服务器来说，不管是apache、iis还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置contenttype的时候可以尽量少支持，尽可能少的loadmodule，保证更高的系统消耗和执行效率。 3、数据库集群和库表散列 大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。 在数据库集群方面，很多数据库都有自己的解决方案，oracle、sybase等都有很好的方案，常用的mysql提供的master/slave也是类似的方案，您使用了什么样的db，就参考相应的解决方案来实施即可。 上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用db类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户id进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和id进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。 4、缓存 缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。 架构方面的缓存，对apache比较熟悉的人都能知道apache提供了自己的缓存模块，也可以使用外加的squid模块进行缓存，这两种方式均可以有效的提高apache的访问响应能力。 网站程序开发方面的缓存，linux上提供的memory cache是常用的缓存接口，可以在web开发中使用，比如用java开发的时候就可以调用memorycache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，php有pear的cache模块，java就更多了，.net不是很熟悉，相信也肯定有。 5、镜像 镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如chinanet和edunet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如linux上的rsync等工具。 6、负载均衡 负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。 负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。 硬件四层交换 第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚ip，指向物理服务器。它传输的业务服从的协议多种多样，有http、ftp、nfs、telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在ip世界，业务类型由终端tcp或udp端口地址来决定，在第四层交换中的应用区间则由源端和终端ip地址、tcp和udp端口共同决定。 在硬件四层交换产品领域，有一些知名的产品可以选择，比如alteon、f5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。yahoo中国当初接近2000台服务器使用了三四台alteon就搞定了。 软件四层交换 大家知道了硬件四层交换机的原理后，基于osi模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。 软件四层交换我们可以使用linux上常用的lvs来解决，lvs就是linux virtual server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟vip配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。 一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。 对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。&#160; 一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、webserver、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。 大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。 上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。 1、html静态化其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统cms，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的cms是必不可少的。 除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像mop的大杂烩就是使用了这样的策略，网易社区等也是如此。 同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。 &#8230; <a href="http://leaderbird.blogcn.com/articles/%e9%ab%98%e5%b9%b6%e5%8f%91%e7%bd%91%e7%ab%99%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">高并发网站解决方案</p>
<p>一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、webserver、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。</p>
<p>大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。</p>
<p>上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。</p>
<p>1、html静态化<br>
其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统cms，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的cms是必不可少的。</p>
<p>除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像mop的大杂烩就是使用了这样的策略，网易社区等也是如此。</p>
<p>同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。</p>
<p>2、图片服务器分离<br>
大家知道，对于web服务器来说，不管是apache、iis还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置contenttype的时候可以尽量少支持，尽可能少的loadmodule，保证更高的系统消耗和执行效率。</p>
<p>3、数据库集群和库表散列<br>
大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。</p>
<p>在数据库集群方面，很多数据库都有自己的解决方案，oracle、sybase等都有很好的方案，常用的mysql提供的master/slave也是类似的方案，您使用了什么样的db，就参考相应的解决方案来实施即可。</p>
<p>上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用db类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户id进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和id进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。</p>
<p>4、缓存<br>
缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br>
架构方面的缓存，对apache比较熟悉的人都能知道apache提供了自己的缓存模块，也可以使用外加的squid模块进行缓存，这两种方式均可以有效的提高apache的访问响应能力。<br>
网站程序开发方面的缓存，linux上提供的memory cache是常用的缓存接口，可以在web开发中使用，比如用java开发的时候就可以调用memorycache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，php有pear的cache模块，java就更多了，.net不是很熟悉，相信也肯定有。</p>
<p>5、镜像<br>
镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如chinanet和edunet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如linux上的rsync等工具。</p>
<p>6、负载均衡<br>
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br>
负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br>
硬件四层交换<br>
第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚ip，指向物理服务器。它传输的业务服从的协议多种多样，有http、ftp、nfs、telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在ip世界，业务类型由终端tcp或udp端口地址来决定，在第四层交换中的应用区间则由源端和终端ip地址、tcp和udp端口共同决定。<br>
在硬件四层交换产品领域，有一些知名的产品可以选择，比如alteon、f5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。yahoo中国当初接近2000台服务器使用了三四台alteon就搞定了。</p>
<p>软件四层交换<br>
大家知道了硬件四层交换机的原理后，基于osi模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br>
软件四层交换我们可以使用linux上常用的lvs来解决，lvs就是linux virtual server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟vip配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。</p>
<p>一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。</p>
<p>对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。<span id="_marker">&nbsp;</span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">一个小型的网站，比如个人网站，可以使用最简单的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">html</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">webserver</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、防火墙等各个领域都有了很高的要求，已经不是原来简单的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">html</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">静态网站所能比拟的。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">web</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">1</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">html</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">静态化</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">其实大家都知道，效率最高、消耗最小的就是纯静态化的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">html</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">cms</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">cms</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">是必不可少的。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">mop</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的大杂烩就是使用了这样的策略，网易社区等也是如此。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">同时，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">html</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">html</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">2</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、图片服务器分离</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">大家知道，对于</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">web</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">服务器来说，不管是</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">apache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">iis</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">apache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">在配置</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">contenttype</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的时候可以尽量少支持，尽可能少的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">loadmodule</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">，保证更高的系统消耗和执行效率。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">3</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、数据库集群和库表散列</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">在数据库集群方面，很多数据库都有自己的解决方案，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">oracle</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">sybase</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">等都有很好的方案，常用的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">mysql</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">提供的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">master/slave</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">也是类似的方案，您使用了什么样的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">db</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">，就参考相应的解决方案来实施即可。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">db</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">id</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">sohu</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">id</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">4</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、缓存</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;"><span style="color: #000000;">缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">架构方面的缓存，对</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">apache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">比较熟悉的人都能知道</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">apache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">提供了自己的缓存模块，也可以使用外加的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">squid</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">模块进行缓存，这两种方式均可以有效的提高</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">apache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的访问响应能力。</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">网站程序开发方面的缓存，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">linux</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">上提供的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">memory cache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">是常用的缓存接口，可以在</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">web</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">开发中使用，比如用</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">java</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">开发的时候就可以调用</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">memorycache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">web</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">语言开发的时候，各种语言基本都有自己的缓存模块和方法，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">php</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">有</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">pear</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">cache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">模块，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">java</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">就更多了，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">.net</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">不是很熟悉，相信也肯定有。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">5</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、镜像</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">chinanet</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">和</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">edunet</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">linux</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">上的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">rsync</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">等工具。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">6</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、负载均衡</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;"><span style="color: #000000;">负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;"><span style="color: #000000;">负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;"><span style="color: #000000;">硬件四层交换</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">ip</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">，指向物理服务器。它传输的业务服从的协议多种多样，有</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">http</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">ftp</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">nfs</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">telnet</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">ip</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">世界，业务类型由终端</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">tcp</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">或</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">udp</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">端口地址来决定，在第四层交换中的应用区间则由源端和终端</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">ip</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">地址、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">tcp</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">和</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">udp</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">端口共同决定。</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">在硬件四层交换产品领域，有一些知名的产品可以选择，比如</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">alteon</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">、</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">f5</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">yahoo</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">中国当初接近</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">2000</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">台服务器使用了三四台</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">alteon</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">就搞定了。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;"><span style="color: #000000;">软件四层交换</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">大家知道了硬件四层交换机的原理后，基于</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">osi</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。</span></span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US"><br></span><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">软件四层交换我们可以使用</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">linux</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">上常用的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">lvs</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">来解决，</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">lvs</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">就是</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">linux virtual server</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">，他提供了基于心跳线</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">heartbeat</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">vip</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。</span></span></p>
<p class="MsoNormal" style="text-align: left; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体;" lang="EN-US">squid</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt;">集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。</span></span></p>
<p><span style="color: #000000;"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">squid</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">参数或者</span><span style="font-family: &quot;Arial&quot;,&quot;sans-serif&quot;; font-size: 12pt; mso-font-kerning: 0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;" lang="EN-US">apache</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/%e9%ab%98%e5%b9%b6%e5%8f%91%e7%bd%91%e7%ab%99%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle SQL性能优化</title>
		<link>http://leaderbird.blogcn.com/articles/oracle-sql%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96.html</link>
		<comments>http://leaderbird.blogcn.com/articles/oracle-sql%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96.html#comments</comments>
		<pubDate>Tue, 21 Feb 2012 02:42:46 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/?p=215</guid>
		<description><![CDATA[Oracle SQL性能优化 （1） 选择最有效率的表名顺序(只在基于规则的优化器中有效)： ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名，FROM子句中写在最后的表(基础表 driving table)将被最先处理，在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. （2） WHERE子句中的连接顺序．： ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. （3） SELECT子句中避免使用 ‘ * ‘： ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 （4） 减少访问数据库的次数： ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等； （5） 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 （6） 使用DECODE函数来减少处理时间： &#8230; <a href="http://leaderbird.blogcn.com/articles/oracle-sql%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Oracle SQL性能优化<br>
（1） 选择最有效率的表名顺序(只在基于规则的优化器中有效)：<br>
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名，FROM子句中写在最后的表(基础表 driving table)将被最先处理，在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.<br>
（2） WHERE子句中的连接顺序．：<br>
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.<br>
（3） SELECT子句中避免使用 ‘ * ‘：<br>
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间<br>
（4） 减少访问数据库的次数：<br>
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等；<br>
（5） 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200<br>
（6） 使用DECODE函数来减少处理时间：<br>
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.<br>
（7） 整合简单,无关联的数据库访问：<br>
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)<br>
（8） 删除重复记录：<br>
最高效的删除重复记录方法 ( 因为使用了ROWID)例子：<br>
DELETE FROM EMP E WHERE E.ROWID &gt; (SELECT MIN(X.ROWID)<br>
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);<br>
（9） 用TRUNCATE替代DELETE：<br>
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)<br>
（10） 尽量多使用COMMIT：<br>
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:<br>
COMMIT所释放的资源:<br>
a. 回滚段上用于恢复数据的信息.<br>
b. 被程序语句获得的锁<br>
c. redo log buffer 中的空间<br>
d. ORACLE为管理上述3种资源中的内部花费<br>
（11） 用Where子句替换HAVING子句：<br>
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中，on是最先执行，where次之，having最后，因为on是先把不符合条件的记录过滤后才进行统计，它就可以减少中间运算要处理的数据，按理说应该速度是最快的，where也应该比having快点的，因为它过滤数据后才进行sum，在两个表联接时才用on的，所以在一个表的时候，就剩下where跟having比较了。在这单表查询统计的情况下，如果要过滤的条件没有涉及到要计算字段，那它们的结果是一样的，只是where可以使用rushmore技术，而having就不能，在速度上后者要慢如果要涉及到计算的字段，就表示在没计算之前，这个字段的值是不确定的，根据上篇写的工作流程，where的作用时间是在计算之前就完成的，而having就是在计算后才起作用的，所以在这种情况下，两者的结果会不同。在多表联接查询时，on比where更早起作用。系统首先根据各个表之间的联接条件，把多个表合成一个临时表后，再由where进行过滤，然后再计算，计算完后再由having进行过滤。由此可见，要想过滤条件起到正确的作用，首先要明白这个条件应该在什么时候起作用，然后再决定放在那里<br>
（12） 减少对表的查询：<br>
在含有子查询的SQL语句中,要特别注意减少对表的查询.例子：<br>
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT<br>
TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)<br>
（13） 通过内部函数提高SQL效率.：<br>
复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的<br>
（14） 使用表的别名(Alias)：<br>
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.<br>
（15） 用EXISTS替代IN、用NOT EXISTS替代NOT IN：<br>
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.<br>
例子：<br>
（高效）SELECT * FROM EMP (基础表) WHERE EMPNO &gt; 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')<br>
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO &gt; 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')<br>
（16） 识别'低效执行'的SQL语句：<br>
虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法：<br>
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,<br>
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,<br>
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,<br>
SQL_TEXT<br>
FROM V$SQLAREA<br>
WHERE EXECUTIONS&gt;0<br>
AND BUFFER_GETS &gt; 0<br>
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8<br>
ORDER BY 4 DESC;</p>
<p>（17） 用索引提高效率：<br>
索引是表的一个概念部分,用来提高检索数据的效率，ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.：<br>
ALTER INDEX REBUILD<br>
（18） 用EXISTS替换DISTINCT：<br>
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子：<br>
(低效):<br>
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E<br>
WHERE D.DEPT_NO = E.DEPT_NO<br>
(高效):<br>
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'<br>
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);<br>
（19） sql语句用大写的；因为oracle总是先解析sql语句，把小写的字母转换成大写的再执行<br>
（20） 在java代码中尽量少用连接符“＋”连接字符串！<br>
（21） 避免在索引列上使用NOT 通常，　<br>
我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.<br>
（22） 避免在索引列上使用计算．<br>
WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描．<br>
举例:<br>
低效：<br>
SELECT … FROM DEPT WHERE SAL * 12 &gt; 25000;<br>
高效:<br>
SELECT … FROM DEPT WHERE SAL &gt; 25000/12;<br>
（23） 用&gt;=替代&gt;<br>
高效:<br>
SELECT * FROM EMP WHERE DEPTNO &gt;=4<br>
低效:<br>
SELECT * FROM EMP WHERE DEPTNO &gt;3<br>
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.<br>
（24） 用UNION替换OR (适用于索引列)<br>
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.<br>
高效:<br>
SELECT LOC_ID , LOC_DESC , REGION<br>
FROM LOCATION<br>
WHERE LOC_ID = 10<br>
UNION<br>
SELECT LOC_ID , LOC_DESC , REGION<br>
FROM LOCATION<br>
WHERE REGION = “MELBOURNE”<br>
低效:<br>
SELECT LOC_ID , LOC_DESC , REGION<br>
FROM LOCATION<br>
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”<br>
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.<br>
（25） 用IN来替换OR<br>
这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的．　<br>
低效:<br>
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30<br>
高效<br>
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);<br>
（26） 避免在索引列上使用IS NULL和IS NOT NULL<br>
避免在索引中使用任何可以为空的列，ORACLE将无法使用该索引．对于单列索引，如果列包含空值，索引中将不存在此记录. 对于复合索引，如果每个列都为空，索引中同样不存在此记录.　如果至少有一个列不为空，则记录存在于索引中．举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入). 然而如果所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.<br>
低效: (索引失效)<br>
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;<br>
高效: (索引有效)<br>
SELECT … FROM DEPARTMENT WHERE DEPT_CODE &gt;=0;<br>
（27） 总是使用索引的第一个列：<br>
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则，当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引<br>
（28） 用UNION-ALL 替换UNION ( 如果有可能的话)：<br>
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量<br>
低效：<br>
SELECT ACCT_NUM, BALANCE_AMT<br>
FROM DEBIT_TRANSACTIONS<br>
WHERE TRAN_DATE = '31-DEC-95'<br>
UNION<br>
SELECT ACCT_NUM, BALANCE_AMT<br>
FROM DEBIT_TRANSACTIONS<br>
WHERE TRAN_DATE = '31-DEC-95'<br>
高效:<br>
SELECT ACCT_NUM, BALANCE_AMT<br>
FROM DEBIT_TRANSACTIONS<br>
WHERE TRAN_DATE = '31-DEC-95'<br>
UNION ALL<br>
SELECT ACCT_NUM, BALANCE_AMT<br>
FROM DEBIT_TRANSACTIONS<br>
WHERE TRAN_DATE = '31-DEC-95'<br>
（29） 用WHERE替代ORDER BY：<br>
ORDER BY 子句只在两种严格的条件下使用索引.<br>
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.<br>
ORDER BY中所有的列必须定义为非空.<br>
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.<br>
例如:<br>
表DEPT包含以下列:<br>
DEPT_CODE PK NOT NULL<br>
DEPT_DESC NOT NULL<br>
DEPT_TYPE NULL<br>
低效: (索引不被使用)<br>
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE<br>
高效: (使用索引)<br>
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE &gt; 0<br>
（30） 避免改变索引列的类型.:<br>
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.<br>
假设 EMPNO是一个数值类型的索引列.<br>
SELECT … FROM EMP WHERE EMPNO = ‘123'<br>
实际上,经过ORACLE类型转换, 语句转化为:<br>
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123')<br>
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.<br>
现在,假设EMP_TYPE是一个字符类型的索引列.<br>
SELECT … FROM EMP WHERE EMP_TYPE = 123<br>
这个语句被ORACLE转换为:<br>
SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123<br>
因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型<br>
（31） 需要当心的WHERE子句:<br>
某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.<br>
在下面的例子里, (1)‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) ‘||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) ‘+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.<br>
（32） a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.<br>
b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!<br>
（33） 避免使用耗费资源的操作:<br>
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎<br>
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强<br>
（34） 优化GROUP BY:<br>
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.<br>
低效:<br>
SELECT JOB , AVG(SAL)<br>
FROM EMP<br>
GROUP JOB<br>
HAVING JOB = ‘PRESIDENT'<br>
OR JOB = ‘MANAGER'<br>
高效:<br>
SELECT JOB , AVG(SAL)<br>
FROM EMP<br>
WHERE JOB = ‘PRESIDENT'<br>
OR JOB = ‘MANAGER'<br>
GROUP JOB</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/oracle-sql%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://leaderbird.blogcn.com/articles/hello-world.html</link>
		<comments>http://leaderbird.blogcn.com/articles/hello-world.html#comments</comments>
		<pubDate>Fri, 15 Apr 2011 14:46:27 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/?p=1</guid>
		<description><![CDATA[欢迎使用 WordPress。这是您的第一篇日志。您可以编辑它或是删除它，然后开始写您自己的博客。]]></description>
			<content:encoded><![CDATA[<p>欢迎使用 WordPress。这是您的第一篇日志。您可以编辑它或是删除它，然后开始写您自己的博客。</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/hello-world.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>eclipse 格式化代码 不换行</title>
		<link>http://leaderbird.blogcn.com/articles/eclipse-%e6%a0%bc%e5%bc%8f%e5%8c%96%e4%bb%a3%e7%a0%81-%e4%b8%8d%e6%8d%a2%e8%a1%8c.html</link>
		<comments>http://leaderbird.blogcn.com/articles/eclipse-%e6%a0%bc%e5%bc%8f%e5%8c%96%e4%bb%a3%e7%a0%81-%e4%b8%8d%e6%8d%a2%e8%a1%8c.html#comments</comments>
		<pubDate>Mon, 29 Jun 2009 00:00:00 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/diary,26510770.shtml</guid>
		<description><![CDATA[eclipse 格式化代码 不换行 &#160; 每次用Eclipse自带的Ctrl+shift+f格式化代码时，如果原来的一行代码大于80列，Eclipse就会自动换为多行，这点个人感觉不是很舒服，简单试了一下，通过以下方式可以修改： &#160;&#160;&#160;&#160;1、preferences-&#62;Java-&#62;Code&#160;Style-&#62;Code&#160;Formatter-&#62;Show... ，打开之后，选择“Line Wrapping”选项卡，在“Maximun line width”指定大于多少列时换行。 &#160;&#160;&#160;&#160;2、还是在“Line Wrapping”选项卡中，能过选择"Line Wrapping policy"可以指定构造函数、方法体等的换行情况。 &#160;&#160;&#160;&#160;不过，SUN推荐的编码风格默认是80列换行。如下图所示 &#160;]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" align="center"><font color="#000000"><span lang="EN-US">eclipse</span> <span>格式化代码</span> <span>不换行</span></font></p>
<br>
<p class="MsoNormal"><span lang="EN-US"><font color="#000000">&nbsp;</font></span></p>
<br>
<p class="MsoNormal"><font color="#000000"><span>每次用</span><span lang="EN-US">Eclipse</span><span>自带的</span><span lang="EN-US">Ctrl+shift+f</span><span>格式化代码时，如果原来的一行代码大于</span><span lang="EN-US">80</span><span>列，</span><span lang="EN-US">Eclipse</span><span>就会自动换为多行，这点个人感觉不是很舒服，简单试了一下，通过以下方式可以修改：</span></font><span lang="EN-US"><br>
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;1</font></span><font color="#000000"><span>、</span><span lang="EN-US">preferences-&gt;Java-&gt;Code&nbsp;Style-&gt;Code&nbsp;Formatter-&gt;Show...</span> <span>，打开之后，选择</span><span lang="EN-US">“Line Wrapping”</span><span>选项卡，在</span><span lang="EN-US">“Maximun line width”</span><span>指定大于多少列时换行。</span></font><span lang="EN-US"><br>
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;2</font></span><font color="#000000"><span>、还是在</span><span lang="EN-US">“Line Wrapping”</span><span>选项卡中，能过选择</span><span lang="EN-US">"Line Wrapping policy"</span><span>可以指定构造函数、方法体等的换行情况。</span></font><span lang="EN-US"><br>
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font color="#000000"><span>不过，</span><span lang="EN-US">SUN</span><span>推荐的编码风格默认是</span><span lang="EN-US">80</span><span>列换行。如下图所示</span></font></p>
<br>
<p class="MsoNormal"><span lang="EN-US"><font color="#000000">&nbsp;</font></span></p>
<br>
<p class="MsoNormal"></p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/eclipse-%e6%a0%bc%e5%bc%8f%e5%8c%96%e4%bb%a3%e7%a0%81-%e4%b8%8d%e6%8d%a2%e8%a1%8c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript 获取客户端计算机硬件及系统信息（转）</title>
		<link>http://leaderbird.blogcn.com/articles/javascript-%e8%8e%b7%e5%8f%96%e5%ae%a2%e6%88%b7%e7%ab%af%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%a1%ac%e4%bb%b6%e5%8f%8a%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af%ef%bc%88%e8%bd%ac%ef%bc%89.html</link>
		<comments>http://leaderbird.blogcn.com/articles/javascript-%e8%8e%b7%e5%8f%96%e5%ae%a2%e6%88%b7%e7%ab%af%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%a1%ac%e4%bb%b6%e5%8f%8a%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af%ef%bc%88%e8%bd%ac%ef%bc%89.html#comments</comments>
		<pubDate>Mon, 04 May 2009 00:00:00 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/diary,25244294.shtml</guid>
		<description><![CDATA[JavaScript 获取客户端计算机硬件及系统信息 通过WMI来实现获取客户端计算机硬件及系统信息: 1//系统信息获取 2function getSysInfo(){ 3 var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 4 var service = locator.ConnectServer("."); 5 //CPU信息 6 var cpu = new Enumerator (service.ExecQuery("SELECT * FROM Win32_Processor")).item(); 7 var cpuType=cpu.Name,hostName=cpu.SystemName; 8 //内存信息 9 var memory = new &#8230; <a href="http://leaderbird.blogcn.com/articles/javascript-%e8%8e%b7%e5%8f%96%e5%ae%a2%e6%88%b7%e7%ab%af%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%a1%ac%e4%bb%b6%e5%8f%8a%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af%ef%bc%88%e8%bd%ac%ef%bc%89.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1><font size="2">JavaScript 获取客户端计算机硬件及系统信息</font><br>
<font size="2">通过WMI来实现获取客户端计算机硬件及系统信息:<br>
<br>
1//系统信息获取<br>
2function getSysInfo(){<br>
3 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");<br>
4 var service = locator.ConnectServer(".");<br>
5 //CPU信息<br>
6 var cpu = new Enumerator (service.ExecQuery("SELECT * FROM Win32_Processor")).item();<br>
7 var cpuType=cpu.Name,hostName=cpu.SystemName;<br>
8 //内存信息<br>
9 var memory = new Enumerator (service.ExecQuery("SELECT * FROM Win32_PhysicalMemory"));<br>
10 for (var mem=[],i=0; !memory.atEnd(); memory.moveNext()) mem[i++]={cap:memory.item().Capacity/1024/1024,speed:memory.item().Speed}<br>
11 //系统信息<br>
12 var system=new Enumerator (service.ExecQuery("SELECT * FROM Win32_ComputerSystem")).item();<br>
13 var physicMenCap=Math.ceil(system.TotalPhysicalMemory/1024/1024),curUser=system.UserName,cpuCount=system.NumberOfProcessors<br>
14<br>
15 return {cpuType:cpuType,cpuCount:cpuCount,hostName:hostName,curUser:curUser,memCap:physicMenCap,mem:mem}<br>
16}<br>
<br>
代码实现主要包括这几部分：<br>
<br>
先通过new ActiveXObject ("WbemScripting.SWbemLocator"); 访问到WbemScripting对象。<br>
通过locator.ConnectServer("."); 连接我们本地电脑（.代表本地电脑，当然<br>
也可以访问其他计算机）。<br>
通过service.ExecQuery("SELECT * FROM Win32_Processor")这个类似sql的语句（其实系统信息也是存储在计算中一个类似数据库的文件中）获取我们需要的对象的记录集。<br>
通过new Enumerator来创建一个可枚举的对象，下面就可以遍历取信息了。<br>
注意：运行的前提是要修改浏览器安全设置，“允许对未标记为可安全执行的ActiveX<br>
脚本的运行”。<br>
<br>
<br>
这里主要取了CPU、内存及系统用户几个信息，大家利用WMI的API或者借助JSEDIT获取<br>
到更多的信息。下面列出了常用信息的类：<br>
<br>
Win32_Processor // CPU 处理器<br>
<br>
Win32_PhysicalMemory // 物理内存<br>
<br>
Win32_Keyboard // 键盘<br>
<br>
Win32_PointingDevice // 点输入设备，如鼠标<br>
<br>
Win32_DiskDrive // 硬盘驱动器<br>
<br>
Win32_CDROMDrive // 光盘驱动器<br>
<br>
Win32_BaseBoard // 主板<br>
<br>
Win32_BIOS // BIOS 芯片<br>
<br>
Win32_ParallelPort // 并口<br>
<br>
Win32_SerialPort // 串口<br>
<br>
Win32_SoundDevice // 多媒体设置<br>
<br>
Win32_USBController // USB 控制器<br>
<br>
Win32_NetworkAdapter // 网络适配器<br>
<br>
Win32_NetworkAdapterConfiguration // 网络适配器设置<br>
<br>
Win32_Printer // 打印机<br>
<br>
Win32_PrinterConfiguration // 打印机设置<br>
<br>
Win32_PrintJob // 打印机任务<br>
<br>
Win32_TCPIPPrinterPort // 打印机端口<br>
<br>
Win32_POTSModem // MODEM<br>
<br>
Win32_POTSModemToSerialPort // MODEM 端口<br>
<br>
Win32_DesktopMonitor // 显示器<br>
<br>
Win32_VideoController // 显卡细节。<br>
<br>
Win32_VideoSettings // 显卡支持的显示模式。<br>
<br>
Win32_TimeZone // 时区<br>
<br>
Win32_SystemDriver // 驱动程序<br>
<br>
Win32_DiskPartition // 磁盘分区<br>
<br>
Win32_LogicalDisk // 逻辑磁盘<br>
<br>
Win32_LogicalMemoryConfiguration // 逻辑内存配置<br>
<br>
Win32_PageFile // 系统页文件信息<br>
<br>
Win32_PageFileSetting // 页文件设置<br>
<br>
Win32_BootConfiguration // 系统启动配置<br>
<br>
Win32_OperatingSystem // 操作系统信息<br>
<br>
Win32_StartupCommand // 系统自动启动程序<br>
<br>
Win32_Service // 系统安装的服务<br>
<br>
Win32_Group // 系统管理组<br>
<br>
Win32_GroupUser // 系统组帐号<br>
<br>
Win32_UserAccount // 用户帐号<br>
<br>
Win32_Process // 系统进程<br>
<br>
Win32_Thread // 系统线程<br>
<br>
Win32_Share // 共享<br>
<br>
Win32_NetworkClient // 已安装的网络客户端<br>
<br>
Win32_NetworkProtocol // 已安装的网络协议<br>
<br>
WMI Win32类的完整信息及详细列表请参考MSDN:<br>
http://msdn2.microsoft.com/en-us/library/aa394084(VS.85).aspx<br>
示例：<br>
<br>
<br>
1function button1_onclick() {//cpu 信息<br>
2 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");<br>
3 var service = locator.ConnectServer(".");<br>
4 var properties = service.ExecQuery("SELECT * FROM Win32_Processor");<br>
5 var e = new Enumerator (properties);<br>
6 document.write("＜table border=1＞");<br>
7 for (; !e.atEnd(); e.moveNext ())<br>
8 {<br>
9 var p = e.item ();<br>
10 document.write("＜tr＞");<br>
11 document.write("＜td＞" + p.Caption + "＜/td＞");<br>
12 document.write("＜td＞" + p.DeviceID + "＜/td＞");<br>
13 document.write("＜td＞" + p.Name + "＜/td＞");<br>
14 document.write("＜td＞" + p.CpuStatus + "＜/td＞");<br>
15 document.write("＜td＞" + p.Availability + "＜/td＞");<br>
16 document.write("＜td＞" + p.Level + "＜/td＞");<br>
17 document.write("＜td＞" + p.ProcessorID + "＜/td＞");<br>
18 document.write("＜td＞" + p.SystemName + "＜/td＞");<br>
19 document.write("＜td＞" + p.ProcessorType + "＜/td＞");<br>
20 document.write("＜/tr＞");<br>
21 }<br>
22 document.write("＜/table＞");<br>
23}<br>
24<br>
25function Button2_onclick() {//CD-ROM 信息<br>
26 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");<br>
27 var service = locator.ConnectServer(".");<br>
28 var properties = service.ExecQuery("SELECT * FROM Win32_CDROMDrive");<br>
29 var e = new Enumerator (properties);<br>
30 document.write("＜table border=1＞");<br>
31 for (; !e.atEnd(); e.moveNext ())<br>
32 {<br>
33 var p = e.item ();<br>
34 document.write("＜tr＞");<br>
35 document.write("＜td＞" + p.Caption + "＜/td＞");<br>
36 document.write("＜td＞" + p.Description + "＜/td＞");<br>
37 document.write("＜td＞" + p.Drive + "＜/td＞");<br>
38 document.write("＜td＞" + p.Status + "＜/td＞");<br>
39 document.write("＜td＞" + p.MediaLoaded + "＜/td＞");<br>
40 document.write("＜/tr＞");<br>
41 }<br>
42 document.write("＜/table＞");<br>
43}<br>
44<br>
45function Button3_onclick() {//键盘信息<br>
46 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");<br>
47 var service = locator.ConnectServer(".");<br>
48 var properties = service.ExecQuery("SELECT * FROM Win32_Keyboard");<br>
49 var e = new Enumerator (properties);<br>
50 document.write("＜table border=1＞");<br>
51 for (; !e.atEnd(); e.moveNext ())<br>
52 {<br>
53 var p = e.item ();<br>
54 document.write("＜tr＞");<br>
55 document.write("＜td＞" + p.Description + "＜/td＞");<br>
56 document.write("＜td＞" + p.Name + "＜/td＞");<br>
57 document.write("＜td＞" + p.Status + "＜/td＞");<br>
58 document.write("＜/tr＞");<br>
59 }<br>
60 document.write("＜/table＞");<br>
61}<br>
62<br>
63function Button4_onclick() {//主板信息<br>
64 var locator = new ActiveXObject ("WbemScripting.SWbemLocator");<br>
65 var service = locator.ConnectServer(".");<br>
66 var properties = service.ExecQuery("SELECT * FROM Win32_BaseBoard");<br>
67 var e = new Enumerator (properties);<br>
68 document.write("＜table border=1＞");<br>
69 for (; !e.atEnd(); e.moveNext ())<br>
70 {<br>
71 var p = e.item ();<br>
72 document.write("＜tr＞");<br>
73 document.write("＜td＞" + p.HostingBoard + "＜/td＞");<br>
74 document.write("＜td＞" + p.Manufacturer + "＜/td＞");<br>
75 document.write("＜td＞" + p.PoweredOn + "＜/td＞");<br>
76 document.write("＜td＞" + p.Product + "＜/td＞");<br>
77 document.write("＜td＞" + p.SerialNumber + "＜/td＞");<br>
78 document.write("＜td＞" + p.Version + "＜/td＞");<br>
79 document.write("＜/tr＞");<br>
80 }<br>
81 document.write("＜/table＞");<br>
82}<br>
83<br>
84</font></h1>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/javascript-%e8%8e%b7%e5%8f%96%e5%ae%a2%e6%88%b7%e7%ab%af%e8%ae%a1%e7%ae%97%e6%9c%ba%e7%a1%ac%e4%bb%b6%e5%8f%8a%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af%ef%bc%88%e8%bd%ac%ef%bc%89.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>中庸之道</title>
		<link>http://leaderbird.blogcn.com/articles/%e4%b8%ad%e5%ba%b8%e4%b9%8b%e9%81%93.html</link>
		<comments>http://leaderbird.blogcn.com/articles/%e4%b8%ad%e5%ba%b8%e4%b9%8b%e9%81%93.html#comments</comments>
		<pubDate>Mon, 27 Apr 2009 00:00:00 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[思想与生活]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/diary,25070962.shtml</guid>
		<description><![CDATA[中庸之道. &#160;什么都抵抗不了时间和距离,&#160; 所以冷静智慧的头脑生活, 不要任性挥霍. 把自己和别人,都闹的那么苦大仇深. &#160;经历了一些事情,我才知道,诚能化恨,爱能化仇,忠能得爱,勇能得荣. &#160;你在别人的脸上,看到的是自己的表情,你在别人的心里,倒映着自己的心. &#160;你的人际,都是自己经营的结果,不要指责别人, &#160;先问自己爱别人多少,付出多少爱,达不达别人的标. &#160;恨,怨,只会使人更丑恶. 也使彼此离得更远. &#160;了解对方并非为了远离对方，而是为了在一条艰辛漫长的的路上，配合温暖的携手走得更好、更顺. &#160;只要有心,任何人都有给人幸福的能力, 你只要把握好自己能给的,和人家想要的那一部分就够了. &#160;目前的人际,是你自己处理的结果,就如事业,不知道未来, 我们也要有信心的去努力和维护. &#160;如果计较太多得失,注定裹足不前,一无所获. &#160;输得起的人,才有赢的可能. &#160;有首歌曲《传说》里的词，那句“惟一确定的说法，我来过”， &#160;不只是某个人，所有的人物，在时间和记录的侵蚀下，大多都很难看到原貌，也很难揣测细节。 &#160;即便是再高明的历史学者，唯一能完全确定的就是，历史上有这个人，他（她）来过。至于其他的，就尽数付诸流水吧。因此,看淡得失,看淡别人的传说. &#160;你表演得再好赢得满堂才如何?你落落寡欢寂寥又如何? &#160;公平的有限的生命岁月里, 就让一切归于无言,归于尘土,归于天地间. &#160;走牛B的路，让傻B去说吧！有限的生命里,能够做到无悔,足矣. &#160;到老时,问自己: 你真正的爱过一个人么?全心全力的.&#160; 你真正的为自己想过的生活付出过么?不遗余力的. 如果都是肯定的,那么是多么无悔的人生啊! &#160;决定一个人本质的，不是他作了什么，而是他不做什么. &#160;心平常，自非凡。 &#160;做人不要那么小气, 多付出点怎么了? 只要保护好自己,在忍受范围之内,让别人占点便宜又有什么关系呢? &#160;其实人心都是肉长的, 你付出了没回报或是没被重视,不代表你不好. 而是你的付出不达别人的标,或者那人有问题. &#160;友好,从微笑开始. 你经营什么,就会得到什么,经营友情,就会收获快乐. &#160; &#8230; <a href="http://leaderbird.blogcn.com/articles/%e4%b8%ad%e5%ba%b8%e4%b9%8b%e9%81%93.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>中庸之道.<br>
&nbsp;什么都抵抗不了时间和距离,&nbsp; 所以冷静智慧的头脑生活, 不要任性挥霍. 把自己和别人,都闹的那么苦大仇深.<br>
&nbsp;经历了一些事情,我才知道,诚能化恨,爱能化仇,忠能得爱,勇能得荣.<br>
&nbsp;你在别人的脸上,看到的是自己的表情,你在别人的心里,倒映着自己的心.<br>
&nbsp;你的人际,都是自己经营的结果,不要指责别人,<br>
&nbsp;先问自己爱别人多少,付出多少爱,达不达别人的标.<br>
&nbsp;恨,怨,只会使人更丑恶. 也使彼此离得更远.<br>
&nbsp;了解对方并非为了远离对方，而是为了在一条艰辛漫长的的路上，配合温暖的携手走得更好、更顺.<br>
&nbsp;只要有心,任何人都有给人幸福的能力, 你只要把握好自己能给的,和人家想要的那一部分就够了.<br>
&nbsp;目前的人际,是你自己处理的结果,就如事业,不知道未来, 我们也要有信心的去努力和维护.<br>
&nbsp;如果计较太多得失,注定裹足不前,一无所获.<br>
&nbsp;输得起的人,才有赢的可能.<br>
&nbsp;有首歌曲《传说》里的词，那句“惟一确定的说法，我来过”，<br>
&nbsp;不只是某个人，所有的人物，在时间和记录的侵蚀下，大多都很难看到原貌，也很难揣测细节。<br>
&nbsp;即便是再高明的历史学者，唯一能完全确定的就是，历史上有这个人，他（她）来过。至于其他的，就尽数付诸流水吧。因此,看淡得失,看淡别人的传说.<br>
&nbsp;你表演得再好赢得满堂才如何?你落落寡欢寂寥又如何?<br>
&nbsp;公平的有限的生命岁月里, 就让一切归于无言,归于尘土,归于天地间.</p>
<br>
<p><br>
&nbsp;走牛B的路，让傻B去说吧！有限的生命里,能够做到无悔,足矣.<br>
&nbsp;到老时,问自己: 你真正的爱过一个人么?全心全力的.&nbsp; 你真正的为自己想过的生活付出过么?不遗余力的. 如果都是肯定的,那么是多么无悔的人生啊!</p>
<br>
<p>&nbsp;决定一个人本质的，不是他作了什么，而是他不做什么.</p>
<br>
<p>&nbsp;心平常，自非凡。<br>
&nbsp;做人不要那么小气, 多付出点怎么了? 只要保护好自己,在忍受范围之内,让别人占点便宜又有什么关系呢?<br>
&nbsp;其实人心都是肉长的, 你付出了没回报或是没被重视,不代表你不好. 而是你的付出不达别人的标,或者那人有问题.<br>
&nbsp;友好,从微笑开始. 你经营什么,就会得到什么,经营友情,就会收获快乐.<br>
&nbsp; 爱过才知情深,醉过才知酒浓. 有时候,只有深爱过,才会明白--- 爱到深处无怨由.</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/%e4%b8%ad%e5%ba%b8%e4%b9%8b%e9%81%93.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hibernate3.0 的批量删除和批量修改</title>
		<link>http://leaderbird.blogcn.com/articles/hibernate3-0-%e7%9a%84%e6%89%b9%e9%87%8f%e5%88%a0%e9%99%a4%e5%92%8c%e6%89%b9%e9%87%8f%e4%bf%ae%e6%94%b9.html</link>
		<comments>http://leaderbird.blogcn.com/articles/hibernate3-0-%e7%9a%84%e6%89%b9%e9%87%8f%e5%88%a0%e9%99%a4%e5%92%8c%e6%89%b9%e9%87%8f%e4%bf%ae%e6%94%b9.html#comments</comments>
		<pubDate>Mon, 27 Apr 2009 00:00:00 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[Hibernate]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/diary,25070935.shtml</guid>
		<description><![CDATA[//批量删除 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer where name = ldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close(); &#160; //批量修改 Session session = sessionFactory.openSession(); Transaction tx = &#8230; <a href="http://leaderbird.blogcn.com/articles/hibernate3-0-%e7%9a%84%e6%89%b9%e9%87%8f%e5%88%a0%e9%99%a4%e5%92%8c%e6%89%b9%e9%87%8f%e4%bf%ae%e6%94%b9.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><br>
//批量删除<br>
Session session = sessionFactory.openSession();<br>
Transaction tx = session.beginTransaction();<br>
String hqlDelete = "delete Customer where name = <img src='http://leaderbird.blogcn.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley'> ldName";<br>
int deletedEntities = s.createQuery( hqlDelete )<br>
.setString( "oldName", oldName )<br>
.executeUpdate();<br>
tx.commit();<br>
session.close(); &nbsp;</p>
<br>
<p>//批量修改<br>
Session session = sessionFactory.openSession();<br>
Transaction tx = session.beginTransaction();<br>
String hqlUpdate = "update Customer set name = :newName where name = <img src='http://leaderbird.blogcn.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley'> ldName";<br>
int updatedEntities = s.createQuery( hqlUpdate )<br>
.setString( "newName", newName )<br>
.setString( "oldName", oldName )<br>
.executeUpdate();<br>
tx.commit();<br>
session.close();</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/hibernate3-0-%e7%9a%84%e6%89%b9%e9%87%8f%e5%88%a0%e9%99%a4%e5%92%8c%e6%89%b9%e9%87%8f%e4%bf%ae%e6%94%b9.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>将已发送出去的邮件收回-Outlook技巧</title>
		<link>http://leaderbird.blogcn.com/articles/%e5%b0%86%e5%b7%b2%e5%8f%91%e9%80%81%e5%87%ba%e5%8e%bb%e7%9a%84%e9%82%ae%e4%bb%b6%e6%94%b6%e5%9b%9e-outlook%e6%8a%80%e5%b7%a7.html</link>
		<comments>http://leaderbird.blogcn.com/articles/%e5%b0%86%e5%b7%b2%e5%8f%91%e9%80%81%e5%87%ba%e5%8e%bb%e7%9a%84%e9%82%ae%e4%bb%b6%e6%94%b6%e5%9b%9e-outlook%e6%8a%80%e5%b7%a7.html#comments</comments>
		<pubDate>Mon, 13 Apr 2009 00:00:00 +0000</pubDate>
		<dc:creator>leaderbird</dc:creator>
				<category><![CDATA[办公软件]]></category>

		<guid isPermaLink="false">http://leaderbird.blogcn.com/diary,24649073.shtml</guid>
		<description><![CDATA[如果你长期使用e-mail，肯定会在某些时候发出了你原本不想发出的邮件。在有些情况下，使用Outlook可以收回这些邮件。这一功能有几条重要的限制条件： 　　1、首先必须是在使用Exchange服务器的环境下; 　　2、收件人必须使用Outlook并登录到服务器上; 　　3、你发出的邮件已到达收件人的收件箱但还没有被阅读。 　　尽管有这么多限制，但它的确有效，值得一试。 　　为了删除或修改已发送的邮件，你需要到“已发送的邮件”文件夹中打开该邮件。在邮件窗口中，选择“动作”-&#62;“撤回该邮件”。接下去，根据你自己的需要选择“删除该邮件的未读副本”或者“删除未读副本并用新邮件替换”。如果你选择用新邮件替换，选“确定”，并书写新邮件。为了了解删除或替换操作是否顺利完成，你还应把“告诉我对每个收件人的撤回操作是成功还是失败”勾选上。]]></description>
			<content:encoded><![CDATA[<p>如果你长期使用e-mail，肯定会在某些时候发出了你原本不想发出的邮件。在有些情况下，使用Outlook可以收回这些邮件。这一功能有几条重要的限制条件：<br></p>
<p>　　1、首先必须是在使用Exchange服务器的环境下;</p>
<br>
<p>　　2、收件人必须使用<a href="http://www.uuxi.cn/html/news/mail-client/Outlook/index.html">Outlook</a>并登录到服务器上;</p>
<br>
<p>　　3、你发出的邮件已到达收件人的收件箱但还没有被阅读。</p>
<br>
<p>　　尽管有这么多限制，但它的确有效，值得一试。</p>
<br>
<p>　　为了删除或修改已发送的邮件，你需要到“已发送的邮件”文件夹中打开该邮件。在邮件窗口中，选择“动作”-&gt;“撤回该邮件”。接下去，根据你自己的需要选择“删除该邮件的未读副本”或者“删除未读副本并用新邮件替换”。如果你选择用新邮件替换，选“确定”，并书写新邮件。为了了解删除或替换操作是否顺利完成，你还应把“告诉我对每个收件人的撤回操作是成功还是失败”勾选上。</p>
]]></content:encoded>
			<wfw:commentRss>http://leaderbird.blogcn.com/articles/%e5%b0%86%e5%b7%b2%e5%8f%91%e9%80%81%e5%87%ba%e5%8e%bb%e7%9a%84%e9%82%ae%e4%bb%b6%e6%94%b6%e5%9b%9e-outlook%e6%8a%80%e5%b7%a7.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

