<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[我们的生活充满阳光]]></title>
<link>http://www.net0577.com/</link>
<description><![CDATA[让我们的生活充满阳光,心情永远愉快!]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[xdf1159@126.com(孤竹无名)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>我们的生活充满阳光</title> 
	<url>http://www.net0577.com/images/logos.gif</url> 
	<link>http://www.net0577.com/</link> 
	<description>我们的生活充满阳光</description> 
</image>

			<item>
			<link>http://www.net0577.com/default.asp?id=166</link>
			<title><![CDATA[xml文件操作小结（3）－－－sel&#101;ctsinglenode方法中的xpath]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Wed,07 Mar 2012 15:10:52 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=166</guid>	
		<description><![CDATA[最常见的XML数据类型有：Element,&nbsp;Attribute，Comment,&nbsp;Text.&nbsp;<br/>&nbsp;&nbsp;Element,&nbsp;指形如&lt;Name&gt;Tom&lt;Name&gt;的节点。它可以包括：Element,&nbsp;Text,&nbsp;Comment,&nbsp;ProcessingInstruction,&nbsp;CDATA,&nbsp;and&nbsp;EntityReference.&nbsp;<br/>&nbsp;&nbsp;Attribute,&nbsp;指在&lt;Employee&nbsp;id=”12345”&gt;中的粗体部分。&nbsp;<br/>&nbsp;&nbsp;Comment，指形如：&lt;!--&nbsp;my&nbsp;comment&nbsp;--&gt;&nbsp;的节点。&nbsp;<br/>&nbsp;&nbsp;Text，指在&lt;Name&gt;Tom&lt;Name&gt;的粗体部分。&nbsp;<br/>&nbsp;&nbsp;在XML中，可以用XmlNode对象来参照各种XML数据类型。&nbsp;<br/>&nbsp;&nbsp;2.1&nbsp;查询已知绝对路径的节点（集）&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objDoc.Sel&#101;ctNodes(“Company/Department/Employees/Employee”)&nbsp;<br/>&nbsp;&nbsp;或者&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objNode.Sel&#101;ctNodes(“/Company/Department/Employees/Employee”)&nbsp;<br/>&nbsp;&nbsp;以上两种方法可返回一个NodeList对象，如果要返回单个节点可使用Sel&#101;ctSingleNode方法，该方法如果查询到一个或多个节点，返回第一个节点；如果没有查询的任何节点返回&nbsp;Nothing。例如：&nbsp;<br/>&nbsp;&nbsp;objNode&nbsp;=&nbsp;objNode.Sel&#101;ctSingleNode(“/Company/Department/Employees/Employee”)&nbsp;<br/>&nbsp;&nbsp;If&nbsp;Not&nbsp;(objNode&nbsp;is&nbsp;Nothing)&nbsp;then&nbsp;<br/>&nbsp;&nbsp;&nbsp;‘-&nbsp;Do&nbsp;process&nbsp;<br/>&nbsp;&nbsp;End&nbsp;If&nbsp;<br/>&nbsp;&nbsp;2.2&nbsp;查询已知相对路径的节点（集）&nbsp;<br/>&nbsp;&nbsp;可使用类似于文件路径的相对路径的方式来查询XML的数据&nbsp;<br/>&nbsp;&nbsp;objNode&nbsp;=&nbsp;objDoc.Sel&#101;ctSingleNode(“Company/Department”)&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objNode.Sel&#101;ctNodes(“../Department)&nbsp;<br/>&nbsp;&nbsp;objNode&nbsp;=&nbsp;objNode.Sel&#101;ctNode(“Employees/Employee”)&nbsp;<br/>&nbsp;&nbsp;2.3&nbsp;查询已知元素名的节点（集）&nbsp;<br/>&nbsp;&nbsp;在使用不规则的层次文档时，由于不知道中间层次的元素名，可使用//符号来越过中间的节点，查询其子，孙或多层次下的其他所有元素。例如：&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objDoc.Sel&#101;ctNodes(“Company//Employee”)&nbsp;<br/>&nbsp;&nbsp;2.4&nbsp;查询属性（attribute）节点&nbsp;<br/>&nbsp;&nbsp;以上的各种方法都返回元素（element)节点（集），返回属性（attribute），只需要采用相应的方法，在属性名前加一个@符号即可，例如：&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objDoc.Sel&#101;ctNodes(“Company/Department/Employees/Employee/@id”)&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objDoc.Sel&#101;ctNodes(“Company//@id”)&nbsp;<br/>&nbsp;&nbsp;2.5&nbsp;查询Text节点&nbsp;<br/>&nbsp;&nbsp;使用text()来获取Text节点。&nbsp;<br/>&nbsp;&nbsp;objNode&nbsp;=&nbsp;objDoc.Sel&#101;ctSingleNode(“Company/Department/Deparmt_Name/text()”)&nbsp;<br/>&nbsp;&nbsp;2.6&nbsp;查询特定条件的节点&nbsp;<br/>&nbsp;&nbsp;使用[]符号来查询特定条件的节点。例如：&nbsp;<br/>&nbsp;&nbsp;a.&nbsp;返回id号为&nbsp;10102的Employee节点&nbsp;<br/>&nbsp;&nbsp;&nbsp;objNode&nbsp;=&nbsp;objDoc.Sel&#101;ctSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”)&nbsp;<br/>&nbsp;&nbsp;b.&nbsp;返回Name为Zhang&nbsp;Qi的Name&nbsp;节点&nbsp;<br/>&nbsp;&nbsp;&nbsp;objNode&nbsp;=&nbsp;objDoc.Sel&#101;ctSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang&nbsp;Qi’]”)&nbsp;<br/>&nbsp;&nbsp;c.&nbsp;返回部门含有职员22345的部门名称节点&nbsp;<br/>&nbsp;&nbsp;objNode&nbsp;=&nbsp;objDoc.Sel&#101;ctSingleNode(&#34;Company/Department[Employees/Employee/@id=&#39;22345&#39;]/Department_Name&#34;)&nbsp;<br/>&nbsp;&nbsp;2.7&nbsp;查询多重模式的节点&nbsp;<br/>&nbsp;&nbsp;使用&nbsp;|&nbsp;符号可以获得多重模式的节点。例如：&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objDoc.Sel&#101;ctNodes(“Company/Department/Department_Name&nbsp;|&nbsp;Company/Department/Manager”)&nbsp;<br/>&nbsp;&nbsp;2.8&nbsp;查询任意子节点&nbsp;<br/>&nbsp;&nbsp;使用*符号可以返回当前节点的所有子节点。&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objDoc.Sel&#101;ctNodes(“Company/*/Manager)&nbsp;<br/>&nbsp;&nbsp;或者&nbsp;<br/>&nbsp;&nbsp;objNodeList&nbsp;=&nbsp;objNode.ChildNodes&nbsp;<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;3&nbsp;XML数据的编辑&nbsp;<br/>&nbsp;&nbsp;3.1&nbsp;增加一个元素的属性（attribute）节点&nbsp;<br/>&nbsp;&nbsp;Dim&nbsp;objNodeAttr&nbsp;As&nbsp;XmlNode&nbsp;<br/>&nbsp;&nbsp;&nbsp;objNodeAttr&nbsp;=&nbsp;objDoc.Cr&#101;ateAttribute(&#34;id&#34;,&nbsp;Nothing)&nbsp;<br/>&nbsp;&nbsp;&nbsp;objNodeAttr.InnerXml&nbsp;=&nbsp;&#34;101&#34;&nbsp;<br/>&nbsp;&nbsp;objNode.Attributes.Append(objNodeAttr)&nbsp;<br/>&nbsp;&nbsp;3.2&nbsp;删除一个元素的属性&nbsp;<br/>&nbsp;&nbsp;objNode.Attributes.Remove(objNodeAttr)&nbsp;<br/>&nbsp;&nbsp;3.3&nbsp;增加一个子元素（Element）&nbsp;<br/>&nbsp;&nbsp;Dim&nbsp;objNodeChild&nbsp;As&nbsp;XmlNode&nbsp;<br/>&nbsp;&nbsp;objNodeChild&nbsp;=&nbsp;objDoc.Cr&#101;ateElement(Nothing,&nbsp;&#34;ID&#34;,&nbsp;Nothing)&nbsp;<br/>&nbsp;&nbsp;objNodeChild.InnerXml&nbsp;=&nbsp;&#34;101&#34;&nbsp;<br/>&nbsp;&nbsp;objNode.AppendChild(objNodeChild)&nbsp;<br/>&nbsp;&nbsp;3.4&nbsp;删除一个子元素&nbsp;<br/>&nbsp;&nbsp;objNode.RemoveChild(objNodeChild)&nbsp;<br/>&nbsp;&nbsp;3.5&nbsp;替换一个子元素&nbsp;<br/>&nbsp;&nbsp;objNOde.ReplaceChild(newChild,oldChild)&nbsp;<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;4&nbsp;参考数据&nbsp;<br/>&nbsp;&nbsp;&lt;?xml&nbsp;version=&#34;1.0&#34;&nbsp;encoding=&#34;UTF-8&#34;?&gt;&nbsp;<br/>&nbsp;&nbsp;&lt;Company&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Department&nbsp;id=&#34;101&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Department_Name&gt;Cai&nbsp;WuBu&lt;/Department_Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Manager&gt;Zhang&nbsp;Bin&lt;/Manager&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employees&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;12345&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;12345&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Zhang&nbsp;Bin&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;10101&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;10101&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Zhang&nbsp;QI&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;female&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;10102&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;10102&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Zhang&nbsp;Xia&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;10201&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;10201&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;ZhangChuang&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;10202&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;10202&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Zhang&nbsp;Jun&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employees&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Department&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Department&nbsp;id=&#34;102&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Department_Name&gt;KaiFa&nbsp;Bu&lt;/Department_Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Manager&gt;Wang&nbsp;Bin&lt;/Manager&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employees&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;22345&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;22345&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Wang&nbsp;Bin&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;20101&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;20101&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Wang&nbsp;QI&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;female&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;20102&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;20102&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Wang&nbsp;Xia&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;20201&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;20201&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Wang&nbsp;Chuang&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee&nbsp;id=&#34;20202&#34;&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Employee_ID&gt;20201&lt;/Employee_ID&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Name&gt;Wang&nbsp;Jun&lt;/Name&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;Gender&gt;male&lt;/Gender&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employee&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Employees&gt;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&lt;/Department&gt;&nbsp;<br/>&nbsp;&nbsp;&lt;/Company&gt;]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=165</link>
			<title><![CDATA[test]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[我的生活]]></category>
			<pubDate>Thu,01 Dec 2011 15:56:16 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=165</guid>	
		<description><![CDATA[【商品名称】&nbsp;&nbsp; 清风3层10包潮流手帕B66AVT&nbsp; <br />【品牌】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清风 <br />【规格】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 210mm*210mm(3层) <br />【保质期】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三年 <br />【净含量值】&nbsp;&nbsp; 10张/包,10包/组 <br />【主要原料】&nbsp;&nbsp; 100%原生木浆]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=164</link>
			<title><![CDATA[列出MSSQL所有数据库名、所有表名、所有字段名]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Mon,27 Jun 2011 10:55:29 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=164</guid>	
		<description><![CDATA[1.获取所有数据库名&nbsp;Sel&#101;ct&nbsp;Name&nbsp;From&nbsp;Master..SysDatabases&nbsp;o&#114;der&nbsp;By&nbsp;Name&nbsp;<br/><br/>2.获取所有表名&nbsp;Sel&#101;ct&nbsp;Name&nbsp;From&nbsp;SysObjects&nbsp;Wh&#101;re&nbsp;XType=&#39;U&#39;&nbsp;o&#114;der&nbsp;By&nbsp;Name&nbsp;<br/><br/>XType=&#39;U&#39;:表示所有用户表;&nbsp;<br/><br/>XType=&#39;S&#39;:表示所有系统表;&nbsp;<br/><br/>3.获取所有字段名&nbsp;Sel&#101;ct&nbsp;Name&nbsp;From&nbsp;SysColumns&nbsp;Wh&#101;re&nbsp;id=Object_Id(&#39;TableName&#39;)<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=163</link>
			<title><![CDATA[获取MSSQL指定表的相关信息]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Mon,27 Jun 2011 10:50:37 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=163</guid>	
		<description><![CDATA[sel&#101;ct&nbsp;case&nbsp;when&nbsp;c.colid=1&nbsp;then&nbsp;object_name(c.id)&nbsp;else&nbsp;&#39;&#39;&nbsp;end&nbsp;as&nbsp;表名&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;,c.name&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;&nbsp;字段名&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;,t.name&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;,c.prec&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;&nbsp;长度&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;,p.value&nbsp;&nbsp;as&nbsp;&nbsp;&nbsp;描述信息&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;,m.text&nbsp;&nbsp;&nbsp;as&nbsp;&nbsp;&nbsp;默认值&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;syscolumns&nbsp;c&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;inner&nbsp;join&nbsp;systypes&nbsp;t&nbsp;on&nbsp;c.xusertype=t.xusertype&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;join&nbsp;sysproperties&nbsp;p&nbsp;on&nbsp;c.id=p.id&nbsp;and&nbsp;c.colid&nbsp;=&nbsp;p.smallid&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;join&nbsp;syscomments&nbsp;m&nbsp;on&nbsp;c.cdefault=m.id&nbsp;&nbsp;<br/>&nbsp;&nbsp;wh&#101;re&nbsp;objectproperty(c.id,&#39;IsUserTable&#39;)=1&nbsp;&nbsp;<br/>&nbsp;&nbsp;and&nbsp;object_name(c.id)=&#39;您要查询表名&#39;]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=162</link>
			<title><![CDATA[sql2000截断事务日志及收缩数据库]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Thu,23 Jun 2011 11:34:00 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=162</guid>	
		<description><![CDATA[--截断事务日志&nbsp;<br/>backup&nbsp;&nbsp;&nbsp;log&nbsp;&nbsp;&nbsp;数据库名&nbsp;&nbsp;&nbsp;with&nbsp;&nbsp;&nbsp;no_log&nbsp;<br/><br/>--收缩数据库&nbsp;<br/>dbcc&nbsp;&nbsp;&nbsp;shrinkdatabase&nbsp;&nbsp;&nbsp;(数据库名)]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=161</link>
			<title><![CDATA[Windows XP下安装MSSQL2000企业版]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Thu,16 Sep 2010 12:52:42 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=161</guid>	
		<description><![CDATA[方法如下：<br/>一．在SQL服务器的安装盘中找到MSDE这个目录，并且点击setup.exe安装它，过程简单直接下一步就ＯＫ了。<br/><br/>二.&nbsp;重启系统WINDOWSXP,这下就可以看到SQL服务的图标出现了。<br/><br/>三.&nbsp;再拿出SQL服务器版的安装光盘，直接安装客户端工具（这个不要多说吧？最简单的方法就是直接点击光盘根目录下的autorun.exe)安装时不要选择MDSN的帮助文件<br/><br/>根据提示安装，自检过程中知道系统不是SERVER版，会提示只安装客户端工具。<br/><br/><br/>四.&nbsp;打开企业管理器，试用SA用户连一下看看，是不是发现SA用户登陆失败？因为你还没有与信任SQL&nbsp;SERVER连接相关联。还好这个只要对系统注册表稍加修改就可以啦：<br/><br/>在运行中输入regedit打开注册表编辑器，找到[HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MSSQLSERVER\MSSQLSERVER]，这个项里面<br/><br/>有一个键值LoginMode，默认下，值是1，现在将值改为2，重启电脑。<br/><br/>五.&nbsp;再打开企业管理，再连接试试，OK了！]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=160</link>
			<title><![CDATA[Windows下apache限制ip并发数]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Wed,24 Feb 2010 14:47:35 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=160</guid>	
		<description><![CDATA[&nbsp;&nbsp;Apache最大的优点在于它是个模块化的程序，缺乏什么样的功能就可以单独开发相应的功能模块，然后加到Apache上就可以了.&nbsp;^_^<br/>&nbsp;&nbsp;目前很多人都用多线程下载工具下载，导致服务器负载很大，于是便想到了限制IP的连接数，(如果Apache是2.x版本的，那么从<a href="http://dominia.org/djao/limitipconn2.html" target="_blank">http://dominia.org/djao/limitipconn2.html</a>下载Linux的或者Windows的)&nbsp;如果是windows服务器的，把下载的的mod_limitipconn.dll放到Apache的安装目录的modules目录下；<br/>&nbsp;&nbsp;然后修改Apache的配置文件httpd.conf，这里不管Linux还是Windows都是一样的，如果是2.0首先找到httpd.conf中的LoadModule&nbsp;status_module&nbsp;modules/mod_status.so，把这句话前面的#去掉，然后加入如下内容<br/><br/>ExtendedStatus&nbsp;On<br/>LoadModule&nbsp;limitipconn_module&nbsp;modules\mod_limitipconn.dll<br/>&lt;IfModule&nbsp;mod_limitipconn.c&gt;<br/>&nbsp;&lt;Location&nbsp;/resource&gt;<br/>&nbsp;MaxConnPerIP&nbsp;50<br/>&nbsp;NoIPLimit&nbsp;image/*<br/>&nbsp;&lt;/Location&gt;<br/>&nbsp;&lt;/IfModule&gt;<br/>里面/resource是制定限定IP的目录，然后MaxConnPerIP是限定每个IP的并发连接数，NoIPLimit&nbsp;image/*&nbsp;是排除resource下不限定的目录。<br/><br/>重启apache,哈哈大功告成~<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=159</link>
			<title><![CDATA[解决IE7产生空白页的问题 ]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Wed,23 Sep 2009 10:48:53 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=159</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;在windows操作系统上使用IE作为浏览器时。常常会发生这样的问题：在浏览使用UTF-8编码的网页时，浏览器无法自动侦测（即没有设定&nbsp;“自动选择”编码格式时）该页面所用的编码。即使网页已经声明过编码格式：charset=UTF-8，由此造成某些含有中文UTF-8编码的页面产生空白输出。<br/>&nbsp;&nbsp;&nbsp;&nbsp;如果使用的是Mozilla、Mozilla&nbsp;Firefox、Sarafi的浏览器就不会造成这个问题。这是由于IE解析网页编码时以HTML内的标签优先，而后才是HTTP&nbsp;header内的讯息；而mozilla系列的浏览器则刚刚相反。<br/>&nbsp;&nbsp;&nbsp;&nbsp;由于UTF-8为3个字节表示一个汉字，而普通的GB2312或BIG5是两个。页面输出时，由于上述原因，使浏览器解析、输出&lt;title&gt;&lt;/title&gt;的内容时，如果在&lt;/title&gt;前有奇数个全角字符时，IE就会把UTF-8当作两个字节解析,这时会出现半个汉字的情况，该半个汉字会和&lt;/title&gt;标签结合成一个乱码字，导致IE无法读完title部分，使整个页面为空白输出。这个时候如果察看源文件的话，会发现实际上整个页面全部已经输出了。因此最简单的解决办法是把字符定义<br/>&lt;meta&nbsp;http-equiv=”Content-Type”&nbsp;content=”text/html;&nbsp;charset=UTF-8″&gt;放在&lt;title&gt;&lt;/title&gt;之前。]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=158</link>
			<title><![CDATA[svn for windows 的分枝与标记及web数据同步]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Thu,27 Aug 2009 13:57:33 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=158</guid>	
		<description><![CDATA[今天终于把&nbsp;SVN&nbsp;在&nbsp;windows&nbsp;下的分枝与标记及web服务器数据和版本库同步的问题解决了,高兴!现在将这一个过程记录下来.<br/>1.使用&nbsp;TSVN&nbsp;建立一个新的版本库&nbsp;如在:E:\svn\zs这个文件夹下建立.<br/>2.创建受版本库控制的文件:<br/>&nbsp;&nbsp;&nbsp;1).如在E:\server\下建立一个文件夹www.<br/>&nbsp;&nbsp;&nbsp;2).在www文件夹里检出前面建立的新版本库.<br/>&nbsp;&nbsp;&nbsp;3).进入www文件夹再建立一个名为rc的文件夹.<br/>&nbsp;&nbsp;&nbsp;4).将rc文件夹提交到版本库.<br/>&nbsp;&nbsp;&nbsp;5).使用TSVN在rc文件夹上建立分枝与标记,提示如:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从工作副本URL(F)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://192.168.0.2:88/zs/rc" target="_blank">http://192.168.0.2:88/zs/rc</a><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至URL(T)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://192.168.1.30:81/zs/rc2" target="_blank">http://192.168.1.30:81/zs/rc2</a>&nbsp;&nbsp;&nbsp;&nbsp;#这个地方就是你要建立分枝与标记名称及路径<br/>&nbsp;&nbsp;&nbsp;&nbsp;6).在工作副本复制完成后,更新,这时候E:\server\www\将自动多出一个rc2.&nbsp;&nbsp;&nbsp;#这一步很重要,我研究下来一直都是这里搞错了.<br/>&nbsp;&nbsp;&nbsp;7).分枝与标记正式建立完成了.<br/><br/>以上步骤都是在服务器上完成的.<br/><br/>分枝与标记是正式建立了,可是在本地检出文件,提交文件都是记录到服务器的版本库里,也就是说服务器的E:\server\www\这个存放真正网页的文件没有变化.<br/>如果要实现这个服务器web数据和服务器版本库同步必须要在版本库E:\svn\zs\hooks\下建立钩子.<br/>&nbsp;&nbsp;&nbsp;1.在E:\svn\zs\hooks\下,建立post-commit.bat这样的一个文件.<br/>&nbsp;&nbsp;&nbsp;2.在post-commit.bat里写如下:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;off<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;svn.exe&nbsp;up&#100;ate&nbsp;--username&nbsp;用户名&nbsp;--password&nbsp;密码&nbsp;E:/server/www/<br/>&nbsp;&nbsp;3.OK了,不信你试试.<br/><br/><br/>关于如何建立在windows上建立SVN+Apache&nbsp;&nbsp;这里就不重复了,网络多的是.]]></description>
		</item>
		
			<item>
			<link>http://www.net0577.com/default.asp?id=157</link>
			<title><![CDATA[大型网站架构演变和知识体系]]></title>
			<author>xdf1159@126.com(admin)</author>
			<category><![CDATA[技术文章]]></category>
			<pubDate>Thu,09 Apr 2009 13:56:53 +0800</pubDate>
			<guid>http://www.net0577.com/default.asp?id=157</guid>	
		<description><![CDATA[前也有一些介绍大型网站架构演变的文章，例如LiveJournal<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的、</span><wbr></wbr>ebay<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的，都是非常值得参考的，不过感觉他们讲的更多的是每次演变的结果，而没有很详细的讲为什么需要做这样的演变，再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术，于是有了写这篇文章的想法，在这篇文章中</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系，希望能给想从事互联网行业的同学一点初步的概念，</span><wbr></wbr>:)<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，文中的不对之处也请各位多给点建议，让本文真正起到抛砖引玉的效果。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em"><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">架构演变第一步：物理分离</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">和数据库</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">最开始，由于某些想法，于是在互联网上搭建了一个网站，这个时候甚至有可能主机都是租借的，但由于这篇文章我们只关注架构的演变历程，因此就假设这个时候</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">已经是托管了一台主机，并且有一定的带宽了，这个时候由于网站具备了一定的特色，吸引了部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段：将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更高的流量，并且不会因为数据库和应用形成互相的影响。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" target="_blank" eventslistuid="e3"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 195px; HEIGHT: 99px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步架构演变对技术上的知识体系基本没有要求。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em">架构演变第二步：增加页面缓存</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用</span><wbr></wbr>squid <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">很好的减少对</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的压力以及减少数据库连接资源的竞争，</span><wbr></wbr>OK<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，于是开始采用</span><wbr></wbr>squid<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">来做相对静态的页面的缓存。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" target="_blank" eventslistuid="e4"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 195px; HEIGHT: 156px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">前端页面缓存技术，例如</span><wbr></wbr>squid<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，如想用好的话还得深入掌握下</span><wbr></wbr>squid<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的实现方式以及缓存的失效算法等。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em">架构演变第三步：增加页面片段缓存</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">增加了</span><wbr></wbr>squid<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">做缓存后，整体系统的速度确实是提升了，</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝</span><wbr></wbr> <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">到了</span><wbr></wbr>squid<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似</span><wbr></wbr>ESI<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">之类的页面片段缓存策略，</span><wbr></wbr>OK<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，于是开始采用</span><wbr></wbr>ESI<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">来做动态页面中相对静态的片段部分的缓存。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" target="_blank" eventslistuid="e5"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 337px; HEIGHT: 235px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">页面片段缓存技术，例如</span><wbr></wbr>ESI<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">等，想用好的话同样需要掌握</span><wbr></wbr>ESI<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的实现方式等；</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em">架构演变第四步：数据缓存</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">在采用</span><wbr></wbr>ESI<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" target="_blank" eventslistuid="e6"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 341px; HEIGHT: 258px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">缓存技术，包括像</span><wbr></wbr>Map<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">数据结构、缓存算法、所选用的框架本身的实现机制等。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em"><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">架构演变第五步：</span><wbr></wbr> <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">增加</span><wbr></wbr>webserver</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">好景不长，发现随着系统访问量的再度增加，</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，这也是为了同时解决可用性的问题，避免单台的</span><wbr></wbr>webserver down<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">机的话就没法使用了，在做了这些考虑后，决定增加一台</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，增加一台</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">时，会碰到一些问题，典型的有：</span><wbr></wbr><br />1<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是</span><wbr></wbr>Apache<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">自带的负载均衡方案，或</span><wbr></wbr>LVS<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这类的软件负载均衡方案；</span><wbr></wbr><br />2<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、如何保持状态信息的同步，例如用户</span><wbr></wbr>session<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">等，这个时候会考虑的方案有写入数据库、写入存储、</span><wbr></wbr>cookie<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">或同步</span><wbr></wbr>session<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">信息等机制等；</span><wbr></wbr><br />3<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；</span><wbr></wbr><br />4<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">在解决了这些问题后，终于是把</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">增加为了两台，系统终于是又恢复到了以往的速度。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" target="_blank" eventslistuid="e7"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 341px; HEIGHT: 244px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">负载均衡技术（包括但不限于硬件负载均衡、软件负载均衡、负载算法、</span><wbr></wbr>linux<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">转发协议、所选用的技术的实现细节等）、主备技术（包括但不限于</span><wbr></wbr>ARP<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">欺骗、</span><wbr></wbr>linuxheart-beat<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">等）、状态信息或缓存同步技术（包括但不限于</span><wbr></wbr>Cookie<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">技术、</span><wbr></wbr>UDP<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">协议、状态信息广播、所选用的缓存同步技术的实现细节等）、共享文件技术（包括但不限于</span><wbr></wbr>NFS<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">等）、存储技术（包括但不限于存储设备等）。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em">架构演变第六步：分库</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">资源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到了，系统恢复甚至速度比以前还快了。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" target="_blank" eventslistuid="e8"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 341px; HEIGHT: 243px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步更多的是需要从业务上做合理的划分，以实现分库，具体技术细节上没有其他的要求；</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">但同时随着数据量的增大和分库的进行，在数据库的设计、调优以及维护上需要做的更好，因此对这些方面的技术还是提出了很高的要求的。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em"><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">架构演变第七步：分表、</span><wbr></wbr>DAL<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">和分布式缓存</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的工作，当然，这不可避免的会需要对程序</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在</span><wbr></wbr>ebay<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的架构中对应的就是</span><wbr></wbr>DAL<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" target="_blank" eventslistuid="e9"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 342px; HEIGHT: 439px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">分表更多的同样是业务上的划分，技术上涉及到的会有动态</span><wbr></wbr>hash<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">算法、</span><wbr></wbr>consistenthash<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">算法等；</span><wbr></wbr><br />DAL<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">涉及到比较多的复杂技术，例如数据库连接的管理（超时、异常）、数据库操作的控制（超时、异常）、分库分表规则的封装等；</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em"><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">架构演变第八步：增加更多的</span><wbr></wbr>webserver</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福生活了，突然有一天，发现系统的访问又开始有变慢的趋势</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">了，这个时候首先查看数据库，压力一切正常，之后查看</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">，发现</span><wbr></wbr>apache<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来</span><wbr></wbr> <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">服务器，在这个添加</span><wbr></wbr> webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">服务器的过程，有可能会出现几种挑战：</span><wbr></wbr><br />1<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、</span><wbr></wbr>Apache<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的软负载或</span><wbr></wbr>LVS<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">软负载等无法承担巨大的</span><wbr></wbr>web<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购</span><wbr></wbr> <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">买硬件负载，例如</span><wbr></wbr>F5<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、</span><wbr></wbr>Netsclar<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、</span><wbr></wbr>Athelon<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；</span><wbr></wbr><br />2<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" target="_blank" eventslistuid="e10"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 466px; HEIGHT: 441px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">到了这一步，随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高，这个时候要求对所采用的技术都要有更为深入的理解，并需要根据网站的需求来做更加定制性质的产品。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em">架构演变第九步：数据读写分离和廉价存储方案</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如</span><wbr></wbr>BigTable<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这种。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" target="_blank" eventslistuid="e11"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 555px; HEIGHT: 398px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">数据读写分离要求对数据库的复制、</span><wbr></wbr>standby<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">等策略有深入的掌握和理解，同时会要求具备自行实现的技术；</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">廉价存储方案要求对</span><wbr></wbr>OS<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">的文件存储有深入的掌握和理解，同时要求对采用的语言在文件这块的实现有深入的掌握。</span><wbr></wbr><br /><br /><span style="FONT-WEIGHT: bold"><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'"><span style="LINE-HEIGHT: 1.3em">架构演变第十步：进入大型分布式应用时代和廉价服务器群梦想时代</span><wbr></wbr></span><wbr></wbr></span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在</span><wbr></wbr>webserver<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">上的那个</span><wbr></wbr>web<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">应用已经非常庞大</span><wbr></wbr> <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦，</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">因为庞大的应用包在</span><wbr></wbr>N<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的</span><wbr></wbr>bug<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">就导</span><wbr></wbr> <span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将</span><wbr></wbr><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：</span><wbr></wbr><br />1<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；</span><wbr></wbr><br />2<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；</span><wbr></wbr><br />3<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">看看这一步完成后系统的图示：</span><wbr></wbr><br /><wbr></wbr><a href="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" target="_blank" eventslistuid="e12"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 554px; HEIGHT: 431px; BORDER-RIGHT-WIDTH: 0px" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" alt="" /></a><wbr></wbr><br /><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及到了这些知识体系：</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">这一步涉及的知识体系非常的多，要求对通信、远程调用、消息机制等有深入的理解和掌握，要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">运维这块涉及的知识体系也非常的多，多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。</span><wbr></wbr><br /><span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">说起来确实不怎么费力，整个网站架构的经典演变过程都和上面比较的类似，当然，每步采取的方案，演变的步骤有可能有不同，另外，由于网站的业务不同，会有不同的专业技术的需求，这篇</span><wbr></wbr>blog<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">更多的是从架构的角度来讲解演变的过程，当然，其中还有很多的技术也未在此提及，像数据库集群、数据挖掘、搜索等，但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、</span><wbr></wbr>CDN<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">镜像等来支撑更大的流量，因此在真实的发展过程中还会有很多的不同，另外一个大型网站要做到的远远不仅仅上面这些，还有像安全、运维、运营、服务、存储等，要做好一个大型的网站真的很不容易，写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍，</span><wbr></wbr>:)<span style="LINE-HEIGHT: 1.3em; FONT-FAMILY: '宋体'">。</span><wbr></wbr><br />]]></description>
		</item>
		
</channel>
</rss>
