<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_老莫的帐本子</title><subtitle type="text">Knockin' On Heaven Door</subtitle><id>http://feed.cnblogs.com/blog/u/27825/rss</id><updated>2012-05-09T08:27:54Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/27825/rss"/><entry><id>http://www.cnblogs.com/moye/archive/2011/12/13/HighScalabilitySiteOnWindows.html</id><title type="text">Windows平台高性能站点手册</title><summary type="text">一、 服务1、 Web服务与数据库服务分离2、 图片、样式表、JavaScript等静态内容，单独放置在静态服务器上3、 对Web做负载均衡，提升系统的可用性和可扩展性a) Microsoft Windows Server NLB（网络负载平衡参考资料：http://tianzt.blog.51cto.com/459544/163800）b) Nginx （参考资料：http://www.xueit.com/html/2009-11-11/34-116884196140.html ）Nginx是一款轻量级的Web 服务器／反向代理服务器及电子邮件（IMAP/POP3）代理服务器，兼具负载平衡功</summary><published>2011-12-13T08:20:00Z</published><updated>2011-12-13T08:20:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2011/12/13/HighScalabilitySiteOnWindows.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2011/12/13/HighScalabilitySiteOnWindows.html"/><content type="html">&lt;h3 style="margin-left: 30px;"&gt;一、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 服务&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;1、&amp;nbsp; Web服务与数据库服务分离&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;2、&amp;nbsp; 图片、样式表、JavaScript等静态内容，单独放置在静态服务器上&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;3、&amp;nbsp; 对Web做负载均衡，提升系统的可用性和可扩展性&lt;/span&gt;&lt;/p&gt;&lt;p&gt;a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Microsoft Windows Server NLB&lt;/strong&gt;（网络负载平衡&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;参考资料：&lt;a href="http://tianzt.blog.51cto.com/459544/163800"&gt;http://tianzt.blog.51cto.com/459544/163800&lt;/a&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Nginx &lt;/strong&gt;（&lt;span style="font-size: 12px;"&gt;参考资料：&lt;a href="http://www.xueit.com/html/2009-11-11/34-116884196140.html"&gt;http://www.xueit.com/html/2009-11-11/34-116884196140.html&lt;/a&gt;&lt;/span&gt; ）&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Nginx是一款轻量级的Web 服务器／反向代理服务器及电子邮件（IMAP/POP3）代理服务器，兼具负载平衡功能。其特点是占有内存少，并发能力强，事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有：新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Nginx可以处理上万并发，所以绝对是个非常不错的选择。如果网站访问量非常大，可以专门用一台服务器跑Nginx，其它服务器跑网站程序(几台服务器的程序都是一样的)，这样负载就没有太大问题，如果再不行，把网站一些栏目做一个2级域名，2级域名同样做负载。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Nginx软件在linux上跑性能比在windows上跑要好，所以做负载可以用linux跑nginx，.net开发的网站放到windows服务器IIS上。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4、&amp;nbsp; &lt;a href="http://www.hudong.com/wiki/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86"&gt;代理服务器&lt;/a&gt;（&lt;span style="font-size: 12px;"&gt;缓存静态内容/容灾/镜像&lt;/span&gt;）&lt;/p&gt;&lt;p&gt;a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Squid&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Squid是一款流行的代理服务器和Web缓存服务器。Squid有广泛的用途，从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度，到为一组人共享网络资源而缓存万维网，域名系统和其他网络搜索，到通过过滤流量帮助网络安全，到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Nginx&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Nginx做为HTTP服务器，有以下几项基本特性：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;1.处理静态文件，索引文件以及自动索引；打开文件描述符缓冲；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;2.无缓存的反向代理加速，简单的负载均衡和容错。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Nginx在功能和性能上全面超越了Squid。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;c)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;Lighttpd &lt;/strong&gt;（参考资料：&lt;a href="http://code.google.com/p/wlmp-project/downloads/list"&gt;&amp;nbsp;&lt;/a&gt;&lt;a href="http://spiritfrog.iteye.com/blog/600229"&gt;http://spiritfrog.iteye.com/blog/600229&lt;/a&gt; ）&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;如其名，Lighttpd是一款轻量级的Web服务器软件。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;适用场景：在不考虑搭建流媒体服务器的情况下，搭建一个视频播放之用的http server。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数据存储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 拥有一名对特定数据库系统通晓的DBA：&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;一行SQL语句能跑通和能跑得很快，是有很大区别的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;例如，DBA会告诉你，在存储过程中使用sp_executesql 而不是直接写SQL语句跑作业，能提高100倍以上的速度。如下范例：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" style="margin-left: 30px;"&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;直接查询,使用聚集索引查找&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #808080;"&gt;*&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt; dbo.test &lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; id&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;345632&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;使用参数化SQL 执行,避免意外的表扫描&lt;/span&gt;&lt;span style="color: #008080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #008000;"&gt;@i&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt; &lt;span style="color: #008000;"&gt;@i&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #800000; font-weight: bold;"&gt;845632&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;DECLARE&lt;/span&gt; &lt;span style="color: #008000;"&gt;@SQL&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NVARCHAR&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;MAX&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;SET&lt;/span&gt; &lt;span style="color: #008000;"&gt;@SQL&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;N&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;SELECT * FROM dbo.test WHERE id = @i&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;EXEC&lt;/span&gt; sp_executesql &lt;span style="color: #008000;"&gt;@SQL&lt;/span&gt;,N&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;@i int&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;,&lt;span style="color: #008000;"&gt;@i&lt;/span&gt;;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 列加上索引&lt;span style="font-size: 12px;"&gt;（聚集索引 和 非聚集索引，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;参数资料： &lt;a href="http://www.cnblogs.com/qqq88zz/archive/2011/05/17/2048300.html"&gt;http://www.cnblogs.com/qqq88zz/archive/2011/05/17/2048300.html&lt;/a&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;c)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数据库分区分表，散列（&lt;span style="font-size: 12px;"&gt;垂直、水平分割，散列，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;参考资料：&lt;a href="http://blog.csdn.net/dongxiaohui2008/article/details/6583798"&gt;http://blog.csdn.net/dongxiaohui2008/article/details/6583798&lt;/a&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;d)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 减少锁的发生（&lt;span style="font-size: 12px;"&gt;行级别控制，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;参考资料：&lt;a href="http://blog.csdn.net/king_idea8848/article/details/4674664"&gt;http://blog.csdn.net/king_idea8848/article/details/4674664&lt;/a&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;e)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 永无止境的优化（&lt;span style="font-size: 12px;"&gt;查询优化、索引优化、算法优化&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;参考资料：&lt;a href="http://www.cnblogs.com/chuncn/archive/2009/04/21/1440233.html"&gt;http://www.cnblogs.com/chuncn/archive/2009/04/21/1440233.html&lt;/a&gt; ）&lt;/span&gt;&lt;/p&gt;&lt;h3 style="margin-left: 30px;"&gt;三、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 缓存&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;高并发的快速解决方案，有时，就是缓存。针对动态数据进行缓存，在数据库和Web服务之间，建立起一道屏蔽，在第一次请求过后，不再请求数据库，尽量避免因高并发带来的数据库死锁情况发生。缓存服务器配合前面介绍的负载与代理软件，能很好的为Web应用减压。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memcached分布式缓存快取系统&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;（配置资料：&lt;a href="http://www.cnblogs.com/luluping/archive/2009/01/14/1375453.html"&gt;http://www.cnblogs.com/luluping/archive/2009/01/14/1375453.html&lt;/a&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Memcached是由Danga Interactive开发的，高性能的，分布式的内存对象缓存系统，用于在动态应用中减少数据库负载，提升访问速度。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Apache Cassandra&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Apache Cassandra是一套开源分布式Key-Value存储系统。它最初由Facebook开发，用于储存特别大的数据。Facebook目前在使用此系统。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;主要特性：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;分布式&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;基于column的结构化&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;高伸展性&lt;/span&gt;&lt;/p&gt;&lt;p&gt;c)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mongo、Redis、VelocityCache&amp;hellip;&lt;/p&gt;&lt;h3 style="margin-left: 30px;"&gt;四、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 站点&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;a)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 参照Yahoo前端优化原则去做（&lt;/p&gt;&lt;p&gt;参考资料：&lt;a href="http://www.websbook.com/Operate/Seo/yahoowzdyhyz_20529.html"&gt;http://www.websbook.com/Operate/Seo/yahoowzdyhyz_20529.html&lt;/a&gt;）&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;1、尽量减少HTTP请求个数&amp;mdash;&amp;mdash;须权衡&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;2、使用CDN（内容分发网络）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;3、为文件头指定Expires或Cache-Control，使内容具有缓存性。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;4、避免空的src和href&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;5、使用gzip压缩内容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;6、把CSS放到顶部&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;7、把JS放到底部&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;8、避免使用CSS表达式&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;9、将CSS和JS放到外部文件中&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;10、减少DNS查找次数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;11、精简CSS和JS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;12、避免跳转&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;13、剔除重复的JS和CSS&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;14、配置ETags&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;15、使AJAX可缓存&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;16、尽早刷新输出缓冲&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;17、使用GET来完成AJAX请求&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;18、延迟加载&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;19、预加载&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;20、减少DOM元素个数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;21、根据域名划分页面内容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;22、尽量减少iframe的个数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;23、避免404&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;24、减少Cookie的大小&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;25、使用无cookie的域&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;26、减少DOM访问&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;27、开发智能事件处理程序&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;28、用&amp;lt;link&amp;gt;代替@import&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;29、避免使用滤镜&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;30、优化图像&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;31、优化CSS Spirite&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;32、不要在HTML中缩放图像&amp;mdash;&amp;mdash;须权衡&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;33、favicon.ico要小而且可缓存&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;34、保持单个内容小于25K&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;35、打包组件成复合文本&lt;/span&gt;&lt;/p&gt;&lt;p&gt;b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 为IIS搭配一个唤醒模块，解救不幸的第一个访客（参考资料：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/shanyou/archive/2010/12/21/1913199.html"&gt;http://www.cnblogs.com/shanyou/archive/2010/12/21/1913199.html&lt;/a&gt;）&lt;/p&gt;&lt;p&gt;c)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 将静态服务器配置为Cookieless&lt;/p&gt;&lt;h3 style="margin-left: 30px;"&gt;五、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;针对性能和应用，选择不同的工具做压力测试（参考资料：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;a href="http://www.cnblogs.com/junzhongxu/archive/2010/03/02/1676508.html"&gt;http://www.cnblogs.com/junzhongxu/archive/2010/03/02/1676508.html&lt;/a&gt;）&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/moye/aggbug/2286274.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/moye/archive/2011/12/13/HighScalabilitySiteOnWindows.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2011/08/29/AndroidAlertDialogAndSharedPeferences.html</id><title type="text">Android小试牛刀之1——对话框应用和SharedPeferences存储</title><summary type="text">关于Android对话框和首选项存储的处子代码段，何其凌乱……</summary><published>2011-08-28T16:20:00Z</published><updated>2011-08-28T16:20:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2011/08/29/AndroidAlertDialogAndSharedPeferences.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2011/08/29/AndroidAlertDialogAndSharedPeferences.html"/><content type="html">&lt;p&gt;&lt;strong&gt;我认为，再也没有比这更凌乱的代码了&amp;hellip;&amp;hellip;&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;package com.locke.android;&lt;br/&gt;&lt;br/&gt;import android.app.Activity;&lt;br/&gt;import android.app.AlertDialog;&lt;br/&gt;import android.app.Dialog;&lt;br/&gt;import android.content.DialogInterface;&lt;br/&gt;import android.content.SharedPreferences;&lt;br/&gt;import android.content.SharedPreferences.Editor;&lt;br/&gt;import android.os.Bundle;&lt;br/&gt;import android.view.View;&lt;br/&gt;import android.widget.Button;&lt;br/&gt;import android.widget.TextView;&lt;br/&gt;import android.widget.Toast;&lt;br/&gt;&lt;br/&gt;public class DataAdapeterActivity extends Activity {&lt;br/&gt;private static SharedPreferences settingActivity;&lt;br/&gt;static final int DIALOG_ALERT_ID = 0;&lt;br/&gt;static final int DIALOG_CONFIRM_ID = 1;&lt;br/&gt;static final int DIALOG_SHOW = 2;&lt;br/&gt;static final String KEY_NAME = "name";&lt;br/&gt;private Button buttonSave,buttonLoad;&lt;br/&gt;private Editor editor;&lt;br/&gt;private TextView textName;&lt;br/&gt;private String inputName,message,storedName;&lt;br/&gt;&lt;br/&gt;/*构建对话框*/&lt;br/&gt;protected Dialog onCreateDialog(int id){&lt;br/&gt;Dialog dialog;&lt;br/&gt;switch(id){&lt;br/&gt;case DIALOG_ALERT_ID:&lt;br/&gt;dialog =  new AlertDialog.Builder(this)&lt;br/&gt;.setMessage(message)&lt;br/&gt;.setPositiveButton(android.R.string.ok,new DialogInterface.OnClickListener() {&lt;br/&gt;@Override&lt;br/&gt;public void onClick(DialogInterface dialog, int which) {&lt;br/&gt;dialog.dismiss();&lt;br/&gt;}&lt;br/&gt;}).create();&lt;br/&gt;break;&lt;br/&gt;case DIALOG_CONFIRM_ID:&lt;br/&gt;dialog = new AlertDialog.Builder(this)&lt;br/&gt;.setMessage("确认覆盖吗名字？")&lt;br/&gt;.setPositiveButton(android.R.string.ok,new DialogInterface.OnClickListener() {&lt;br/&gt;@Override&lt;br/&gt;public void onClick(DialogInterface dialog, int which) {&lt;br/&gt;saveItem2Settings();&lt;br/&gt;dialog.dismiss();&lt;br/&gt;}&lt;br/&gt;})&lt;br/&gt;.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {&lt;br/&gt;@Override&lt;br/&gt;public void onClick(DialogInterface dialog, int which) {&lt;br/&gt;dialog.dismiss();&lt;br/&gt;}&lt;br/&gt;})&lt;br/&gt;.create();&lt;br/&gt;break;&lt;br/&gt;case DIALOG_SHOW:&lt;br/&gt;dialog = new AlertDialog.Builder(this)&lt;br/&gt;.setMessage(getName())&lt;br/&gt;.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {&lt;br/&gt;@Override&lt;br/&gt;public void onClick(DialogInterface dialog, int which) {&lt;br/&gt;dialog.dismiss();&lt;br/&gt;}&lt;br/&gt;}).create();&lt;br/&gt;break;&lt;br/&gt;default:&lt;br/&gt;dialog =  null;&lt;br/&gt;break;&lt;br/&gt;}&lt;br/&gt;return dialog;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;    /* Called when the activity is first created. */&lt;br/&gt;    @Override&lt;br/&gt;    public void onCreate(Bundle savedInstanceState) {&lt;br/&gt;        super.onCreate(savedInstanceState);&lt;br/&gt;        setContentView(R.layout.main);      &lt;br/&gt;        &lt;br/&gt;        settingActivity = getPreferences(MODE_PRIVATE);&lt;br/&gt;        &lt;br/&gt;        textName = (TextView)findViewById(R.id.text_name);        &lt;br/&gt;        buttonSave = (Button)findViewById(R.id.button_save);&lt;br/&gt;        buttonLoad = (Button)findViewById(R.id.button_get);&lt;br/&gt;        &lt;br/&gt;        /*保存按钮*/&lt;br/&gt;        buttonSave.setOnClickListener(new View.OnClickListener() {&lt;br/&gt;@Override&lt;br/&gt;public void onClick(View v) {&lt;br/&gt;inputName = textName.getText().toString();&lt;br/&gt;if(inputName==null || inputName=="" || inputName.length()==0){&lt;br/&gt;showDialog("请输入名字！");&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;if(settingActivity.contains(KEY_NAME)){&lt;br/&gt;showDialog(DIALOG_CONFIRM_ID);&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;saveItem2Settings();&lt;br/&gt;showDialog("保存成功！");&lt;br/&gt;}&lt;br/&gt;});&lt;br/&gt;        &lt;br/&gt;        /*读取*/&lt;br/&gt;        buttonLoad.setOnClickListener(new View.OnClickListener() {&lt;br/&gt;@Override&lt;br/&gt;public void onClick(View v) {&lt;br/&gt;showDialog(DIALOG_SHOW);&lt;br/&gt;}&lt;br/&gt;});&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    /*保存一对键值*/&lt;br/&gt;    private void saveItem2Settings(){   &lt;br/&gt;    inputName = textName.getText().toString();&lt;br/&gt;    editor = settingActivity.edit();&lt;br/&gt;    editor.putString(KEY_NAME,inputName);&lt;br/&gt;    editor.commit();&lt;br/&gt;    &lt;br/&gt;    removeDialog(DIALOG_SHOW);&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    /*弹出消息*/&lt;br/&gt;    private void showDialog(String msg){&lt;br/&gt;    message = msg;&lt;br/&gt;    showDialog(DIALOG_ALERT_ID);&lt;br/&gt;    }&lt;br/&gt;    &lt;br/&gt;    /*获取名称*/&lt;br/&gt;    private String getName(){&lt;br/&gt;    return settingActivity.getString(KEY_NAME,"无值");&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/moye/aggbug/2157098.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/moye/archive/2011/08/29/AndroidAlertDialogAndSharedPeferences.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2011/02/12/SvnSync.html</id><title type="text">SVN内外网版本库同步手册</title><summary type="text">1，在路由器上开启 &amp;ldquo;动态DNS&amp;rdquo;输入花生壳帐号moyerockgmailsystem登录2，在路由器上开启&amp;ldquo;Dmz主机&amp;rdquo;输入待启用动态域名的源主机ip3，在路由器上&amp;ldquo;虚拟服务器&amp;rdquo;上添加转发规则8080或者8433端口4，在源主机上配置防火墙，开启相应端口通过5，在源主机上开启svn协议服务，输入dos命令：svnserve -d -r D:\Repositories （仓库文件夹地址）使用TortoiseSVN的SVN Browse测试svn协议状态，输入如： svn://</summary><published>2011-02-12T02:50:00Z</published><updated>2011-02-12T02:50:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2011/02/12/SvnSync.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2011/02/12/SvnSync.html"/><content type="html">&lt;p&gt;1，在路由器上开启 &amp;ldquo;动态DNS&amp;rdquo;&lt;br /&gt;输入花生壳帐号&lt;br /&gt;moyerockgmail&lt;br /&gt;system&lt;br /&gt;登录&lt;br /&gt;&lt;br /&gt;2，在路由器上开启&amp;ldquo;Dmz主机&amp;rdquo;&lt;br /&gt;输入待启用动态域名的源主机ip&lt;br /&gt;&lt;br /&gt;3，在路由器上&amp;ldquo;虚拟服务器&amp;rdquo;上添加转发规则&lt;br /&gt;8080或者8433端口&lt;br /&gt;&lt;br /&gt;4，在源主机上配置防火墙，开启相应端口通过&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5，在源主机上开启svn协议服务，输入dos命令：&lt;br /&gt;&lt;br /&gt;svnserve -d -r D:\Repositories （仓库文件夹地址）&lt;br /&gt;&lt;br /&gt;使用TortoiseSVN的SVN Browse测试svn协议状态，输入如： svn://moyegmail.gicp.net/Test，如果显示库内容则成功&lt;br /&gt;&lt;br /&gt;6，开始同步：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;源目录：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; svn://moyegmail.gicp.net/Test&lt;br /&gt;同步目标目录:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http:// 目标IP:8080/svn/Test/ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(1). 如果目标目录 存在相同的项目，请先清除，重新建立空项目&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; svnadmin create Test&lt;br /&gt;&lt;br /&gt;(2). 执行 初始化（在目标目录 ）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; svnsync init http:// 目标IP:8080/svn/Test/ svn://moyegmail.gicp.net/Test&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 即svnsync init 目标库 源库&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 将向你询问登录目标库和源库的用户名和密码，建议为两个库设置相同的用户名及相同的密码正确后，显示&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Copied properties for revision 0.&lt;br /&gt;&lt;br /&gt;(3). 创建一个.bat放到源项目库中，在需要同步时，调用它来进行源向目标的单向同步：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sync.bat：&lt;br /&gt;&lt;br /&gt;svnsync sync&amp;nbsp; --non-interactive http://目标:8080/svn/Test/ --username admin --password system (目标库帐号)&lt;/p&gt;&lt;img src="http://www.cnblogs.com/moye/aggbug/1952161.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/moye/archive/2011/02/12/SvnSync.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2010/11/16/READ_COMMITTED_SNAPSHOT.html</id><title type="text">提高SQL SERVER并发能力</title><summary type="text">READ_COMMITTED_SNAPSHOT的强项在于查询的时候不会下锁，影响别的事务操作，而且可以保障查询的数据满足绝大多数的精确要求。这里牵涉到的另一个问题是，有的更新过程，需要对某些关键数据行进行锁定，以避免重入导致的数据更新错误，比如财务帐户信息。比如，在一个存储过程中，使用TIMESTAMP类型字段作为行更新的依旧，在快照模式下，就会引发错误导致更新失败。MSDN提供了一个这样的解决方案：当 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 时，您可以使用 READCOMMITTEDLOCK 表提示为 READ COMMITTED 隔离级别上运行的事务中的各语句请求共享锁，而不是行版本控制。</summary><published>2010-11-16T09:39:00Z</published><updated>2010-11-16T09:39:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2010/11/16/READ_COMMITTED_SNAPSHOT.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2010/11/16/READ_COMMITTED_SNAPSHOT.html"/><content type="html">&lt;p&gt;从MSDN看到这样一个解决方案：&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms173763.aspx" target="_blank"&gt;SET TRANSACTION ISOLATION LEVEL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;首先，设置数据库的事务隔离级别为 只读快照：READ_COMMITTED_SNAPSHOT&lt;/p&gt;&lt;div style="font-size: 10pt;"&gt;设置READ_COMMITTED_SNAPSHOT隔离模式很简单，只要我们简单的一步操作就可以实现。&lt;/div&gt;&lt;div style="font-size: 10pt;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font-size: 10pt; color: #ff0000;"&gt;ALTER DATABASE DATABASE_NAME&lt;/div&gt;&lt;div style="font-size: 10pt;"&gt;&lt;span style="color: #ff0000;"&gt;SET READ_COMMITTED_SNAPSHOT ON;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt; READ_COMMITTED_SNAPSHOT的强项在于查询的时候不会下锁，影响别的事务操作，而且可以保障查询的数据满足绝大多数的精确要求。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;这里牵涉到的另一个问题是，有的更新过程，需要对某些关键数据行进行锁定，以避免重入导致的数据更新错误，比如财务帐户信息。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;比如，在一个存储过程中，使用TIMESTAMP类型字段作为行更新的依旧，在快照模式下，就会引发错误导致更新失败。&lt;br /&gt;&lt;br /&gt;MSDN提供了一个这样的解决方案：&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #ffff99;"&gt;当 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 时，您可以使用 READCOMMITTEDLOCK 表提示为 READ COMMITTED 隔离级别上运行的事务中的各语句请求共享锁，而不是行版本控制。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;那我们完全在这种更新事务中，使用如此共享锁：&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;update&lt;/span&gt;&lt;span style="color: #000000;"&gt; A &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;with&lt;/span&gt;&lt;span style="color: #000000;"&gt;(READCOMMITTEDLOCK) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;  CASH&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; yy_AMT&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #008000;"&gt;@M_CAMT&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; UID &lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;@U_ID&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;and&lt;/span&gt;&lt;span style="color: #000000;"&gt; TIME_STAMP&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #008000;"&gt;@TS&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"&gt;http://msdn.microsoft.com/zh-cn/library/ms173763.aspx&lt;/div&gt;&lt;img src="http://www.cnblogs.com/moye/aggbug/1878761.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/moye/archive/2010/11/16/READ_COMMITTED_SNAPSHOT.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2010/10/16/EntityFramework4_Poco2.html</id><title type="text">Entity Framework 4 Poco开发之旅 part 2</title><summary type="text">对于习惯Model和Data分层分离的朋友，鄙人提供这两个模板可供选用：Entity Framework 4 Model &amp; DataContext T4 Template Download当然，模板只是个范例，还需视情况进行调整，比如您项目的相对位置，命名空间有所不同，或者您觉得序列化模型不是必须的。</summary><published>2010-10-16T09:01:00Z</published><updated>2010-10-16T09:01:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2010/10/16/EntityFramework4_Poco2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2010/10/16/EntityFramework4_Poco2.html"/><content type="html">&lt;p&gt;在对EF4有一个大致了解后，我们来看看怎么在实际项目中应用EF4和POCO。&lt;/p&gt;&lt;p&gt;1、打开VS2010，新建一个空的解决方案。&lt;/p&gt;&lt;p&gt;2、添加一个Class Library项目，删掉附带的Class1。&lt;/p&gt;&lt;p&gt;3、Add一个New Folder，比如&amp;ldquo;DataEntity&amp;rdquo;，往里添加一个 Entity Data Model ： EF4.edmx：&lt;/p&gt;&lt;p&gt;&lt;img style="border: black 1px solid;" src="http://pic002.cnblogs.com/images/2010/24266/2010101615431512.jpg" alt="添加Data Entity Model" /&gt;&lt;/p&gt;&lt;p&gt;4、选择&amp;ldquo;Generate from database&amp;rdquo;，点&amp;ldquo;next&amp;rdquo;，在向导帮助下，完成数据库连接的配置：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24266/2010101615481539.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;5、此时，向导会要求提供一个数据库连接串，并可选将它配置在App.config中，如果初次使用向导，点击&amp;ldquo;New Connection&amp;rdquo;创建一个新的连接：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24266/2010101615540143.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;6、下一步中，向导为我们反射出当前数据库中的所有表（Tables）、视图（Views）、存储过程和方法（Stored Procedures）。&lt;/p&gt;&lt;p&gt;值得注意的是：存储过程和函数是列在一起的，并且在这个步骤中，可为模型定下命名空间。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24266/2010101615595876.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;7、勾选我们要用到的结构，点击&amp;ldquo;Finish&amp;rdquo;进行生成。此时，会进入Entity Data Model的设计视图：&lt;/p&gt;&lt;p&gt;&lt;img style="border: black 1px solid;" src="http://pic002.cnblogs.com/images/2010/24266/2010101616050933.jpg" alt="Entity Framework Data Model设计视图" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关闭它，在&amp;ldquo;Solution Explorer&amp;rdquo;中查看EF4.Designer.cs源代码，我们会发现，此时的模型实体与数据容器是在一起的：&lt;/p&gt;&lt;p&gt;&lt;img style="border: black 1px solid;" src="http://pic002.cnblogs.com/images/2010/24266/2010101616100886.jpg" alt="Entity Framework 4生成代码" /&gt;&lt;/p&gt;&lt;p&gt;OK，万里长征完成了第一步，此时我们需要用到Entity Framework 4 的模板，才能实现真的POCO与Data Context分离。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;8、还在这个Folder中，添加一个&amp;ldquo;ADO.NET POCO Entity Generator&amp;rdquo;，点Add，看发生了什么：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/24266/2010101616215817.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;是的，产生了两个T4模板，一个是生成DataContext数据容用的，一个是生成POCO模型用的。&lt;/p&gt;&lt;p&gt;有了它们，我们就用不着.edmx自带的.cs文件了，将它删除！.edmx只是我们用来生成的一个依据，使用它的设计视图进行模型的重构。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;对于习惯Model和Data分层分离的朋友，鄙人提供这两个模板可供选用：&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/moye/EF4.T4.Model.Context_2.rar"&gt;Entity Framework 4 Model &amp;amp; DataContext T4 Template Download&lt;/a&gt;&lt;/p&gt;&lt;p&gt;当然，模板只是个范例，还需视情况进行调整，比如您项目的相对位置，命名空间有所不同，或者您觉得序列化模型不是必须的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;同时，在使用这两个模板进行生成操作前，请确保您在设计器中对Entity Type的&amp;ldquo;Entity Set Name&amp;rdquo;和&amp;ldquo;Name&amp;rdquo;的命名，符合如下规则：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果表命名类似这样：CARD_BATCH，单词间以下划线&amp;ldquo;_&amp;rdquo;进行分隔，那么词间首字母请大写，Name设置为&amp;ldquo;CardBatch&amp;rdquo;，Entity Set Name为Name加上s，即&amp;ldquo;CardBatchs&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="border: black 1px solid;" src="http://pic002.cnblogs.com/images/2010/24266/2010101616550185.jpg" alt="EF4容器与模型分离的场景" /&gt;&lt;/p&gt;&lt;p&gt;为什么要这样？因为当初我犯了个懒，没有好好去研究生成Name和Entity Set Name通用的方法，久而久之，也就习惯了这么用，是有点麻烦，尤其对于Model经常在变化的项目^ ^ 朋友们如果有更好的方法，请不吝赐教~&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里将两层项目的解决方案放出，希望对您有所帮助：&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/moye/EF4.Project.Sample.rar" target="_blank"&gt;Entity Framework 4 Poco Solution Sample Download&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;上一篇：&lt;a href="http://www.cnblogs.com/moye/archive/2010/10/14/EntityFramework4_poco.html"&gt;Entity Framework 4 Poco开发之旅 part 1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/moye/aggbug/1853085.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/moye/archive/2010/10/16/EntityFramework4_Poco2.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2010/10/14/EntityFramework4_poco.html</id><title type="text">Entity Framework 4 Poco开发之旅 part 1</title><summary type="text">EF4会为每一个数据库连接生成一个数据容器，和一个数据关系映射XML文件（.edmx）。数据容器继承自System.Data.Objects.ObjectContext，它拥有对连接和数据集（数据集ObjectSet对应数据库中的表）的描述，并以此为我们提供CRUD访问功能。数据关系映射文件.edmx的结构设计颇为讲究，分为SSDL（存储模型简单直接介质层）、CSDL（概念模型简单直接介质层）、C-S mapping（存储-概念映射关系 ）三大块。日常的维护更新表关系通过对.edmx的操作进行，在.edmx里的结构发生变化后，可调用T4模板，重新生成数据容器，以及与之关联的Poco对象群。</summary><published>2010-10-14T14:02:00Z</published><updated>2010-10-14T14:02:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2010/10/14/EntityFramework4_poco.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2010/10/14/EntityFramework4_poco.html"/><content type="html">&lt;p&gt;近一年的时间没怎么更新了，全部的精力和心思都扑在了创业项目上，也许忙不应该是不写博客的理由，但真实的生活过得就是如此匆忙，无奈&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;言归正传，最近一直在用&lt;a href="http://www.subsonicproject.com/" target="_blank"&gt;SubSonic&lt;/a&gt; ，一个很小巧的O/R Mapping工具，当然，只是用它做些比较简单的查询，复杂的查询对它来说太过于困难，你得为它设置外键关联，写映射类，如果想要实现双表的JOIN，还涉及到分页查询，那真是愁煞人也，不信你可以看看&lt;a href="http://stackoverflow.com/questions/916269/subsonic-inner-join-select-problem" target="_blank"&gt;StackFlow上有多少洋人兄弟被它难倒！！&lt;/a&gt;&lt;/p&gt;&lt;p&gt;SubSonic的问题，在于它的对象过重，捆绑了对数据关系的描述，好处是一些方法的方便程度高，缺点是丧失了灵性性，某些场景只能仰天长叹无能为力！就这方面而言，与nHibernate相差甚远，简直不可称为O/R Mapping。&lt;/p&gt;&lt;p&gt;由于项目的特性，在数据层选型上使用了Entity Framework 4（以下简称EF4），而不是我熟悉的nHibernate（一个有意思的现象是，很多人把自身对不熟悉技术的恐惧，转义为这门技术还不成熟）。&lt;/p&gt;&lt;p&gt;这倒无妨，随着项目的演进和对EF4的熟悉深入，我倒是喜欢上了这个框架。EF4是伴随着.NET Framework 4和Vs2010一起发布的，且认为这是微软在数据访问层级的拳头产品吧，在很多关键部位，平台和IDE对EF4做出了强有力的支撑，比如T4模板引擎和与之配套的&lt;a href="http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html" target="_blank"&gt;T4 Editor&lt;/a&gt;，LINQ TO Entities提供的查询灵活度，简单可控的对象模型POCO（Plain Old CLR Object）。&lt;/p&gt;&lt;p&gt;好的ORM都是相似的，数据对象可以定制，贫血模型，比如nH，比如EF4。数据对象是否为POCO真的有那么重要吗？是的，更进一步说，其实是对象是否可以定制，比如SubSonic，生成的对象，居然是不可序列化的，用它做一个稍微有点复杂的Web页面，你都会付出更多的劳动&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;EF4会为每一个数据库连接生成一个数据容器，和一个数据关系映射XML文件（.edmx）。&lt;/p&gt;&lt;p&gt;数据容器继承自System.Data.Objects.ObjectContext，它拥有对连接和数据集（数据集ObjectSet对应数据库中的表）的描述，并以此为我们提供CRUD访问功能。&lt;/p&gt;&lt;p&gt;数据关系映射文件.edmx的结构设计颇为讲究，分为SSDL（存储模型简单直接介质层）、CSDL（概念模型简单直接介质层）、C-S mapping（存储-概念映射关系 ）三大块：SSDL是对于容器中数据集以及数据表映射关系的描述，CSDL则是数据表映射与POCO关系映射的描述，C-S mapping将上述二者对应起来。&lt;/p&gt;&lt;p&gt;日常对数据源的维护更新表通过对.edmx的操作进行，在.edmx里的结构发生变化后，运行T4模板，重新生成数据容器和与之关联的Poco对象群。而EF4这个T4模板，像nHibernate和iBatis.net下的模板一样，有自己的语法和解析器，可以对生成的Poco对象进行定制。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下一回合，将通过一个使用Ado.net Entity Data Model和Ado.net EntityObject Generator生成EF4 Poco的实例，来进一步了解EF4的特性。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下一篇：&lt;a href="http://www.cnblogs.com/moye/archive/2010/10/16/EntityFramework4_Poco2.html"&gt;Entity Framework 4 Poco开发之旅 part 2&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/moye/aggbug/1850618.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/moye/archive/2010/10/14/EntityFramework4_poco.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2010/05/12/discuznt_toolkit_async_api.html</id><title type="text">关于异步调用Discuz!NT接口</title><summary type="text">最近在做Discuz!NT论坛与网站整合的东西，于是便用到了Discuz提供的Discuz! Toolkit 看了看源码，应该说这是个不错的工具库，提供了关于注册、登录、 文章、积分等论坛操作的一篮子功能，而且配备了对应的Wiki 只可惜，Discuz!NT终归是异构的系统，响应速度和突发异常并非如自己的代码一样可控，使用同步方式调用API就显得有那么些不智了 好在Toolkit是开源的，可以D...</summary><published>2010-05-12T11:07:00Z</published><updated>2010-05-12T11:07:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2010/05/12/discuznt_toolkit_async_api.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2010/05/12/discuznt_toolkit_async_api.html"/><content type="text">最近在做Discuz!NT论坛与网站整合的东西，于是便用到了Discuz提供的Discuz! Toolkit 看了看源码，应该说这是个不错的工具库，提供了关于注册、登录、 文章、积分等论坛操作的一篮子功能，而且配备了对应的Wiki 只可惜，Discuz!NT终归是异构的系统，响应速度和突发异常并非如自己的代码一样可控，使用同步方式调用API就显得有那么些不智了 好在Toolkit是开源的，可以D...</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2010/01/14/soft-develop-model.html</id><title type="text">[转]软件开发模型</title><summary type="text">软件开发模型是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段，有时也包括维护阶段。软件开发模型能清晰、直观地表达软件开发全过程，明确规定了要完成的主要活动和任务，用来作为软件项目工作的基础。</summary><published>2010-01-14T03:21:00Z</published><updated>2010-01-14T03:21:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2010/01/14/soft-develop-model.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2010/01/14/soft-develop-model.html"/><content type="text">软件开发模型是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段，有时也包括维护阶段。软件开发模型能清晰、直观地表达软件开发全过程，明确规定了要完成的主要活动和任务，用来作为软件项目工作的基础。</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2010/01/12/1645041.html</id><title type="text">设计模式：Observer模式 之 互为观察者与被观察者</title><summary type="text">在现实世界中，没有单纯的观察者或者被观察者，大部分时候，一体两种角色兼备。一个小小的实验： ObserverCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt;namespacewoodigg.DesignMode{///&lt;summary&gt;//...</summary><published>2010-01-12T05:31:00Z</published><updated>2010-01-12T05:31:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2010/01/12/1645041.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2010/01/12/1645041.html"/><content type="text">在现实世界中，没有单纯的观察者或者被观察者，大部分时候，一体两种角色兼备。一个小小的实验： ObserverCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt;namespacewoodigg.DesignMode{///&lt;summary&gt;//...</content></entry><entry><id>http://www.cnblogs.com/moye/archive/2009/11/27/1611907.html</id><title type="text">一次OSIV调试经历</title><summary type="text">spring.net有一种管理Session以用于lazy-load的模式：Open Session In View（OSIV），原理大致是：spring.net提供了一个HttpModule,“就是一个filter，每次request进来，就打开一个session放到ThreadLocal里，以后用到session就拿出来用，filter结束的时候，再清空ThreadLocal，关闭session”</summary><published>2009-11-27T08:43:00Z</published><updated>2009-11-27T08:43:00Z</updated><author><name>莫耶</name><uri>http://www.cnblogs.com/moye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/moye/archive/2009/11/27/1611907.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/moye/archive/2009/11/27/1611907.html"/><content type="text">spring.net有一种管理Session以用于lazy-load的模式：Open Session In View（OSIV），原理大致是：spring.net提供了一个HttpModule,“就是一个filter，每次request进来，就打开一个session放到ThreadLocal里，以后用到session就拿出来用，filter结束的时候，再清空ThreadLocal，关闭session”</content></entry></feed>
