﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java的足迹-随笔分类-系统架构</title><link>http://www.blogjava.net/pesome/category/5222.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 17:54:43 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 17:54:43 GMT</pubDate><ttl>60</ttl><item><title>这次做portal的一些总结（二）</title><link>http://www.blogjava.net/pesome/archive/2006/12/13/87468.html</link><dc:creator>pesome</dc:creator><author>pesome</author><pubDate>Wed, 13 Dec 2006 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/pesome/archive/2006/12/13/87468.html</guid><wfw:comment>http://www.blogjava.net/pesome/comments/87468.html</wfw:comment><comments>http://www.blogjava.net/pesome/archive/2006/12/13/87468.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/pesome/comments/commentRss/87468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pesome/services/trackbacks/87468.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接着前面的写。上文主要写了</span>
				<span lang="EN-US">ajax</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span>
				<span lang="EN-US">portal</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的使用，这篇写集群方面的体会。现在比较流行的架构就是前端</span>
				<span lang="EN-US">F5</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做负载均衡，后面</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">台</span>
				<span lang="EN-US">websphere server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做成集群，各自都有</span>
				<span lang="EN-US">HttpServer</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，每个</span>
				<span lang="EN-US">HttpServer</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都向</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">台</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做转发。这样每台都能独立完成从</span>
				<span lang="EN-US">HttpServer</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的流程。一台出现故障，</span>
				<span lang="EN-US">F5</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先进行切换，只向正常</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">HttpServer</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">发起请求，这台</span>
				<span lang="EN-US">HttpServer</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再进行切换只向同一台</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做转发。这次</span>
				<span lang="EN-US">portal</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是采用的这种架构，不妨称为架构</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另一种简单点的架构就是只做</span>
				<span lang="EN-US">F5</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">负载均衡，不做</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集群，每台</span>
				<span lang="EN-US">websphere server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的</span>
				<span lang="EN-US">HttpServer</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接受</span>
				<span lang="EN-US">F5</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转发的请求，只向本</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转发。这样每台</span>
				<span lang="EN-US">websphere server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保持独立，相互间没有数据交换和转发。不妨称为架构</span>
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">各有优劣，适合不同的需要，下面进行些比较：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从应用部署上看：</span>
						<span lang="EN-US">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用了</span>
				<span lang="EN-US">websphere</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集群，由一个</span>
				<span lang="EN-US">DeployManager</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行分发，部署应用，只需部署一次，由</span>
				<span lang="EN-US">DM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分发到几个节点上。而</span>
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每个</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都是独立的，部署应用只能一台台部署，如果</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">较少差别还不明显，如果达到</span>
				<span lang="EN-US">10</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">台以上，一台台部署将是一个比较痛苦的事情。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从</span>
						<span lang="EN-US">session</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上看：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用了</span>
				<span lang="EN-US">websphere</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集群，可以使用集群提供的</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复制，对于一些关键应用（某台服务器宕机，</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也必须保持的应用）很有必要。而对于一些能够允许</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">丢失的应用，才可以使用</span>
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。当然</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也可以关闭</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复制，因为</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复制不管是使用数据库方式还是内存方式，总会消耗一定的性能。具体消耗多少性能，就要看不同的</span>
				<span lang="EN-US">application server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复制方案了，想深入了解，可以看集群方面的文档，我也只记得一个比较简单的</span>
				<span lang="EN-US">round robbin</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从架构复杂性看：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更为简单，因为没有</span>
				<span lang="EN-US">DM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的概念，每台</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都保持独立。而使用了</span>
				<span lang="EN-US">DM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有时也会出现莫名奇妙的问题，这当然是由于不了解</span>
				<span lang="EN-US">DM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的机制所致，但总归也增加了复杂度，这点在后面的教训中进行说明。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从水平扩展性上看：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">肯定更胜一筹。只要</span>
				<span lang="EN-US">F5</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能支持，多少台</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都没关系。而</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多台</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做集群，要看</span>
				<span lang="EN-US">websphere</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持的节点数量，应该不会太大。这个如果哪位同学知道，敬请告知。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然</span>
				<span lang="EN-US">A</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">B</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在服务器较多的情况下是可以共存的，可以考虑几台机器做集群，然后集群间做负载均衡，这样既可以减少部署的复杂度，又可以带来较好的水平扩展。由于没做过更大型的项目，这个也只是我的假象，请做过的同学斧正。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说一说集群中碰到的问题。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先是对各节点的同步：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有时为了方便测试，我们只对其中一个节点进行更改，测试通过再放到其它节点。而如果测试周期较长，有时就会造成节点的不同步，出现各种各样莫名其妙的问题。一个经验就是：<b style="mso-bidi-font-weight: normal">无论如何，在每天下班前要保证各节点的同步，不同步的现象不要过夜。</b></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后是对</span>
						<span lang="EN-US">DM</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的理解：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我现在还只是实践阶段，没有看过相关文档。从意义上看，它控制了相关的配置文件，如果进行节点同步，就会由它把配置文件同步到它管理的节点上。这对配置文件的修改提出了要求。我们开始只修改节点的配置文件而没有修改</span>
				<span lang="EN-US">DM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，结果进行节点同步就会覆盖修改的配置文件，带来很多不必要的工作。经验就是：<b style="mso-bidi-font-weight: normal">或者修改</b></span>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US">DM</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的配置文件，然后进行节点同步，或者直接同时修改所有节点和</span>
						<span lang="EN-US">DM</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt">
				<span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings">
						<span style="mso-list: Ignore">Ø<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有关于</span>
						<span lang="EN-US">cache</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">Cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是性能优化的一个有效手段。在单机环境下，最简单的就是内存</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使用</span>
				<span lang="EN-US">static</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">Map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就行。而在集群环境中，</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就变的比较复杂了。首先还是从应用需求入手，是否要保持每台机器的</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同步。如果只是信息展示等要求不高的</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不需保证</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的同步，问题也比较简单，自己写内存</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，或者使用开源的</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件如</span>
				<span lang="EN-US">ehcache,oscache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等就可以很好的解决问题。而如果需要</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在几个节点保持同步，就需要特殊的机制了，</span>
				<span lang="EN-US">ehcache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等号称支持分布式</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但好像需要</span>
				<span lang="EN-US">jgroup</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，配置比较麻烦，我没有用过，有用过的同学请指教。我本来想使用</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存，然后进行</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同步，后来</span>
				<span lang="EN-US">IBM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建议使用数据库</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即自己写代码，</span>
				<span lang="EN-US">cache</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在数据库中。这样不需要</span>
				<span lang="EN-US">session</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同步，对象不大，性能也能得到保证，现在用下来效果还可以。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/pesome/aggbug/87468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pesome/" target="_blank">pesome</a> 2006-12-13 13:39 <a href="http://www.blogjava.net/pesome/archive/2006/12/13/87468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>openfans领域模型驱动的尝试</title><link>http://www.blogjava.net/pesome/archive/2006/05/22/47516.html</link><dc:creator>pesome</dc:creator><author>pesome</author><pubDate>Mon, 22 May 2006 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/pesome/archive/2006/05/22/47516.html</guid><wfw:comment>http://www.blogjava.net/pesome/comments/47516.html</wfw:comment><comments>http://www.blogjava.net/pesome/archive/2006/05/22/47516.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/pesome/comments/commentRss/47516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pesome/services/trackbacks/47516.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">领域模型驱动（</span>
				<span lang="EN-US">Domain Driven Design</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），很热的名词。</span>
				<span lang="EN-US">Openfans</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不太热的网站。今天俺就借着很热的</span>
				<span lang="EN-US">ddd</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，给不太热的</span>
				<span lang="EN-US">openfans</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再造点势。</span>
				<span lang="EN-US">Openfans</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就不多介绍了，网站用</span>
				<span lang="EN-US">spring+hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为核心的一堆开源软件构建。有了</span>
				<span lang="EN-US">spring</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">IOC</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">ORM</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，打着</span>
				<span lang="EN-US">ddd</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的旗号也就名正言顺了很多。先声明其实俺对</span>
				<span lang="EN-US">ddd</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的理解也多是道听途说，没有什么系统的学习过，倒是和</span>
				<span lang="EN-US">Joe</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阿牛讨论过几次，颇有受益，他对这个理解还是很深刻的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">言归正传，就讲</span>
				<span lang="EN-US">openfans</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在经</span>
				<span lang="EN-US">ddd</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">思想改造过的模型。整体上看还是普通的三层架构体系：展现层、业务层、持久层。展现层用</span>
				<span lang="EN-US">spring mvc</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，力图做到只是展示相关，避免出现业务逻辑。再具体细分，就是</span>
				<span lang="EN-US">jsp</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面只有展示逻辑，主要使用</span>
				<span lang="EN-US">jstl</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">完成显示功能。</span>
				<span lang="EN-US">Controller</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">负责从页面获得参数、把数据传回页面、控制页面流传和调用业务层的接口。持久层使用</span>
				<span lang="EN-US">hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在设计上我不是按</span>
				<span lang="EN-US">dao</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方式为每个对象建立相应的</span>
				<span lang="EN-US">dao</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也不是</span>
				<span lang="EN-US">ddd</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">推荐的每个</span>
				<span lang="EN-US">domain</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个</span>
				<span lang="EN-US">repository</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而是分成了</span>
				<span lang="EN-US">Persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">Fetcher2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个接口。</span>
				<span lang="EN-US">Persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理持久相关如</span>
				<span lang="EN-US">save</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">remove</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，</span>
				<span lang="EN-US">Fetcher</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则处理</span>
				<span lang="EN-US">get</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相关。这样分的原因也很简单，</span>
				<span lang="EN-US">persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是很稳固的，对象都可以共用一个接口如</span>
				<span lang="EN-US">save</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Object</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），而</span>
				<span lang="EN-US">fetcher</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就千变万化，需要分页、排序等接口。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样设计是与业务层架构相关的。我采用的是</span>
				<span lang="EN-US">domain</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象（简称</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span>
				<span lang="EN-US">+</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一层薄薄</span>
				<span lang="EN-US">façade</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式。</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理自身的逻辑，包括持久功能。本身</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是没有持久能力的，需要依靠注入的</span>
				<span lang="EN-US">persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，这里就体现按</span>
				<span lang="EN-US">Persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">Fetcher</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分开的一个好处，</span>
				<span lang="EN-US">persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所有</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以共用一个，给编程带来了方便。</span>
				<span lang="EN-US">Openfans</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中采用的是</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">继承一个抽象</span>
				<span lang="EN-US">PersistentObject</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的方式，这样</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方便的获得了注入的能力和持久的能力。这样做有何优缺点还需要做些讨论，为了方便我也就先这么用。</span>
				<span lang="EN-US">PersistentObject</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码如下：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">public abstract class PersistentObject implements NeedPersist {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>private Persistence persistence;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>public void save() {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>persistence.save(this);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>public void remove() {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>persistence.remove(this);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>public void setPersistence(Persistence persistence) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>this.persistence = persistence;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>public Persistence getPersistence() {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 2">              </span>return persistence;</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只需要注入</span>
				<span lang="EN-US">persistence</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就获得了持久的能力，而且可以把这种能力往下传递。</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得了持久能力，就有点接近富血模型的想法了，他能够处理一些业务，做持久然后调用引用对象的业务和持久方法</span>
				<span lang="EN-US">(</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从另外的角度看持久与业务其实是分不开的</span>
				<span lang="EN-US">)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这样把业务封装在了领域本身，更适于用领域对象出发的方式去思考问题。领域层的</span>
				<span lang="EN-US">façade</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要是为了</span>
				<span lang="EN-US">Transaction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理和隐藏</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口。这样</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的业务方法都可以设置成</span>
				<span lang="EN-US">friendly</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，仅相互间可见。</span>
				<span lang="EN-US">Façade</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就放在</span>
				<span lang="EN-US">domain</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包中，它负责给</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注入</span>
				<span lang="EN-US">persistence bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，调用</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的接口，提供给</span>
				<span lang="EN-US">controller</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个</span>
				<span lang="EN-US">use case</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">级别的接口，同时它也代理</span>
				<span lang="EN-US">fetcher</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的接口。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有了这个架构，实现起来也不复杂，要配置的</span>
				<span lang="EN-US">bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">很少（现在还没有使用</span>
				<span lang="EN-US">spring 2.0</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置在容器中）。设计就从</span>
				<span lang="EN-US">DO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出发，明确它的属性和方法，让</span>
				<span lang="EN-US">hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己生成数据库表。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样设计也算是一次尝试吧，其中肯定有很多考虑不周的地方，需要不断的讨论和改进。</span>
		</p>
<img src ="http://www.blogjava.net/pesome/aggbug/47516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pesome/" target="_blank">pesome</a> 2006-05-22 18:28 <a href="http://www.blogjava.net/pesome/archive/2006/05/22/47516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log,exception最佳实践</title><link>http://www.blogjava.net/pesome/archive/2006/01/18/28502.html</link><dc:creator>pesome</dc:creator><author>pesome</author><pubDate>Wed, 18 Jan 2006 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/pesome/archive/2006/01/18/28502.html</guid><wfw:comment>http://www.blogjava.net/pesome/comments/28502.html</wfw:comment><comments>http://www.blogjava.net/pesome/archive/2006/01/18/28502.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/pesome/comments/commentRss/28502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pesome/services/trackbacks/28502.html</trackback:ping><description><![CDATA[<P class=MMTopic1 style="MARGIN: 17pt 0cm 16.5pt; TEXT-INDENT: 0cm"><FONT size=6><STRONG><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=4><FONT size=5>项目组对log和exception的讨论结果。希望更多的人参与讨论。</FONT><BR></FONT>1 </SPAN></SPAN><SPAN lang=EN-US>log</SPAN></STRONG></FONT></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1.1 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log.error</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">表示系统级错误</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1.2 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log.warn</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">表示应用级错误</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1.3 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">服务初始化或结束用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log.info<o:p></o:p></FONT></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1.4 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log.debug</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">替代</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>out</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>debug</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">要判断</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>isDebugEnable<o:p></o:p></FONT></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1.5 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log.warn("",e)</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">替代</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>e.printstack<o:p></o:p></FONT></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>1.6 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log4e</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">生成</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">相关代码</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><FONT face=Arial><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore">1.7 </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">Log</SPAN></FONT><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">信息要保证可读性，需记录现场信息，如当前处理</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>id</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">等</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic1 style="MARGIN: 17pt 0cm 16.5pt; TEXT-INDENT: 0cm"><FONT size=6><STRONG><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2 </SPAN></SPAN><SPAN lang=EN-US>exception</SPAN></STRONG></FONT></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><FONT face=Arial><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore">2.1 </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">try catch</SPAN></FONT><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">内的代码不要太长</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.2 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">因为性能原因，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>try catch</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">少放循环内</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.3 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">尽量避免</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>catch(Exception)</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">这样的写法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.4 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">不同模块定义不同的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>exception<o:p></o:p></FONT></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.5 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">建议创建应用的基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>exception</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，特别是有定义</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>error code</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">需要的应用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.6 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">只要</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>catch</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">就要</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log error message<o:p></o:p></FONT></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><FONT face=Arial><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore">2.7 </SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">catch</SPAN></FONT><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">并封装成另一种</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>exception</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，如果不</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>nest</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">原来的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>exception</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">就要</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>log stackTrace<o:p></o:p></FONT></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.8 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">持久层</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>throw dataAccessException</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，业务层</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>throw checked exception</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">，展现层只显示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>exception</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">信息</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MMTopic2 style="MARGIN: 13pt 0cm; TEXT-INDENT: 0cm"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; mso-bidi-font-family: Arial; mso-fareast-font-family: Arial"><SPAN style="mso-list: Ignore"><FONT face=Arial>2.9 </FONT></SPAN></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">规范的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><FONT face=Arial>exception</FONT></SPAN><SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%; FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">流程定义如下：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%"><o:p></o:p></SPAN></STRONG></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">业务层不需处理的</SPAN><SPAN lang=EN-US>runtime exception</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，由展现层定义的</SPAN><SPAN lang=EN-US>exception controller</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">捕获，交给相应的</SPAN><SPAN lang=EN-US>error</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面显示并记录</SPAN><SPAN lang=EN-US>stack</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">信息。业务层捕获下层的</SPAN><SPAN lang=EN-US>exception</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，并封装成业务层的</SPAN><SPAN lang=EN-US>checked exception</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果</SPAN><SPAN lang=EN-US>nest</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所捕获的</SPAN><SPAN lang=EN-US>exception</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，则仅</SPAN><SPAN lang=EN-US>log error message</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果不</SPAN><SPAN lang=EN-US>nest</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就需要用</SPAN><SPAN lang=EN-US>log.warn(“”,e)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">记录</SPAN><SPAN lang=EN-US>stack</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">信息。展现层捕获业务层的</SPAN><SPAN lang=EN-US>exception</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，应由处理业务层</SPAN><SPAN lang=EN-US>exception</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>error</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面来处理。</SPAN></P><img src ="http://www.blogjava.net/pesome/aggbug/28502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pesome/" target="_blank">pesome</a> 2006-01-18 15:39 <a href="http://www.blogjava.net/pesome/archive/2006/01/18/28502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统架构的思考</title><link>http://www.blogjava.net/pesome/archive/2005/11/24/21333.html</link><dc:creator>pesome</dc:creator><author>pesome</author><pubDate>Thu, 24 Nov 2005 11:25:00 GMT</pubDate><guid>http://www.blogjava.net/pesome/archive/2005/11/24/21333.html</guid><wfw:comment>http://www.blogjava.net/pesome/comments/21333.html</wfw:comment><comments>http://www.blogjava.net/pesome/archive/2005/11/24/21333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pesome/comments/commentRss/21333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pesome/services/trackbacks/21333.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天跟</SPAN><SPAN lang=EN-US>SUN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的高级工程师有了些交流，感触颇多。首先要谈到它的一个产品（其实不能叫产品）</SPAN><SPAN lang=EN-US>JEF</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也就是</SPAN><SPAN lang=EN-US>Java Enterprise Framework</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US>JEF</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以说是很多框架和组件的有机结合，有</SPAN><SPAN lang=EN-US>opensource</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，有商业的，也有</SPAN><SPAN lang=EN-US>sun</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自己写的，其实也是</SPAN><SPAN lang=EN-US>SUN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在多个大规模项目中不断实践的基础上发展起来的。它通过定义良好的分层和封装，能够提供应用开发非常坚实的基础。下图是</SPAN><SPAN lang=EN-US>JEF</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的整体架构图：<BR><BR><IMG height=277 alt=r_clip_image002.gif src="http://www.blogjava.net/images/blogjava_net/pesome/5223/r_clip_image002.gif" width=624 border=0><BR><BR></SPAN><SPAN lang=EN-US><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"> <IMG height=1 src="/FreeTextBox/Utility/spacer.gif" width=1><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></SPAN><BR><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有机会再进行对它整体架构和各个组件功能的详谈吧。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再谈一谈对真正的系统架构师的认识。</SPAN><SPAN lang=EN-US>JEF</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个主要设计者我都见过了，都是香港人，都温文尔雅，学识渊博，经验丰富。能够聆听它们对软件架构的理解，对项目实际问题的分析和解决，真的是受益匪浅，对自己将来进行设计时思考问题的深度和广度都有很大的提高。这才是真正的架构师！他需要对各种框架，组件都了如指掌，在面对具体的项目需求时能正确的选择最适用的技术；他需要对软件整体架构有清晰的认识和理解，知道在面对实际项目时该使用何种架构，包括</SPAN><SPAN lang=EN-US>thin client</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是</SPAN><SPAN lang=EN-US>rich client</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>with EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是</SPAN><SPAN lang=EN-US>without EJB</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等；他需要有一种严谨求证的性格，对任何东西不是盲目下结论，而是根据具体的分析和实证进行取舍。。。。。。通往真正的架构师的路还很长，需要经历的项目，需要做的事情还很多。我们不能盲目尊大（拿</SPAN><SPAN lang=EN-US>spring</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＋</SPAN><SPAN lang=EN-US>hibernate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做个小项目就以为很牛），也不能丧失信心（经验和领会都是靠项目做出来的）。我们应该时刻保持向上的心态，去主动参与项目，去沟通，去交流，去总结，去思考。即使将来成不了真正的架构师，我们也可以自豪的说：“我每一步都是踏实的走下来的，我每一个项目都是用心在做的，我的代码都是注释详实，简单易懂，为后来者提供很好的可重用基础的而不是被人咒骂的，我做的是可用的软件而不是垃圾软件。”希望与所有有志于成为真正的系统架构师的同学共勉。</SPAN></P><img src ="http://www.blogjava.net/pesome/aggbug/21333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pesome/" target="_blank">pesome</a> 2005-11-24 19:25 <a href="http://www.blogjava.net/pesome/archive/2005/11/24/21333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>