??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲精彩视频,亚洲精品视频在线观看免费,亚洲精品无码永久中文字幕http://m.tkk7.com/conans/category/32375.html你越挣扎我就兴?/description>zh-cnFri, 12 Mar 2010 03:01:55 GMTFri, 12 Mar 2010 03:01:55 GMT60JSP面~存技?-览器缓?/title><link>http://m.tkk7.com/conans/articles/314962.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Tue, 09 Mar 2010 08:20:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/314962.html</guid><description><![CDATA[<p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-family: 宋体;">一、概q?/span></p> <p><span style="font-size: 12pt; font-family: 宋体;">    ~?/span><span style="font-family: 宋体;">存的思想可以应用在Y件分层的各个层面。它是一U内部机Ӟ对外界而言Q是不可感知的?/span></p> <p><span style="font-family: 宋体;">    数据库本w有~存Q?span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">持久?/span>也可以缓存。(比如Q?/span><font face="Times New Roman">hibernate</font><span style="font-family: 宋体;">Q还?/span><font face="Times New Roman">1</font><span style="font-family: 宋体;">U和</span><font face="Times New Roman">2</font><span style="font-family: 宋体;">U缓存)</span></p> <p><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; font-family: 宋体;"><font style="background-color: #ffffff;">    </font>业务?/span><span style="font-family: 宋体;">也可以有~存Q但一般来_q是一个过E域Q不会设~存Q?/span></p> <p><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; font-family: 宋体;"><font style="background-color: #ffffff;" color="#ffffff">    </font>表现?/span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><font face="Times New Roman">/</font></span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; font-family: 宋体;">数据服务?/span><span style="font-family: 宋体;">Q传l?/span><font face="Times New Roman">web</font><span style="font-family: 宋体;">的表现层Q也可以讄~存Q?/span><font face="Times New Roman">jsp cache </font><span style="font-family: 宋体;">是q一层,实现?/span><font face="Times New Roman">app server</font><span style="font-family: 宋体;">上的~存机制Q?/span></p> <p><span style="font-family: 宋体;">    另外</span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><font face="Times New Roman">Browser</font></span><span style="font-family: 宋体;">也有~存Q如</span><font face="Times New Roman">IE</font><span style="font-family: 宋体;">Q这个大家也都知道(实现?/span><font face="Times New Roman"> web server </font><span style="font-family: 宋体;">上的~存机制Q。越上层的缓存效果越好,底层的~存影响深q?/span></p> <p><font face="Times New Roman"> </font><span style="font-family: 宋体;">二、缓存实玎ͼ</span><span style="font-size: 12pt; font-family: 宋体;">览器缓存当前访问的JSP动态页?/span><span style="font-family: 宋体;">Q?/span> </p> <p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-family: 宋体;">Q一Q、服务端ҎQ?/span></p> <ol> <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 12pt; font-family: 宋体;"><Q?  </span></li> <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">response.setHeader("Pragma","No-cache");    </span></li> <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">response.setHeader("Cache-Control","no-cache");    </span></li> <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">response.setDateHeader("Expires", -<span style="color: #c00000;">10</span>);   </span></li> <li style="margin: 0cm 0cm 0pt; text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">Q?gt;  </span></li> </ol> <p style="margin: 0cm 0cm 0pt;" class="MsoNormal"><span style="font-family: 宋体;">Q二Q、客LҎQ?/span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt;" class="MsoNormal"><font face="Times New Roman">meta</font><span style="font-family: 宋体;">是用来在</span><font face="Times New Roman">HTML</font><span style="font-family: 宋体;">文中模?/span><font face="Times New Roman">HTTP</font><span style="font-family: 宋体;">协议的响应头报文?/span><font face="Times New Roman">meta </font><span style="font-family: 宋体;">标签用于|页的<</span><font face="Times New Roman">head</font><span style="font-family: 宋体;">Q与Q?/span><font face="Times New Roman">/head</font><span style="font-family: 宋体;">Q中Q?/span><font face="Times New Roman">meta </font><span style="font-family: 宋体;">标签的用处很多?/span><font face="Times New Roman">meta </font><span style="font-family: 宋体;">的属性有两种Q?/span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><font face="Times New Roman">name</font></span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; font-family: 宋体;">?/span><span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;"><font face="Times New Roman">http-equiv</font></span><span style="font-family: 宋体;">?/span><font face="Times New Roman">name</font><span style="font-family: 宋体;">属性主要用?span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">描述|页</span>Q对应于</span><font face="Times New Roman">content</font><span style="font-family: 宋体;">Q网内容)Q?span style="background: #d9d9d9 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">以便于搜索引擎机器h查找、分c?/span>Q目前几乎所有的搜烦引擎都用网上机器h自动查找</span><font face="Times New Roman">meta</font><span style="font-family: 宋体;">值来l网分c)。这其中<span style="color: #33cccc;">最重要的是</span></span><span style="color: #33cccc;"><font face="Times New Roman">description</font></span><span style="color: #33cccc; font-family: 宋体;">Q站点在搜烦引擎上的描述Q和</span><span style="color: #33cccc;"><font face="Times New Roman">keywords</font></span><span style="color: #33cccc; font-family: 宋体;">Q分cd键词Q?/span><span style="font-family: 宋体;">Q所以应该给每页加一?/span><font face="Times New Roman">meta</font><span style="font-family: 宋体;">倹{比较常用的有以下几个:</span><font face="Times New Roman"> <br /> name </font><span style="font-family: 宋体;">属?/span><font face="Times New Roman"> <br /> 1</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta name="Generator" contect=""</font><span style="font-family: 宋体;">Q用以说明生成工P?/span><font face="Times New Roman">Microsoft FrontPage 4.0</font><span style="font-family: 宋体;">Q等Q?/span><font face="Times New Roman"> <br /> 2</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta name="KEYWords" contect=""</font><span style="font-family: 宋体;">Q向搜烦引擎说明你的|页的关键词Q?/span><font face="Times New Roman"> <br /> 3</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta name="DEscription" contect=""</font><span style="font-family: 宋体;">Q告诉搜索引擎你的站点的主要内容Q?/span><br /> <font face="Times New Roman">4</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta name="Author" contect="</font><span style="font-family: 宋体;">你的姓名</span><font face="Times New Roman">"</font><span style="font-family: 宋体;">Q告诉搜索引擎你的站点的制作的作者;</span><br /> <font face="Times New Roman">5</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta name="Robots" contect="all|none|index|noindex|follow|nofollow"</font><span style="font-family: 宋体;">Q?/span><font face="Times New Roman"> <br /> <br /> </font><span style="font-family: 宋体;">其中的属性说明如下:</span><font face="Times New Roman"> <br /> </font><span style="font-family: 宋体;">讑֮?/span><font face="Times New Roman">all</font><span style="font-family: 宋体;">Q文件将被检索,且页面上的链接可以被查询Q?/span><font face="Times New Roman"> <br /> </font><span style="font-family: 宋体;">讑֮?/span><font face="Times New Roman">none</font><span style="font-family: 宋体;">Q文件将不被索,且页面上的链接不可以被查询;</span><br /> <span style="font-family: 宋体;">讑֮?/span><font face="Times New Roman">index</font><span style="font-family: 宋体;">Q文件将被检索;</span><font face="Times New Roman"> <br /> </font><span style="font-family: 宋体;">讑֮?/span><font face="Times New Roman">follow</font><span style="font-family: 宋体;">Q页面上的链接可以被查询Q?/span><br /> <span style="font-family: 宋体;">讑֮?/span><font face="Times New Roman">noindex</font><span style="font-family: 宋体;">Q文件将不被索,但页面上的链接可以被查询Q?/span><font face="Times New Roman"> <br /> </font><span style="font-family: 宋体;">讑֮?/span><font face="Times New Roman">nofollow</font><span style="font-family: 宋体;">Q文件将不被索,面上的链接可以被查询?/span><font face="Times New Roman"> <br /> <br /> http-equiv</font><span style="font-family: 宋体;">属?/span><font face="Times New Roman"> <br /> 1</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80"</font><span style="font-family: 宋体;">Q?/span><font face="Times New Roman"> <br /> </font><span style="font-family: 宋体;">?/span><span style="font-family: 宋体;">Q?/span><font face="Times New Roman">meta http-equiv="Content-Language" contect="zh-CN"</font><span style="font-family: 宋体;">Q用以说明主制作所使用的文字以及语aQ又如英文是</span><font face="Times New Roman">ISO-8859-1</font><span style="font-family: 宋体;">字符集,q有</span><font face="Times New Roman">BIG5</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">utf-8</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">shift-Jis</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">Euc</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">Koi8-2</font><span style="font-family: 宋体;">{字W集Q?/span><font face="Times New Roman"> <br /> 2</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="Refresh" contect="n;url=http://yourlink"</font><span style="font-family: 宋体;">Q定时让|页在指定的旉</span><font face="Times New Roman">n</font><span style="font-family: 宋体;">内,跌{到页?/span><font face="Times New Roman">http;//yourlink</font><span style="font-family: 宋体;">Q?/span><br /> <font face="Times New Roman">3</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT"</font><span style="font-family: 宋体;">Q可以用于设定网늚到期旉Q一旦过期则必须到服务器上重新调用。需要注意的是必M?/span><font face="Times New Roman">GMT</font><span style="font-family: 宋体;">旉格式Q?/span><br /> <font face="Times New Roman">4</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="Pragma" contect="no-cache"</font><span style="font-family: 宋体;">Q是用于讑֮止览器从本地机的~存中调阅页面内容,讑֮后一旦离开|页无法从</span><font face="Times New Roman">Cache</font><span style="font-family: 宋体;">中再调出Q?/span><font face="Times New Roman"> <br /> 5</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT"</font><span style="font-family: 宋体;">Q?/span><font face="Times New Roman">cookie</font><span style="font-family: 宋体;">讑֮Q如果网过期,存盘?/span><font face="Times New Roman">cookie</font><span style="font-family: 宋体;">被删除。需要注意的也是必须使用</span><font face="Times New Roman">GMT</font><span style="font-family: 宋体;">旉格式Q?/span><font face="Times New Roman"> <br /> 6</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="Pics-label" contect=""</font><span style="font-family: 宋体;">Q网늭U评定,?/span><font face="Times New Roman">IE</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">internet</font><span style="font-family: 宋体;">选项中有一内容设|,可以防止览一些受限制的网站,而网站的限制U别是通过</span><font face="Times New Roman">meta</font><span style="font-family: 宋体;">属性来讄的;</span><font face="Times New Roman"> <br /> 7</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="windows-Target" contect="_top"</font><span style="font-family: 宋体;">Q强刉面在当前H口中以独立面昄Q可以防止自q|页被别人当作一?/span><font face="Times New Roman">frame</font><span style="font-family: 宋体;">调用;</span><br /> <font face="Times New Roman">8</font><span style="font-family: 宋体;">、<</span><font face="Times New Roman">meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)"</font><span style="font-family: 宋体;">Q和Q?/span><font face="Times New Roman">meta http-equiv="Page-Exit" contect="revealTrans(duration=20</font><span style="font-family: 宋体;">Q?/span><font face="Times New Roman">transtion =6)"</font><span style="font-family: 宋体;">Q设定进入和d面时的Ҏ效果Q这个功能即</span><font face="Times New Roman">FrontPage</font><span style="font-family: 宋体;">中的</span><font face="Times New Roman">“</font><span style="font-family: 宋体;">格式</span><font face="Times New Roman">/</font><span style="font-family: 宋体;">|页q渡</span><font face="Times New Roman">”</font><span style="font-family: 宋体;">Q不q所加的面不能够是一?/span><font face="Times New Roman">frame</font><span style="font-family: 宋体;">面?/span></p> <p><font face="Times New Roman"> </font><font face="Times New Roman"> </font><span style="font-family: 宋体;">三、缓存应?/span></p> <p><span style="font-family: 宋体;">Q一Q、防?/span><font face="Times New Roman">JSP</font><span style="font-family: 宋体;">面~存</span><span style="font-family: 宋体;">Z防止览器缓存当前访问的JSP动态页面,可以采用如下的方式进行设|:<br /> <% <br /> // 过期日期设|ؓ一个过L?/span></p> <p><span style="font-family: 宋体;">response.setHeader("Expires", "</span><span style="font-family: 宋体;">Sat, 6 May 1995</span><span style="font-family: 宋体;">12:00:00 GMT</span><span style="font-family: 宋体;">");</span></p> <p><span style="font-family: 宋体;">// 讄 HTTP/1.1 no-cache ?br /> response.setHeader("Cache-Control", "no-store,no-cache,must-revalidate");</span></p> <p><span style="font-family: 宋体;">// 讄 IE 扩展 HTTP/1.1 no-cache headersQ?用户自己d<br /> response.addHeader("Cache-Control", "post-check=0, pre-check=0");</span></p> <p><span style="font-family: 宋体;">// 讄标准 HTTP/1.0 no-cache header.<br /> response.setHeader("Pragma", "no-cache");<br /> %></span></p> <p><span style="font-family: 宋体;">当然Q每一个页面都包含q些代码会很J琐Q可以通过自定义过滤器QFilterQ的Ҏ来处理相关的面</span><font face="Times New Roman"> </font><font face="Times New Roman"> </font></p> <p><span style="font-family: 宋体;">Q?/span><span style="font-family: 宋体;">二)?/span><font face="Times New Roman">jsp,html </font><span style="font-family: 宋体;">清除面~存</span></p> <p><span style="font-family: 宋体;">1.止客户端缓存要?lt;head>中加入类似如下内容: </span></p> <p><span style="font-family: 宋体;"><META HTTP-EQUIV="pragma" CONTENT="no-cache"> <br /> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <br /> <META HTTP-EQUIV="expires" CONTENT="</span><span style="font-family: 宋体;">Wed, 26 Feb 1997</span><span style="font-family: 宋体;">08:21:57 GMT</span><span style="font-family: 宋体;">"> </span></p> <p><span style="font-family: 宋体;">?/span><span style="color: #333333; font-family: Tahoma;">   <meta http-equiv="pragma" content="no-cache"><br />      <meta http-equiv="cache-control" content="no-cache"><br />      <meta http-equiv="expires" content="0">   </span></p> <p><span style="font-family: 宋体;">2.在服务器的动态网中止~存Q要加入cM如下脚本 </span></p> <p><span style="font-family: 宋体;">response.setHeader("Pragma","No-cache"); <br /> response.setHeader("Cache-Control","no-cache"); <br /> response.setDateHeader("Expires", 0); </span><font face="Times New Roman"> </font></p> <p><span style="font-family: 宋体;">Q三Q设|有限时间的~存</span></p> <p><span style="color: black; font-family: 'Courier New';">    </span><strong><span style="color: #7f0055; font-family: 'Courier New';">int</span></strong><span style="color: black; font-family: 'Courier New';"> minutes = 10;</span></p> <p><span style="color: black; font-family: 'Courier New';">    Date d = </span><strong><span style="color: #7f0055; font-family: 'Courier New';">new</span></strong><span style="color: black; font-family: 'Courier New';"> Date();</span></p> <p><span style="color: black; font-family: 'Courier New';">    String modDate = d.toGMTString();</span></p> <p><span style="color: black; font-family: 'Courier New';">    String expDate = </span><strong><span style="color: #7f0055; font-family: 'Courier New';">null</span></strong><span style="color: black; font-family: 'Courier New';">;</span></p> <p><span style="color: black; font-family: 'Courier New';">    expDate = (</span><strong><span style="color: #7f0055; font-family: 'Courier New';">new</span></strong><span style="color: black; font-family: 'Courier New';"> Date(d.getTime() + minutes * 60000)).toGMTString();</span></p> <p><span style="color: black; font-family: 'Courier New';">    response.setHeader(</span><span style="color: #2a00ff; font-family: 'Courier New';">"Last-Modified"</span><span style="color: black; font-family: 'Courier New';">, modDate);</span></p> <p><span style="color: black; font-family: 'Courier New';">    response.setHeader(</span><span style="color: #2a00ff; font-family: 'Courier New';">"Expires"</span><span style="color: black; font-family: 'Courier New';">, expDate);</span></p> <p><span style="color: black; font-family: 'Courier New';">    response.setHeader(</span><span style="color: #2a00ff; font-family: 'Courier New';">"Cache-Control"</span><span style="color: black; font-family: 'Courier New';">, </span><span style="color: #2a00ff; font-family: 'Courier New';">"public"</span><span style="color: black; font-family: 'Courier New';">); </span><span style="color: #3f7f5f; font-family: 'Courier New';">//   HTTP/1.1</span></p> <p><span style="color: black; font-family: 'Courier New';">    response.setHeader(</span><span style="color: #2a00ff; font-family: 'Courier New';">"Pragma"</span><span style="color: black; font-family: 'Courier New';">, </span><span style="color: #2a00ff; font-family: 'Courier New';">"Pragma"</span><span style="color: black; font-family: 'Courier New';">); </span><span style="color: #3f7f5f; font-family: 'Courier New';">//   HTTP/1.0</span><font face="Times New Roman"> </font><font face="Times New Roman"> </font></p> <p><span style="font-family: 宋体;">补充Q?/span><span style="font-family: 宋体;">关于</span><font face="Times New Roman">.jsp cache</font><span style="font-family: 宋体;">的几条徏?/span><font face="Times New Roman">:</font></p> <p><font face="Times New Roman">1.jsp cache</font><span style="font-family: 宋体;">最好做在过滤器?/span><font face="Times New Roman">,</font><span style="font-family: 宋体;">把需要缓冲的面集中在同一个目录下</span><font face="Times New Roman">,</font><span style="font-family: 宋体;">每次更改只须更改</span><font face="Times New Roman">web.xml</font><span style="font-family: 宋体;">可以完成缓冲设|?/span><font face="Times New Roman">,</font><span style="font-family: 宋体;">q样比较方便</span><font face="Times New Roman">.</font></p> <p><font face="Times New Roman">2.Gzip</font><span style="font-family: 宋体;">压羃可以页面压~得很小</span><font face="Times New Roman">,</font><span style="font-family: 宋体;">q_压羃比ؓ</span><font face="Times New Roman">1/3,jsp cache</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">HashMap</font><span style="font-family: 宋体;">~冲压羃后的面</span><font face="Times New Roman">,</font><span style="font-family: 宋体;">肯定比没压羃前更节约内存消?/span><font face="Times New Roman">,</font><span style="font-family: 宋体;">q且效率更高</span><font face="Times New Roman">.</font><span style="font-family: 宋体;">关于</span><font face="Times New Roman">Gzip</font><span style="font-family: 宋体;">可以参考这个开源项?/span><font face="Times New Roman">:</font><a target="_blank"><span style="color: windowtext; text-decoration: none;"><font face="Times New Roman">http://sourceforge.net/projects/pjl-comp-filter</font></span></a><font face="Times New Roman"> </font><font face="Times New Roman"> <br /> </font></p> <img src ="http://m.tkk7.com/conans/aggbug/314962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2010-03-09 16:20 <a href="http://m.tkk7.com/conans/articles/314962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz CronTrigger最完整配置说明http://m.tkk7.com/conans/articles/302658.htmlCONANCONANTue, 17 Nov 2009 03:27:00 GMThttp://m.tkk7.com/conans/articles/302658.html转自Q?/span>http://m.tkk7.com/xmatthew/archive/2009/02/15/253864.html
CronTrigger配置格式:

格式: [U] [分] [时] [日] [月] [周] [q]

 序号 说明 
 是否必填  允许填写的?/td> 允许的通配W?span class="Apple-converted-space"> 
 1  U?/td>  ?/td>  0-59    , - * /
 2  ?/td>  ?/td>  0-59 
  , - * /
 3  ?/td>  0-23   , - * /
 4  ?/td>  ?/td>  1-31   , - * ? / L W
 5  ?/td>  ?/td>  1-12 or JAN-DEC   , - * /
 6  ?/td>  ?/td>  1-7 or SUN-SAT   , - * ? / L #
 7  q?/td>  ?/td>  empty ?1970-2099  , - * /

通配W说?
* 表示所有? 例如:在分的字D上讄 "*",表示每一分钟都会触发?br /> ? 表示不指定倹{用的场景Z需要关心当前设|这个字D늚倹{例?要在每月?0可发一个操作,但不兛_是周几,所以需要周位置的那个字D设|ؓ"?" 具体讄?0 0 0 10 * ?
- 表示区间。例?在小时上讄 "10-12",表示 10,11,12炚w会触发?br /> , 表示指定多个|例如在周字段上设|?"MON,WED,FRI" 表示周一Q周三和周五触发
/ 用于递增触发。如在秒上面讄"5/15" 表示?U开始,每增15U触?5,20,35,50)?在月字段上设|?1/3'所C每?号开始,每隔三天触发一ơ?br /> L 表示最后的意思。在日字D设|上Q表C当月的最后一?依据当前月䆾Q如果是二月q会依据是否是润q[leap]), 在周字段上表C星期六Q相当于"7"?SAT"。如果在"L"前加上数字,则表C数据的最后一个。例如在周字D上讄"6L"q样的格?则表C?#8220;本月最后一个星期五" 
W 表示L定日期的最q那个工作日(周一臛_?. 例如在日字段上设|?15W"Q表C离每月15hq的那个工作日触发。如?5h好是周六Q则找最q的周五(14?触发, 如果15h周未Q则找最q的下周一(16?触发.如果15h好在工作?周一臛_?Q则在该天触发。如果指定格式ؓ "1W",它则表示每月1号往后最q的工作日触发。如?h是周六,则将?号下周一触发?注,"W"前只能设|具体的数字,不允许区?-").
提C?br />

'L'?'W'可以一l合使用。如果在日字D上讄"LW",则表C在本月的最后一个工作日触发(一般指发工?img src="/CuteSoft_Client/CuteEditor/images/emteeth.gif" alt="" align="absmiddle" border="0" /> 

# 序号(表示每月的第几个周几)Q例如在周字D上讄"6#3"表示在每月的W三个周?注意如果指定"#5",正好W五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不q了)
提C?br />

周字D늚讄Q若使用英文字母是不区分大小写的 MON 与mon相同.


        
常用CZ:
  
0 0 12 * * ? 每天12点触?/td>
0 15 10 ? * * 每天10?5分触?/td>
0 15 10 * * ? 每天10?5分触?/td>
0 15 10 * * ? * 每天10?5分触?/td>
0 15 10 * * ? 2005 2005q每?0?5分触?/td>
0 * 14 * * ? 每天下午?2点到2?9分每分触?/td>
0 0/5 14 * * ? 每天下午?2点到2?9?整点开始,每隔5分触?
0 0/5 14,18 * * ? 每天下午?2点到2?9?整点开始,每隔5分触?
每天下午?18点到18?9?整点开始,每隔5分触?
0 0-5 14 * * ? 每天下午?2点到2?5分每分触?/td>
0 10,44 14 ? 3 WED 3月分每周三下午的 2?0分和2?4分触?/td>
0 15 10 ? * MON-FRI 从周一到周五每天上午的10?5分触?/td>
0 15 10 15 * ? 每月15号上?0?5分触?/td>
0 15 10 L * ? 每月最后一天的10?5分触?/td>
0 15 10 ? * 6L 每月最后一周的星期五的10?5分触?/td>
0 15 10 ? * 6L 2002-2005 ?002q到2005q每月最后一周的星期五的10?5分触?/td>
0 15 10 ? * 6#3 每月的第三周的星期五开始触?/td>
0 0 12 1/5 * ? 每月的第一个中午开始每?天触发一?/td>
0 11 11 11 11 ? 每年?1?1?11?1分触?光棍?


CONAN 2009-11-17 11:27 发表评论
]]>
web会话状态维?/title><link>http://m.tkk7.com/conans/articles/299650.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sun, 25 Oct 2009 02:59:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/299650.html</guid><description><![CDATA[如果你对以下问题感兴但是又不能切的回{,你就应该阅读此文Q? <br /> 1.Session是什么? <br /> 2.Cookie又是什么? <br /> 3.如果完全用了CookiesQSessionqv作用吗? <br /> 4.Z么有的网站登录一ơ以后就不用再登? <br /> 5.ASP中的Session是否依赖Cookie? <br /> 6.JSP中的Session是否依赖Cookie? <br /> 7.ASP.NET中的Session又是怎么回事? <br /> <br /> 下面详l的讲述会话状态的l持,看完之后你应该可以回{上面的几个问题? <br /> 1.Session和Cookie的由? <br /> q里我不区分Cookie和Cookies,只是一个复数Ş式而已.我们都知道http是无状态的协议,是说每ơ请求都是分开的,服务器根本不 知道两次h是否是同一个h,如果我们的内Ҏ完全公开?也就是所有内容谁都可以看(比如sina的新?,q种情况呀Ҏ没有必要知道两ơ请求是? 是同一?但是大部分情况下我们不希望这?我们希望只有会员d之后才能讉K(所有的论坛几乎都是q样).而其他h不允总们反?于是便要知道每次? 求的是不是同一个h,q就是会?也就是一个Session,而且q个Session是以Cookie为基?Cookie最才是|景公司提出?也叫 甜? <br /> 服务器端Ҏ个请求维持一个会?q且有一个唯一的SessionID.如果客户端没有禁用Cookie的话,客户W一ơ请求的时候这个ID? 写到客户端的盘?不相?看一下文件夹C:\Documents and Settings\UserName\Local Settings\Temporary Internet Files 下的Cookie文g,都是文本文g).以后你每ơ请求的时候都会加上这个ID?服务器端可以知道是不是同一个请求了.如果q不怿的话,你可以这? 做个试验: <br /> 1.选择一个你要用用户名登录的|站(最好是ASP?如论?. <br /> 2.先正常登录一?定可以d,再把览器关? <br /> 3.选择Internet选项(IE属性页),选择隐藏选项?把设|调到最?定. <br /> 4.重新开IE,d你刚才登录过的站?怎么登都{不上去? <br /> <br /> 2.Session和Cookie的关p? <br /> 当前l持会话状态的途径有且只有两种U? <br /> W一U?Cookie,最常见?95%以上的会话都是Cookie的功? <br /> W二U?URL重写,把SessionID附加到URL?JSP实现了但用的不多. <br /> 如果你用qsession,你可能很奇?我们一般都是用sessionl持会话,q里怎么没有? <br /> {案很简?上面两种都是途径,Session是我们的目的.一句话概括Session和Cookie的关p?Cookie是维持Session最常见的一U途径. <br /> <br /> 3.Cookie的过期和Session的超? <br /> 你可以自p|Cookie的过?其实是服务器替你讄?,如果你设|ؓ用不q期, <br /> 以后都不用再重新登陆了,如果q台机器׃一个h用完全可以这栯|?否则 <br /> 最好不要这栯|?如果你很长时间没有反?是没有新的h,Session有可能 <br /> q期,你可能遇到这L情况:明明已经d?q了一会儿回来却说我没有登? <br /> 提示重新d.是因ؓSessionq期?服务器可以设|过期的旉. <br /> <br /> 4.用了Cookie如何实现会话 <br /> 如果客户端完全禁用Cookie,会发生什么现? <br /> 对于ASP,无法跟踪会话,也就是每个请求都当作新的h. <br /> 对于JSP,可以通过重写URL实现会话,session.encodeURL(String path) <br /> session.encodeURL("index.jsp")=index.jsp;jsessionid=431D980051204FC8DC3 <br />                                                             BF75840F7AF71 <br /> 可以看到后面的sessionidq没有包括在QueryString??后面) <br /> 对于ASP.NET 同样支持重写URL,学习JSP?不过JSPq不是所有的WebServer都支持重写URL <br /> 5.QueryString和HiddenForm <br /> 你可能觉得他们也可以l持会话Q但是事实上是不可以的,他们只能传递参数。不q在ASP.NET中的服务器事件模型广泛了使用了Hidden来表C控件的viewState(q个也是ASP.NET比ASP,JSP先进的地?是一U全新的技? <br /> Z么他们只能传递参数而不能实C话呢?大致q程是这L: <br /> 服务器接收到一个请?如果没有获得SessionID,׃生一个新的会?可能你认样可以保持会?url?sessionid=234234234234. <br /> q是一个误?因ؓ服务器已l处在一个新的会话中?只不q可以获得上ơ会话的ID可已. <br /> <br /> 6.QueryString和HiddenForm的区? <br /> QueryString是URL中问号后面的?querystring.一般浏览器都把URL限制?55个字W以内所以没办法传递大量的数据,Ҏ必须为get.HiddenForm是表单数?Ҏ为可以是get或者post(一般用post) <br /> <br /> 7.误区 <br /> 我看到有人在论坛上说在自qWeb服务器上构徏一个Session,然后链接到别人的E序q样可以过验证.Session只在同一? Application中才有效,所以这个设x徒劳?不过如果你们的程序是同一个Application中的(比如一些个Z늩间就有可?是可? q样做的. <br /> <br /> 8.题外? <br /> 利用Cookied,因ؓ客户端完全禁用Cookie之后,每次h服务器都要生一个会?如果会话时旉?5分钟的话,我们通过完全用Cookie的方法在15分钟内不停的h让服务器产生大量的会?实行DOSd(前提是大量的h和服务器不做qo) <img src ="http://m.tkk7.com/conans/aggbug/299650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2009-10-25 10:59 <a href="http://m.tkk7.com/conans/articles/299650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jmesaq解决Ҏhttp://m.tkk7.com/conans/articles/290047.htmlCONANCONANThu, 06 Aug 2009 02:01:00 GMThttp://m.tkk7.com/conans/articles/290047.html Ҏ一 Q原有输出方?br />
1 response.setContentType("text/html;charset=UTF-8");
2                 byte[] contents = html.getBytes();
3                 response.getOutputStream().write(contents);
修改为:
1 response.setContentType("text/plain;charset=UTF-8");  
2                 response.getWriter().write(tableData);

Ҏ二:在所部属的服务器的JVM参数中增加下列参敎ͼ
-Ddefault.client.encoding=UTF-8 -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8
然后重启服务器即可(本方法在WAS6.1.0.25Q上试通过


CONAN 2009-08-06 10:01 发表评论
]]>
Eclipse q程调试 WebSphere Application Server (WAS)http://m.tkk7.com/conans/articles/270393.htmlCONANCONANWed, 13 May 2009 05:41:00 GMThttp://m.tkk7.com/conans/articles/270393.html
实际?WAS 支持远E调试的讄Q打开它,你只需要用 Eclipse Debug 中的 Remote Java Application 功能q接到服务器上相应端口即行。设|很单,q样的办法你甚至可以在闲时偷L调试一下生产环境的 WAS 应用以验证测试环境难?无法重现的问题。具体做法如?WAS 5.x ?6.x 下的操作基本相同)Q?nbsp;

一Q配|?WASQ打开调试服务

q到 WAS(或ND) 的管理控制台Q在服务?/strong>->应用E序服务?/strong>中,点击要启用调试服务的应用服务器,然后q入调试服务Q勾选上启动(指定当服务器启动时服务器是否尝试启动指定的服务??strong>JVM 调试端口默认?7777Q注意该端口不能有冲H?如有多个应服务器要启用调试服务时Q需要指定别的端?。其他选项默认Q或Ҏ实际来设定?br />
?strong>保存
后重启应用服务器QWAS Base 版需要回到操作系l下重启Q如果是?ND 理控制CQ可直接在页面中重启应用服务器?br />
二:配置 EclipseQ用远E调?br />
Eclipse 的菜?Run -> Open Debug Dialog H口中,叛_ Remote Java Application->NewQ在x?Conect 标签中Q选择你要调试?Project(卛_布到 WAS 下启用了调试服务的,在你?Eclipse 中存在的目)Q?strong>Host 填上 WAS 服务器的 IPQ?strong>Port 是前面?JVM 调试端口。其他两个标{N Source/Common 可留意下?br />
点击 Debug 按钮Q这时?Eclipse 卛_理于侦听  WAS 服务器的 JVM 调试端口的状态?br />
三:打上断点Q调试应?/strong>

? 你的 Eclipse 中的目(注意Q该目已部|到 WAS 上的) 要调试的代码行中打上断点Q然后可以在|页上浏?WAS 上的该应用。当执行到所在断点的代码行时QEclipse ׃停在该行上,让你情?F5/F6 的蟩Q像qx那样 Watch/Inspect/Display表达式或变量?br />

其他~点是Q?br />
1Q观察不到控制台的输出,q得?WAS ?SystemOut.log 文g或日志文件?
2QJSP 文g无法调试Q因为定位不到原码,q且q种方式也不以聪明?br /> 3Q代码更新后Q需手工把类文g?JSP 文g拷到 WAS 的相应目录下?br /> 4Q启动了调试服务后,严重影响功能Q通过鼠标点击p感觉刎ͼ所以正式系l上完事后赶紧关了该功能?

CONAN 2009-05-13 13:41 发表评论
]]>
Web分页打印Q细U表?分页打印之终极攻略收?/title><link>http://m.tkk7.com/conans/articles/256543.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 25 Feb 2009 01:44:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/256543.html</guid><description><![CDATA[<p>最q给客户做打印的时候,客户提出打印时不要打印该面的头Q只是打印表格里面的内容Q因为头部有背景和打印按钮,而且要细U表格的那种Q我想细U表g是很单吗</p> <p> </p> <p>如果你还不知?strong>l线表格怎么?/strong>Q请看下面的代码实现效果Q)</p> <p> <pre><table cellSpacing=0 cellPadding=0 border=0> <tr> <td bgcolor='black'> <table cellSpacing=1 cellPadding=1 border=0> <tr align=center bgcolor='#ffffff'> <td colspan=2>国家U?lt;/td><td colspan=1>市</td> </tr> <tr bgcolor='#ffffff' align=center> <td>人民日报</td> <td>解放日报</td> <td>新民晚报</td> </tr> </table> </td> </tr> </table> </pre> <p> </p> <p>然后把IE的设|ؓ<strong>可以打印背景</strong>Q本以ؓ可以大功告成?/p> <p>l果打印一预览Q头部一?strong>大黑?/strong>Qؓ什么呢Q因为我头部里面的有一个背景,l果占用面Q?/p> <p> <pre>.gTitle { width:100%; height:32px; line-height:32px; <span style="color: #ff0000">background-image:url(images/gtitle.gif); </span> padding-left:130px; margin-bottom:10px; } </pre> <p> </p> <p>开始郁闷啦Q在|上搜了半天都没有一个完的解决ҎQ决定自己搞定?/p> <p>自己琢磨了半天,l于搞定Q)</p> <p>Css定义如下Q?/p> <p>noneprintQ?打印旉藏的样式定义</p> <p>tabPrintQ?nbsp;   要打印的l线表格样式定义</p> <p>nextPateQ?nbsp; 分页的样式定?/p> <p>linetdQ?nbsp;      呵呵Q此处最关键Q让你的表格打印?strong>完美?span style="color: #ff0000">~?/span></strong></p> <p> </p> <p> <div id="kq2g4mc" class="dp-highlighter"> <div id="cew08ue" class="bar"> <div id="siqakks" class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" >view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" >copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" >print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" >?</a></div> </div> <ol class="dp-css"> <li id="w4moy84" class="alt"><span><span>@media </span><span id="sgucaa4" class="value">print</span><span> {   </span></span></li> <li id="qyoygig" class=""><span>.noneprint{</span><span id="ggewoge" class="keyword">display</span><span>:</span><span id="k2qii4g" class="value">none</span><span>;}   </span></span></li> <li id="2ccscec" class="alt"><span>}   </span></li> <li id="kusegoq" class=""><span>  </span></li> <li id="kqy2kac" class="alt"><span>.tabPrint td   </span></li> <li id="ssia24a" class=""><span>{   </span></li> <li id="aasaqk2" class="alt"><span>    </span><span id="2w4uoq8" class="keyword">border-left</span><span>:</span><span id="q2saia8" class="value">#000000</span><span> </span><span id="mooqygy" class="value">solid</span><span> </span><span id="uq8aiak" class="value">1px</span><span>;   </span></span></li> <li id="amu2cmk" class=""><span>    </span><span id="2smkewe" class="keyword">border-top</span><span>:</span><span id="cs2qgks" class="value">#000000</span><span> </span><span id="esksio2" class="value">solid</span><span> </span><span id="ecuu2ii" class="value">1px</span><span>;   </span></span></li> <li id="88ck4eg" class="alt"><span>    </span><span id="mowgwqy" class="keyword">height</span><span>:</span><span id="iakkucc" class="value">21px</span><span>;   </span></span></li> <li id="oe2aaqy" class=""><span>}   </span></li> <li id="gcmwwee" class="alt"><span>  </span></li> <li id="woe4uu4" class=""><span>table.tabPrint   </span></li> <li id="muueek2" class="alt"><span>{   </span></li> <li id="qme8ek4" class=""><span>    </span><span id="a4q4kuk" class="keyword">border-right</span><span>:</span><span id="2ggem4i" class="value">#000000</span><span> </span><span id="iqqqmc8" class="value">solid</span><span> </span><span id="wwuiq2a" class="value">1px</span><span>;   </span></span></li> <li id="uc48emu" class="alt"><span>    </span><span id="gomegyg" class="keyword">border-bottom</span><span>:</span><span id="ukkmkua" class="value">#000000</span><span> </span><span id="cksuuks" class="value">solid</span><span> </span><span id="ywumm2u" class="value">1px</span><span>;   </span></span></li> <li id="aqq28yq" class=""><span>}   </span></li> <li id="uoo2sq2" class="alt"><span>  </span></li> <li id="mgweegw" class=""><span>.nextPage   </span></li> <li id="w2yaksc" class="alt"><span>{   </span></li> <li id="4oy8cmk" class=""><span>    </span><span id="wemckky" class="keyword">page-break-after</span><span>:</span><span id="mckacc4" class="value">always</span><span>;   </span></span></li> <li id="0ka8gik" class="alt"><span>}   </span></li> <li id="wgq4em8" class=""><span>.linetd   </span></li> <li id="sayyoom" class="alt"><span>{   </span></li> <li id="eaaaaig" class=""><span>    </span><span id="owewc2c" class="keyword">border-bottom</span><span>:</span><span id="mksqiww" class="value">solid</span><span> </span><span id="ok2wqy4" class="value">1px</span><span> </span><span id="skcuwwy" class="value">#000</span><span>;   </span></span></li> <li id="w24iyai" class="alt"><span>}  </span></li> </ol> </div> <textarea class="css" style="display: none" name="code" rows="15" cols="50">@media print { .noneprint{display:none;} } .tabPrint td { border-left:#000000 solid 1px; border-top:#000000 solid 1px; height:21px; } table.tabPrint { border-right:#000000 solid 1px; border-bottom:#000000 solid 1px; } .nextPage { page-break-after:always; } .linetd { border-bottom:solid 1px #000; }</textarea> <p> </p> <p> </p> <p>面HTML如下Q?nbsp;</p> <p><span style="color: #ff0000">记得</span>在thead加上style="display:table-header-group;font-weight:bold"Q这h个页面才会有都表头哟</p> <p>  <pre><div class="noneprint"> <div class="gTitle">>><A href="../Default.aspx" mce_href="Default.aspx">首页</A>>><A href="Default.aspx" mce_href="Default.aspx">门户</A>>>信息理</div> <table cellSpacing="0" cellPadding="2" width="100%" align="center" border="0" ID="Table1"> <tr> <td align="right">标题Q?lt;/td> <td><input name="txtFName" type="text" id="txtFName" style="width:150px;" /></td> <td align="right">所属街道:</td> <td><select name="ddlStreet" id="ddlStreet"> <option selected="selected" value="">-请选择状?</option> </select></td> <td align="right">录入日期Q?lt;/td> <td colSpan="3"><input name="sDate" type="text" id="sDate" onclick="setday(this)" style="width:80px;" />-- <input name="eDate" type="text" id="eDate" onclick="setday(this)" style="width:80px;" /></td> <td><input type="submit" name="btnSearch" value="查询" id="btnSearch" class="Button" /> <input type="button" onclick="window.print()" value="打印" class="Button" ID="Button1" NAME="Button1"></td> </tr> </table> </div> <table class='tabPrint' align="center" width="95%" cellSpacing="0" cellPadding="0" border="0" ID="Table2"> <thead <span style="color: #ff0000">style="display:table-header-group;font-weight:bold"</span> mce_style="display:table-header-group;font-weight:bold"> <tr align="center"> <td rowspan="2">所属街?lt;/td> <td rowspan="2">标题</td> <td rowspan="2">录入日期</td> <td colspan="2">国家U?lt;/td> <td colspan="1">市</td> </tr> <tr align="center"> <td>人民日报</td> <td>解放日报</td> <td>新民晚报</td> </tr> </thead><tbody> <tr align="center"> <td>东新区三街道</td> <td>试</td> <td>02-24-2009</td> <td>√</td> <td>√</td> <td>√</td> </tr> <tr align="center"> <td>东新区三街道</td> <td>sseref</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> <tr align="center"> <td>东新区三街道</td> <td>sseref</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> <span style="color: #ff0000"><tr align="center" class='nextPage'> <td colspan="6" class='linetd'>W??lt;/td> </tr></span> <tr align="center"> <td>东新区三街道</td> <td>sdsedjiik</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> <tr align="center"> <td>东新区三街道</td> <td>sdsedjiik</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> <tr align="center"> <td>东新区三街道</td> <td>sdsedjiik</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> <tr align="center"> <td>东新区三街道</td> <td>sdsedjiik</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> <tr align="center"> <td>东新区三街道</td> <td>sdsedjiik</td> <td>02-24-2009</td> <td> </td> <td> </td> <td> </td> </tr> </tbody></table> </pre> <p> </p> <p> </p> <p>呵呵Q标CؓU色的地方你可要看仔l哟Q完不完全靠它Q?br /> <br /> 转自Qhttp://blog.csdn.net/maomaoysq/archive/2009/02/24/3933480.aspx</p> <img src ="http://m.tkk7.com/conans/aggbug/256543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2009-02-25 09:44 <a href="http://m.tkk7.com/conans/articles/256543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java、PHPRPC、Hessian、Burlap 序列化的效率Ҏhttp://m.tkk7.com/conans/articles/255094.htmlCONANCONANTue, 17 Feb 2009 06:58:00 GMThttp://m.tkk7.com/conans/articles/255094.html相关文章:  
推荐圈子:
flex
更多相关推荐 下面是对?Java 6 下对 JavaQ就?RMI 使用的数据表C方式)、PHPRPC、HessianQ?个协议版本都有)、Burlap 序列?反序列化的效率对比,其中 PHPRPC 序列化来自最新版本的 PHPRPC 3.0.2 for JavaQHessian ?Burlap 序列化来?a target="_blank">Hessian 的最新版 3.2.1QJava 序列化是采用 JDK 6 中内|的功能?

试E序可从此处下蝲Q?a target="_blank">PHPRPC___Hessian_Test.zip

下面是测试程序的q行l果图:


























从上面的l果来看Q对于原生类型的序列化和反序列化QPHPRPC ?Hessian 的效率差不多Q对于字节流的序列化QPHPRPC hl对优势Q对于容器类型,来说Q如果具有重复元素的话,PHPRPC 要远q好?HessianQ对于没有重复元素的Q则效率上不怸下,对于自定义类型来_PHPRPC 也比 Hessian 效率高不。?Java 本n的序列化Q效率对比来说L动太大,原生cd要慢好多Q而复杂类型和自定义类型稍微好一些。所以M来说QPHPRPC 在^均效能上是q几个当中最好的了?

本来q想加入 JSON、SOAP q些序列化方式的ҎQ但是找了好久都没有扑ֈ能够支持 Java 基本cd和容器类型的 JSON、SOAP 序列化的工具包。不q这两种格式的效率要比现在对比的q几U效率上低很多倍,?.NET 版本的相兛_比上可以看到出来?

其实q个评测?PHPRPC 来说Q还是不公^的,因ؓ PHPRPC 现在是按?Java 1.2 兼容格式~写的,因此要比那些专门?Java 5+ ~写的代码效率要低。但是在q种情况下,仍然能够胜出Q以说?PHPRPC 的优U?

PHPRPC for Java 下一步的计划是~写专门针对 Java 5+ 的优化版本,让?Java 5+ 的用戯够得到更高的执行效率?

CONAN 2009-02-17 14:58 发表评论
]]>
推荐15个有用的在浏览器内的web开发工?/title><link>http://m.tkk7.com/conans/articles/241988.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sat, 22 Nov 2008 09:32:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/241988.html</guid><description><![CDATA[    只有注册用户d后才能阅读该文?a href='http://m.tkk7.com/conans/articles/241988.html'>阅读全文</a><img src ="http://m.tkk7.com/conans/aggbug/241988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-11-22 17:32 <a href="http://m.tkk7.com/conans/articles/241988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>session串的问题http://m.tkk7.com/conans/articles/219469.htmlCONANCONANFri, 01 Aug 2008 14:00:00 GMThttp://m.tkk7.com/conans/articles/219469.html阅读全文

CONAN 2008-08-01 22:00 发表评论
]]>
l?GLASSFISH 里里外外做了个交?/title><link>http://m.tkk7.com/conans/articles/214799.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 14 Jul 2008 11:28:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/214799.html</guid><description><![CDATA[<div class="8aiiaqo" id="news_content">今天d同事写的一博文,非常有系l地把GLASSFISH里里外外做了个交代,一q?0个链接,如果你一个个点击下去Q你一定会?GLASSFISH 有个完整的收?Q?<br /> <br /> <br /> q是q篇博文GlassFish for Enterprise的网址Q?<br /> http://blogs.sun.com/quality/entry/glassfish_for_enterprise <br /> <br /> <br /> 下面是博文翻译: <br /> <br /> <br /> GlassFish 有很q大的用P仅仅一q之内就?.5万次下蝲Q这是一些文摘: <br /> <a target="_blank">http://www.sun.com/featured-articles/2008-0610/feature/index.jsp</a> <br /> <br /> GlassFish 有很q泛的社区,q是C֌论坛|站, 你能在论坛讨论问?a target="_blank">http://forums.java.net/jive/forum.jspa?forumID=56&start=0</a> <br /> <br /> <br /> 有这么多Z载,q么多h安装和设|GlassFishQGlassFish在不同的电脑和操作系l上得到了有效的试Q这样你׃会碰到基本的故障Q又因ؓGlassFish在网l有很多的信息,你只要在google搜烦“GlassFish issue”Q你多半都能够得到满意的{复?<br /> <br /> <br /> GlassFish 据有企业功能Q能应用C业生产线上,在这个博文里我会向你推荐一些GlassFish 企业功能 <br /> <br /> 你能在下面这个链接免费下载GlassFishQ?a target="_blank">https://glassfish.dev.java.net/downloads/v2ur2-b04.html</a> <br /> <br /> q是GlassFish便操作指南:<a target="_blank">https://glassfish.dev.java.net/downloads/quickstart/index.html</a> <br /> <br /> 你能用GlassFish理q_很方便来理 GlassFish 多种功能Q可以部|Ӏ可以修改,然后再部|Ӏ?<br /> <br /> 如果你要用集,用下面这个步骤来安装Q然后用下面推荐的HA文来构架?<br /> <br /> <a target="_blank">https://glassfish.dev.java.net/javaee5/build/GlassFish_LB_Cluster.html</a> <br /> <br /> <a target="_blank">http://wiki.glassfish.java.net/Wiki.jsp?page=GlassFishV2Architecture</a> <br /> <br /> 下面是一非常好的关于GlassFish集群文章 <br /> <a target="_blank">http://developers.sun.com/appserver/reference/techart/glassfishcluster/</a> <br /> <br /> <br /> 我们q有High Availability操作指南 <br /> <a target="_blank">http://docs.sun.com/app/docs/doc/819-3679</a> <br /> <br /> GlassFish 有两Uhigh availabilityQ一U是in-memoryQGlassFish 的原装用的是in-memory <br /> <br /> 如果你需要高availabilityQ你可以免费下蝲有HADBl装的功?<br /> <a target="_blank">http://www.sun.com/download/products.xml?id=46df3223</a> <br /> <br /> <br /> GlassFish支持软g和硬件Loadbalancer <br /> <a target="_blank">http://blogs.sun.com/Prashanth/entry/load_balancing_glassfish_v2_with</a> <br /> <br /> 用GlassFish Enterprise bits 来组装loadbalancer pluginQ我们有自动l装的方法,q是操作指南 <br /> <a target="_blank">http://docs.sun.com/app/docs/doc/819-3193</a> <br /> <br /> 看到q里Q你是否被我搞糊涂了Q搞不清GlassFish和GlassFish enterprise 的区别,下面是它们的不同之处 <br /> <a target="_blank">http://wiki.glassfish.java.net/Wiki.jsp?page=FaqGlassFishV2vsSJSAS91</a> <br /> <br /> 如果你需要SSL。GlassFish有全套的支持Q?<br /> <a target="_blank">http://blogs.sun.com/enterprisetechtips/entry/using_ssl_with_glassfish_v2</a> <br /> <br /> 如果你想知道有哪些企业推荐,q里可以扑ֈ许多GlassFish用户的成功故?<br /> <a target="_blank">http://blogs.sun.com/stories</a> <br /> <br /> <br /> 如果你想知道ISVQGlassFish有很多成功的合作夥伴 <br /> <a target="_blank">http://www.sun.com/software/products/appsrvr/gf-isv-partners.jsp</a> <br /> <br /> 如果你要用GlassFish攑֜企业工作pȝQ你q且需要有及时的用h持,你可以来买GlassFish的用hҎ?<br /> <a target="_blank">http://globalspecials.sun.com/servlet/ControllerServlet?Action=DisplayPage&Env=BASE&Locale=en_US&SiteID=sunstor&id=ProductDetailsPage&productID=81508900</a></div> <br /> <img src ="http://m.tkk7.com/conans/aggbug/214799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-07-14 19:28 <a href="http://m.tkk7.com/conans/articles/214799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> session对象在web开发中的创Z及sessionId生成q返回客L的运行机?/title><link>http://m.tkk7.com/conans/articles/214798.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 14 Jul 2008 11:28:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/214798.html</guid><description><![CDATA[session对象当客L首次讉KӞ创徏一个新的session对象。ƈ同时生成一个sessionIdQƈ在此ơ响应中sessionId 以响应报文的方式些回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话,只要sever端的q个session对象没有销毁,以后再调?request.getSessionQ)时就直接Ҏ客户端的sessionId来检?server端生成的session对象q返回,不会再次L建,除非Ҏ此sessionId没有索到session对象? <p>  下面是在IE下测试,因ؓIE6.0的一个BUG是IE的隐U设|即使是L所有cookieӞ也还是会以会话cookie来保存sessionId.所以下面都是以会话cookie来讨论的Q?/p> <p>  Q?Q在server没有关闭Qƈ在session对象销毁时间内Q当客户端再ơ来hserver端的servlet或jspӞ会在W?一ơ请求时生成的sessionIdq带在h信息头中q向server端发送, server端收到sessionId后根据此sessionId会去搜烦Q此q程是透明的)server对应的session对象q直接返回这?session对象Q此时不会重新去建立一个新的session对象?/p> <p>  Q?Q当server关闭Q之前生的session对象也就消亡了)Q或 session对象q了光毁时间后Q浏览器H口不关Qƈ在本览器窗口再ơ去hsever端的servlet和jspӞ此时同样会将 sessionIdQserver关闭或session销毁时生成的sessionIdQ发送到server端,serverҎsessionIdL 其对应的session对象Q但此时session对象已经不存在,此时会重新生成一个新的session对象Qƈ生成新的sessionIdq同样将q?个新生成的sessionId以响应报文的形式送到览器内存中?/p> <p>  Q?Q当server没有关闭Qƈsession对象在其销毁时间内Q当h一?jsp面回客L后,关闭此浏览器H口Q此时其内存中的sessionId也就随之销毁,在重新去hsever端的servlet或jspӞ会重?生成一个sessionIdl客L览器,q存在浏览内存中?/p> <img src ="http://m.tkk7.com/conans/aggbug/214798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-07-14 19:28 <a href="http://m.tkk7.com/conans/articles/214798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web.xml 学习进?/title><link>http://m.tkk7.com/conans/articles/214467.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sat, 12 Jul 2008 11:17:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/214467.html</guid><description><![CDATA[<div id="m4sckuc" class="cnt"> <p>web.xml里面可以定义两种参数Q?(1)application范围内的参数Q存攑֜servletcontext中,在web.xml中配|如下:</p> <div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: rgb(230,230,230) 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">context-param</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />           </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">param-name</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">context/param</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">param-name</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />           </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">param-value</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">avalible during application</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">param-value</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />  </span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">context-param</span><span style="color: rgb(0,0,255)">></span></div> </div> <p>(2)servlet范围内的参数Q只能在servlet的init()Ҏ中取得,在web.xml中配|如下:</p> <div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: rgb(230,230,230) 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">servlet</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">servlet-name</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">MainServlet</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">servlet-name</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">servlet-class</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">com.wes.controller.MainServlet</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">servlet-class</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">init-param</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">param-name</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">param1</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">param-name</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">param-value</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">avalible in servlet init()</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">param-value</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">init-param</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)"><</span><span style="color: rgb(128,0,0)">load-on-startup</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">load-on-startup</span><span style="color: rgb(0,0,255)">></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /> </span><span style="color: rgb(0,0,255)"></</span><span style="color: rgb(128,0,0)">servlet</span><span style="color: rgb(0,0,255)">></span></div> </div> <p>在servlet中可以通过代码分别取用Q?/p> <div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: rgb(230,230,230) 0% 50%; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; padding-top: 4px; border-bottom: windowtext 0.5pt solid; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)"> com.wes.controller; <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /></span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)"> javax.servlet.ServletException; <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /></span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)"> javax.servlet.http.HttpServlet; <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" _counted="undefined" /><img style="display: none" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" _counted="undefined" /></span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)"> MainServlet </span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)"> HttpServlet </span><span style="border-right: rgb(128,128,128) 1px solid; border-top: rgb(128,128,128) 1px solid; display: none; border-left: rgb(128,128,128) 1px solid; border-bottom: rgb(128,128,128) 1px solid; background-color: rgb(255,255,255)">...</span><span><span style="color: rgb(0,0,0)">{ <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" _counted="undefined" /> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" _counted="undefined" /><img style="display: none" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> MainServlet() </span><span style="border-right: rgb(128,128,128) 1px solid; border-top: rgb(128,128,128) 1px solid; display: none; border-left: rgb(128,128,128) 1px solid; border-bottom: rgb(128,128,128) 1px solid; background-color: rgb(255,255,255)">...</span><span><span style="color: rgb(0,0,0)">{ <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" _counted="undefined" />        </span><span style="color: rgb(0,0,255)">super</span><span style="color: rgb(0,0,0)">(); <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" _counted="undefined" />     }</span></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" _counted="undefined" /><img style="display: none" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" _counted="undefined" />    </span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)"> </span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)"> init() </span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)"> ServletException </span><span style="border-right: rgb(128,128,128) 1px solid; border-top: rgb(128,128,128) 1px solid; display: none; border-left: rgb(128,128,128) 1px solid; border-bottom: rgb(128,128,128) 1px solid; background-color: rgb(255,255,255)">...</span><span><span style="color: rgb(0,0,0)">{ <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" _counted="undefined" />         System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">下面的两个参数param1是在servlet中存攄</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">); <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" _counted="undefined" />         System.out.println(</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.getInitParameter(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">param1</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">));</span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" _counted="undefined" />         System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">下面的参数是存放在servletcontext中的</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">); <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" _counted="undefined" />         System.out.println(getServletContext().getInitParameter(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">context/param</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)); <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" _counted="undefined" />      }</span></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" _counted="undefined" />}</span></span><span style="color: rgb(0,0,0)"> <img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" _counted="undefined" /></span></div> </div> </div> <img src ="http://m.tkk7.com/conans/aggbug/214467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-07-12 19:17 <a href="http://m.tkk7.com/conans/articles/214467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己整理的分工?http://m.tkk7.com/conans/articles/214094.htmlCONANCONANThu, 10 Jul 2008 11:37:00 GMThttp://m.tkk7.com/conans/articles/214094.html今天自己整理了一个分工?刚做q有很多没完善的地方)Q把它放上来?br /> 因ؓ个h水^有限Q有不对的地方,望大家见谅。也希望大家提出你们宝贵的意见或?br />
源码siyn-pager.rar下蝲

下面主要介绍一下其使用Ҏ:

1.把siyn-pager.jar攑ֈlib下,
2.把siyn-pager.tld攑ֈ/WEB-INF/?
3.修改web.xml文g,dtld配置

<jsp-config>
    
<taglib> 
        
<taglib-uri>http://www.siyn.org/siyn-pager.tld</taglib-uri>
        
<taglib-location>/WEB-INF/siyn-pager.tld</taglib-location>
    
</taglib>  
</jsp-config>
4.action
4.1通过PageControlUtil.getPageControl(request)得到pageControlQ?br />
PageControl pageControl = PageControlUtil.getPageControl(request);
4.2如果q没有获得总记录数Q通过调用service的方法获得总记录数
if(pageControl.getRowcount() <= 0)
            pageControl.setRowcount(service.getSize());
4.3通过调用service的方法得到结果集
List list = service.getData(pageControl);
4.4结果集Q分|制beanQpageControlQ放入request
request.setAttribute("list", list);
        request.setAttribute(
                        org.siyn.common.web.struts.taglib.page.Constants.PAGE_CONTROL_MODEL,
                        pageControl);
4.5跌{面
return mapping.findForward("success");
5.jsp面
5.1导入标签?br />
<%@ taglib uri="http://www.siyn.org/siyn-page.tld" prefix="page" %>
5.2昄list数据
<logic:iterate id="data" name="list"  indexId="i">
    
<ul>
        
<li><bean:write name="data" property="x" /></li>
        
<li><bean:write name="data" property="xx" /></li>
        
<li><bean:write name="data" property="xxx" /></li>
    
</ul>
</logic:iterate>
5.3昄D控制
<pager:navigator actionPath="xxx.do?Op=showlist" shownum="3" template="template.jsp"/> 
q个navigator有三个属性,
    actionPath为必ȝQ请求数据的action地址
    shownum可选,D栏除了首,上页Q下,末页外,中间的数字页昄几个Q默认显C??br />     template  可选,为导航栏的模板\?相对于classes目录)Q自己可以修改以昄不同风格Q默认ؓorg/siyn/common/web/struts/taglib/page/pageControlTemplate.jsp


CONAN 2008-07-10 19:37 发表评论
]]>
【译】构建可扩展的Java EE应用Q二Q?http://m.tkk7.com/conans/articles/214093.htmlCONANCONANThu, 10 Jul 2008 11:36:00 GMThttp://m.tkk7.com/conans/articles/214093.html
当ƈ发用h明显的开始增长,你可能会不满意一台机器所能提供的性能Q或者由于单个JVM实例gc的限Ӟ你没法扩展你的java应用Q在q样的情况下你可以做的另外的选择是在多个JVM实例或多台服务器上运行你的系l,我们把这U方法称为水qx展?br id="jsdn3" />

h意,我们怿能够在一台机器的多个JVM上运行系l的扩展方式是水qx展方式,而非垂直扩展方式。JVM实例之间的IPC机制是有限的Q两个JVM实例之间无法通过道、共享内存、信号量或指令来q行通讯Q不同的JVMq程之间最有效的通讯方式是socket。简而言之,如果Java EE应用如果扩展到多个JVM实例中运行,那么大多数情况下它也可以扩展到多台服务器上运行?br id="w9.22" />

随着计算来越便宜Q性能来高Q通过低成本的机器群l装为集可以获得超q那些昂늚计算机所具备的计能力。不q,大量的计机也意味着增加了管理的复杂性以及更为复杂的~程模型Q就像服务器节点之间的吞吐量和g时等问题?/p>

Java EE集群是一U成熟的技术,我在TSS上写了一名?#8220;Uncover the Hood of J2EE Clustering”的文章来描述它的内部机制?br id="foim2" />

从失败的目中吸取的教训

采用无共享的集群架构


Figure 3: share nothing cluster

最具备扩展性的架构当属无共享的集群架构。在q样的集中Q每个节点具备完全相同的功能Qƈ且不需要知道其他节点存在与否。负载均衡器(Load Balancer)来完成如何将h分发l这些后台的服务器实例。由于负载均衡器只是做一些简单的工作Q例如分z请求、健h查和保持sessionQ因此负载均衡器很少会成为瓶颈。如果后端的数据库系l或其他的信息系l够的强大Q那么通过增加更多的节点,集群的计能力可以得到线性的增长?br id="jsdn19" />

几乎所有的Java EE提供商在他们的集品中都实CHttpSession的failover功能Q这样即使在某些服务器节点不可用的情况下也仍然能够保证客L的请求中的session信息不丢失,但这点其实是打破了无׃n原则的。ؓ了实现failoverQ同Lsession数据会被两个或多个节点׃nQ在我之前的文章中,我曾l推荐除非是万不得已Q不要用session failover。就像我文章中提到的Q当p|发生Ӟsession failover功能q不能完全避免错误,而且同时q会Ҏ能和可扩展性带来损失?br id="ose02" />

使用可扩展的session复制机制

Z让用戯得更友好的体验,有些时候可能必M用session failover功能Q这里最重要的在于选择可扩展的复制型品或机制。不同的厂商会提供不同的复制Ҏ - 有些采用数据库持久,有些采用中央集中的状态服务器Q而有些则采用节点间内存复制的方式。最具可扩展性的是成对节点的复制(paired node replication)Q这也是现在大部分厂商采用的ҎQ包括BEA Weblogic、JBoss和IBM WebsphereQSun在Glassfish V2以及以上版本也实C成对节点的复制。最不可取的Ҏ是数据库持久session的方式。在我们实验室中曄试q一个采用数据库持久来实?session复制的项目,试l果表明如果session对象频繁更新的话Q节点在三到四个时就会导致数据库崩溃?br id="l8n39" />

采用collocated部v方式来取代分布式

Java EE技术,其是EJBQ天生就是用来做分布式计的。解耦业务功能和重用q程的组件得多层的应用模型得以行。但对于可扩展性而言Q减分布式的层ơ可能是一个好的选择?br id="jsdn27" />

在我们实验室曄以一个政府的目试q这两种方式在同L服务器数量上的部|?- 一U是分布式的Q一U是collocated方式的,如下图所C:


Figure 4: distributed structure

Figure 5: collocated structure

l果表明collocated式的部v方式比分布式的方式更具备可扩展性。假设你应用中的一个方法调用了一堆的EJBQ如果每个EJB的调用都需要load balanceQ那么有可能会因为需要分散到不同的服务器上进行调用导致你的应用崩溃,q样的结果就是,你可能做了很多次无谓的跨服务器的调用。来看更p糕的情况,如果你的Ҏ是需要事务的Q那么这个事务就必须跨越多个服务器,而这对于性能是会产生很大的损害的?br id="b_ta3" />

׃n资源和服?/strong>

对于用于支撑q发h的Java EE集群pȝ而言Q其扩展后的性能取决于对于那些不支持U性扩展的׃n资源的操作。数据库服务器、JNDI树、LDAP服务器以及外部的文gpȝ都有可能被集中的节点共享?br id="u6g97" />

管Java EE规范中ƈ不推荐,但ؓ了实现各U目标,通常都会采用外部的I/O操作。例如,在我们实验室试的应用中有用文gpȝ来保存用户上传的文g的应用,或动态的创徏xml配置文g的应用。在集群内,应用服务器节点必L办法来复制这些文件到其他的节点,但这样做是不利于扩展的。随着来多节点的加入,节点间的文g复制会占用所有的|络带宽和消耗大量的CPU资源。在集群中要辑ֈq样的目标,可以采用数据库来替代外部文gQ或采用SAN作ؓ文g的集中存储,另外一个可选的Ҏ是采用高效的分布式文件系l,例如Hadoop DFS(http://wiki.apache.org/hadoop/)?br id="opr53" />

在集环境中׃n服务很常见,q些服务不会部v到集的每个节点Q而是部v在专门的服务器节点上Q例如分布式的日志服务或旉服务。分布式锁管理器 (DLM)来管理集中的应用对q些׃n服务的同步访问,即在网lg时和pȝ处理p|的情况下Q锁理器也必须正常操作。D例来_在我们的实验室中试的一个ERPpȝqCq样的问题,他们写了自己的DLMpȝQ最l发现当集群中持有锁的节点失败时Q他们的lock system会永远的持有锁?br id="nq3v3" />

分布式缓?/strong>

我所到q的几乎所有的Java EE目都采用了对象~存来提升性能Q同h有流行的应用服务器也都提供了不同U别的缓存来加速应用。但有些~存是ؓ单一q行的环境而设计的Qƈ且只能在单JVM实例中正常的q行。由于有些对象的创徏需要耗费大量的资源,我们需要缓存,因此我们l护对象池来~存对象的实例。如果获取维护缓存较之创建对象而言更划,那么我们提升了pȝ的性能。在集群环境中,每个jvm实例l护着自己的缓存,Z保持集群中所有服务器状态的一_q些~存对象需要进行同步。有些时候这L同步机制有可能会比不采用~存的性能q差Q对于整个集的扩展能力而言Q一个可扩展的分布式~存pȝ是非帔R要的?br id="k9:22" />

如今很多分布式缓存相关的开源java产品已经非常行Q在我们实验室中有如下的一些测试:

  • 1个基于JBoss Cache的项目的试Q?
  • 3个基于Terracotta的项目的试Q?
  • 9个基于memcached的项目的试Q?
试l果表明Terracotta可以很好的扩展到10个节点,q且在不过5个节Ҏ拥有很高的性能Q但memcached则在过20个服务器节点时会扩展的非常好?br />

Memcached

Memcached是一个高性能的分布式对象~存pȝQ经常被用于降低数据库loadQ同时提升动态web应用的速度。Memcached的奇妙之处在于它的两阶段hash的方法,它通过一个巨大的hash表来查找key = value对,l它一个keyQ就可以set或get数据了。当q行一ơmemcached查询Ӟ首先客户端将会根据整个服务器的列表来对keyq行 hashQ在扑ֈ一台服务器后,客户端就发送请求,服务器端在接收到h后通过对key再做一ơ内部的hashQ从而查扑ֈ实际的数据项。当处理巨大的系l时Q最大的好处是memcached所具备的良好的水^扩展能力。由于客L做了一层hashingQ这使得增加N多的节点到集变得非常的ҎQƈ不会因ؓ节点的互q造成负蝲的增高,也不会因为多播协议而造成|络的洪水效应?br id="hv3g3" />

实际上Memcachedq不是一ƾjava产品Q但它提供了Java client APIQ这也就意味着如果你需要在Java EE应用中用memcached的话Qƈ不需要做多大的改动就可以从cache中通过get获取|或通过put值放入cache中。?memcached是非常简单的Q不q同时也得注意一些事情避免对扩展性和性能造成损失Q?br id="q60s" />

  • 不要~存写频J的对象。Memcached是用来减对数据库的L作的Q而非写操作,在用Memcached前,应先x对象的读/写比率,如果q个比率比较高,那么采用~存才有意义?
  • 量避免让运行的memcached的节点互相调用,对于memcached而言q是N性的?
  • 量避免行方式的~存Q在q样的情况下可采用复杂的对象来进行缓存,q对于memcached来说会更为有效?
  • ?择合适的hashing法。在默认的算法下Q增加或减少服务器会D所有的cache全部失效。由于服务器的列表hashD改变Q可能会造成大部分的 key都要hash到和之前不同的服务器上去Q这U情况下Q可以考虑采用持箋的hashing法(http://weblogs.java.net /blog/tomwhite/archive/2007/11/consistent_hash.html) 来增加和减少服务器,q样做可以保证你大部分缓存的对象仍然是有效的?br id="g:o10" />

Terracotta

Terracotta(http://www.terracottatech.com/)是一个企业的、开源的、JVMU别的集解x案。JVMU的集群Ҏ意味着可以支撑企业的Java应用部v部v到多JVM上,而且像是运行在同一个JVM中?Terracotta扩展了JVM的内存模型,各虚拟机上的U程通过集群来与其他虚拟Z的线E进行交?Terracotta extends the Java Memory Model of a single JVM to include a cluster of virtual machines such that threads on one virtual machine can interact with threads on another virtual machine as if they were all on the same virtual machine with an unlimited amount of heap.)?br id="nowt2" />



Figure 6: Terracotta JVM clustering


采用Terracotta来实现集应用的~程方式和编写单机应用基本没有什么差别,Terrocottaq没有特别的提供开发者的APIQTerracotta采用字节码织入的方式Q很多AOP软g开发框架中采用的技术,例如AspectJ和AspectWerkzQ来集方式的代码插入到已有的java语言中?br id="j_.43" />

我猜想Terrocotta是通过某种互连的方式或多播协议的方式来实现服务器和客户端JVM实例的通讯的,可能是这个原因导致了在我们实验室试时的效果Q当过20个节ҎTerracotta扩展的ƈ不是很好。(注:q个试l果仅ؓ在我们实验室的测试结果,你的l果可能会不同。)

q行处理

我之前说q,单线E的d会成为系l可扩展性的瓉。但有些单线E的工作Q例如处理或生成巨大的数据集Q不仅需要多U程或多q程的运行,q会有扩展到多节点运行的需求。例如,在我们实验室试的一个Java EE目有一个场景是q样的:Ҏ他们站点的日志文件分析URL的访问规则,每周产生的这些日志文仉常会超q?20GBQ当采用单线E的Java应用d析时需要耗费四个时Q客h为采用Hadoop Map-Reduce使其能够水^扩展从而解决了q个问题Q如今这个分析URL讉K规则的程序不仅运行在多进E模式下Q同时还q行的在过10个节点上q行Q而完成所有的工作也只需?分钟了?br id="ob432" />

有很多的框架和工具可以帮助Java EE开发h员来让应用支持水qx展。除了HadoopQ很多MPI的Java实现也可以用来将单线E的d水^的扩展到多个节点上ƈ行运行?br id="g8.y2" />

MapReduce

MapReduce由Google的Jeffrey Dean和Sanjay Ghemawat提出Q是一U用于在大型集群环境下处理巨量数据的分布式编E模型。MapReduce׃个步骤来实现 - MapQ对集合中所有的对象q行操作q基于处理返回一pd的结果,ReduceQ通过多线E、进E或独立pȝq行的从两个或多个Map中整理和获取l果。Map()和Reduce()都是可以q行q行的,不过通常来说没必要在同样的系l同L旉q么来做?br id="sezi3" />

Hadoop是一个开源的、点对点的、纯Java实现的MapReduce。它是一个用于将分布式应用部|到大型廉h集群上运行的Lucene-derived框架Q得C全世界范围开源h士的支持以及q泛的应用,Yahoo的Search Webmap、Amazon EC2/S3服务以及Sun的网格引擎都可运行在Hadoop上?br id="hpul" />

单来_通过使用“Hadoop Map-Reduce”Q?URL讉K规则分析"E序可以首先日志文件分解ؓ多个128M的小文gQ然后由Hadoop这些小文g分配C同的Map()上去执行。Map()会分析分配给它的文件ƈ产生临时的结果,Map()产生的所有的临时l果会被排序q分配给不同的Reduce()QReduce()合ƈ所有的临时l果产生最l的l果Q这些Map和Reduce操作都可以由Hadoop框架控制来ƈ行的q行在集中所有的节点上?br id="pt_l3" />

MapReduce对于很多应用而言都是非常有用的,包括分布式检索、分布式排序、web link-graph reversal、term-vector per host、web讉K日志分析、烦引重建、文档集、机器智能学习、statistical machine translation和其他领域?

MPI

MPI是一U语a无关、用于实现ƈ行运行计机间交互的通讯协议Q目前已l有很多Java版本的MPI标准的实玎ͼmpiJava和MPJ是其中的典型。mpiJava ZJNIl定native的MPI库来实现QMPJ?00%Ujava的MPI标准的实现。mpiJava和MPJ和MPI Fortran和C版本提供的API都基本一_例如它们都对外提供了具备同样Ҏ名和参数的Comm class来实现MPI的信息传递?br id="uch26" />

CCJ是一个类似MPI通讯操作的java库。CCJ提供了barrier、broadcast、scatter?gather、all-gather、reduce和all-reduce操作的支持(但不提供点对点的操作Q例如send、receive和send- receiveQ。在底层的通讯协议斚wQCCJq没有自己实玎ͼ而是采用了Java RMIQ这也就使得CCJ可以用来传递复杂的序列化对象,而不仅仅是MPI中的原始数据cd。进一步看QCCJq可以从一lƈ行的processes中获取到复杂的集合对象,例如实现了CCJ的DividableDataObject接口的集合?br id="j.7e7" />

采用不同的方法来获取高扩展能?/strong>

有很多的书会教我们如何以OO的方式来设计灉|架构的系l,如何来服务透明的被客户端用以便维护,如何采用正常的模式来设计数据库schema以便集成。但有些时候ؓ了获取高扩展性,需要采用一些不同的Ҏ?br id="pa9n3" />

Google设计了自q高可扩展的分布式文gpȝQGFSQ,它ƈ不是ZPOSIX API来实现的Q不qGFS对于用户来说q不完全透明。ؓ了用GFSQ你必须采用GFS的API包。Google也设计了自己的高可扩展的分布式数据库pȝQBigtableQ,但它q不遵@ANSI SQL标准Q而且其中的概念和l构和传l的关系数据库几乎完全不同,但最重要的是GFS和Bigtable能够满Google的存储要求、良好的扩展性要求,q且已经被Google的广泛的作ؓ其存储^台而用?br id="m-gg2" />

传统方式下,我们通过使用更大型的、更快和更贵的机器或企业U的集群数据库(例如RACQ来数据库扩展到多节点q行Q但我有一个我们实验室中测试的social networking的网站采用了不同的方式,q个应用允许用户在网站上创徏profiles、blogsQ和朋友׃n照片和音乐,此应用基于Java EE~写Q运行在Tomcat和Mysql上,但不同于我们实验室中试的其他应用,它只是希望在20多台便宜的PC Server上进行测试,其数据模型结构如下:


Figure 7: Users data partitions


q里比较Ҏ的地方子于不同的用h据(例如profile、blogQ可能会存储在不同的数据库实例上Q例如,用户 00001存储在服务器A上,而用?0001存储在服务器C上,分库的规则以一张元信息的表的方式存储在专门的数据库上。当部v在Tomcat?Java EE应用希望获取或更新用户信息时Q首先它会从q张元信息的表中获取到需要去哪台服务器上获取q个用户Q然后再q到实际的服务器上去执行查询或更新操作?/p>

用户数据分区和这U两步时的动作方式可以带来如下的一些好处:

  • 扩展了写的带宽:对于q类应用而言Qblogging、ranking和BBS会使得写带宽成为网站的主要瓉。分 布式的缓存对于数据库的写操作只能带来很小的提升。采用数据分区的方式Q可以ƈ行的q行写,同样也就意味着提升了写的吞吐量。要支持更多的注册用P只需 要通过增加更多的数据库节点Q然后修改元信息表来匚w到新的服务器上?
  • 高可用性:如果一台数据库服务器down了,那么只会有部分用戯影响Q而其他大部分的用户可以仍然正怋用;
同时也会带来一些缺点:
  • ׃数据库节点可以动态的增加Q这对于在Tomcat中的Java EE应用而言要用数据库q接池就比较难了Q?
  • ׃操作用户的数据是两步式的Q这也就意味着很难使用ORMapping的工具去实现Q?
  • 当要执行一个复杂的搜烦或合q数据时Q需要从多台数据库服务器上获取很多不同的数据?br id="jjxz1" />

q个pȝ的架构师q么_“我们已经知道q些~点Qƈ且准备好了应对它Q我们甚臛_备好了应对当元信息表的服务器成ؓ瓉的状况,如果出现那样的状冉|们将会把元信息表再次划分Qƈ创徏Z个更高别的元信息表来指向众多的二元信息表服务器实例?#8220;

参?/span>

  1. Scalability definition in wikipedia: http://en.wikipedia.org/wiki/Scalability
  2. Javadoc of atomic APIs: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html
  3. Alan Kaminsky. Parallel Java: A unified API for shared memory and cluster parallel programming in 100% Java: http://www.cs.rit.edu/~ark/20070326/pj.pdf
  4. OMP-an OpenMP-like interface for Java: http://portal.acm.org/citation.cfm?id=337466
  5. Google MapReduce white paper: http://labs.google.com/papers/mapreduce-osdi04.pdf
  6. Google Bigtable white paper: http://labs.google.com/papers/bigtable-osdi06.pdf
  7. Hadoop MapReduce tutorial: http://hadoop.apache.org/core/docs/r0.17.0/mapred_tutorial.html
  8. Memcached FAQ: http://www.socialtext.net/memcached/index.cgi?faq
  9. Terracotta: http://www.terracotta.org/

关于作?/strong>

Wang Yu目前在Sun的ISVE Group组工作Q担ȝ职位为Java工程师和架构咨询师,他承担的职责包括支持本地的ISVsQؓ一些重要的Java技术例如Java EE、EJB、JSP/Servlet、JMS和web services技术提供咨询,可以通过wang.yu@sun.com联系他?br id="plv14" />

CONAN 2008-07-10 19:36 发表评论
]]>
【译】构建可扩展的Java EE应用Q一Q?http://m.tkk7.com/conans/articles/214092.htmlCONANCONANThu, 10 Jul 2008 11:36:00 GMThttp://m.tkk7.com/conans/articles/214092.html
对于一个具备用h值的应用而言Q其使用者有可能会在一D|间内疯狂的增ѝ随着来多的关键性质的应用在Java EE上运行,很多的Java开发者也开始关注可扩展性的问题了。但目前来说Q大部分的web 2.0站点是基于script语言~写的,对于Java应用可扩展能力,很多人都q质疑的态度。在q篇文章中,Wang YuZ他本w在实验室项目的l验来展C如何构建可扩展的java应用Q同ӞZ一些在可扩展性上做的比较p|的项目给读者带来构建可扩展java应用的实c理论、算法、框架和l验?br id="llf.2" />

我一直ؓ一家互联网性质的实验室工作Q这个实验室采用我们公司最新的大型服务器环境ؓ合作伙伴的品和解决Ҏ免费做性能试Q我工作的部分就是帮助他们在强大的CMT和SMP服务器上q行性能调优?br id="oe9t1" />

q些q来Q我已经Z同的解决Ҏ试了数十种java应用。许多的产品都是Z解决同样的领域问题,因此q些产品的功能基本都是类似的Q但在可扩展性上表现的却非常不同Q其中有些不能扩展到64 CPU的服务器上运行,但可以扩展到20台服务器做集运行,有些则只能运行在不超q? CPU的机器上?br />

造成q些差别的原因在于设计品时的架构愿景,所有的具备良好扩展性的java应用从需求需求阶Dc系l设计阶D以及实现阶D都为可扩展性做了考虑Q所以,你所~写的java应用的可扩展能力完全取决于你的愿景?br id="lafd2" />

可扩展性作为系l的属性之一Q是个很隑֮义的名词Q经怼与性能h。当Ӟ可扩展性和性能是有关系的,它的目的是ؓ了达到高性能。但是衡量可扩展性和性能的方法是不一LQ在q篇文章中,我们采用wikipedia中的定义Q?br id="pn932" />

可扩展性是pȝ、网l或q程的可选属性之一Q它表达的含义是可以以一U优雅的方式来处理不断增长的工作Q或者以一U很明白的方式进行扩充。例如:它可以用来表C系l具备随着资源(典型的有g)的增加提升吞吐量的能力?br id="jlay3" />

垂直扩展的意思是l系l中的单节点增加资源Q典型的是给机器增加CPU或内存,垂直扩展为操作系l和应用模块提供了更多可q的资源,因此它得虚拟化的技术(应该是指在一台机器上q行多个虚拟机)能够q行的更加有效?br id="m4lu2" />

水^扩展的意思是指给pȝ增加更多的节点,例如Z个分布式的Y件系l增加新的机器,一个更清晰的例子是一台web服务器增加ؓ三台。随着计算Zh格的不断降低以及性能的不断提升,以往需要依靠超U计机来进行的高性能计算的应用(例如Q地震分析、生物计等Q现在可以采用这U多个低成本的应用来完成。由上百台普通机器构成的集群可以辑ֈ传统的基于RISC处理器的U学计算机所具备的计能力?br id="cq3n3" />

q篇文章的第一部分来讨Z垂直扩展Java应用?br id="yfvm2" />

如何让Java EE应用垂直扩展

很多的Y件设计h员和开发h员都认ؓ功能是品中最重要的因素,而性能和可扩展性是附加的特性和功能完成后才做的工作。他们中大部分h认ؓ可以借助昂贵的硬件来~小性能问题?br id="yfvm11" />

但有时候他们是错的Q上个月Q我们实验室中有一个紧急的目Q合作伙伴提供的产品在他们客h供的CPU的机器上试未达到性能的要求,因此合作伙伴希望在更多CPUQ? CPUQ的机器上测试他们的产品Q但l果却是? CPU的机器上性能反而比4 CPU的机器更差?br id="z9tj3" />

Z么会q样呢?首先Q如果你的系l是多进E或多线E的Qƈ且已l用了CPU的资源,那么在这U情况下增加CPU通常能让应用很好的得到扩展?br id="f.yh2" />

Zjava技术的应用可以很简单的使用U程QJava语言不仅可以用来支持~写多线E的应用Q同时JVM本n在对java应用的执行管理和内存理上采用的也是多线E的方式Q因此通常来说Java应用在多CPU的机器上可以q行的更好,例如Bea weblogic、IBM Websphere、开源的Glassfish和Tomcat{应用服务器Q运行在Java EE应用服务器中的应用可以立MCMT和SMP技术中获取到好处?br id="a97y3" />

但在我的实验室中Q我发现很多的品ƈ不能充分的用CPUQ有些应用在8 CPU的服务器上只能用到不到20%的CPUQ像q类应用即增加CPU也提升不了多的?br id="s.wx3" />

热锁(Hot Lock)是可扩展性的关键障碍

在JavaE序中,用来协调U程的最重要的工具就?synchronizedq个关键字了。由于java所采用的规则,包括~存h和失效,Java语言中的synchronized块通常都会其他q_提供的类似的机制更加的昂c即使程序只是一个运行在单处理器上的单线E程序,一个synchronized的方法调用也会比非同步的Ҏ调用慢?br id="jrop2" />

要检查问题是否ؓ采用synchronized关键字造成的,只需要像JVMq程发送一个QUIT指oQ译者注Q在linux上也可以用kill -3 PID的方式)来获取线E堆栈信息。如果你看到cM下面U程堆栈的信息,那么意味着你的pȝ出现了热锁的问题Q?br id="se053" />

..
"Thread-0" prio=10 tid=0x08222eb0 nid=0x9 waiting for monitor entry [0xf927b000..0xf927bdb8]
at testthread.WaitThread.run(WaitThread.java:
39)
- waiting to lock <0xef63bf08> (a java.lang.Object)
- locked <0xef63beb8> (a java.util.ArrayList)
at java.lang.Thread.run(Thread.java:
595)

synchronized 关键字强制执行器串行的执行synchronized中的动作。如果很多线E竞争同L同步对象Q那么只有一个线E能够执行同步块Q而其他的U程只能进入blocked状态了Q如果此时没有其他需要执行的U程Q那么处理器p入空闲状态了Q在q种情况下,增加CPU也带来不了多性能提升?br id="o0a-2" />

热锁可能会导致更多线E的切换和系l的调用。当多个U程竞争同一个monitorӞJVM必须l护一个竞争此monitor的线E队列(同样Q这个队列也必须同步Q,q也意味着更多的时间需要花费在JVM或OS的代码执行上Q而更的旉是用在你的程序上的?/p>

要避免热锁现象,以下的徏议能带来一些帮助:

可能的~短同步?/strong>

当你线E中持有锁的旉量~短后,其他U程竞争锁的旉也就变得更短。因此当你需要采用同步块来操作共享的变量Ӟ应该线E安全的代码攑֜同步块的外面Q来看以下代码的例子Q?/p>

Code list 1:

public boolean updateSchema(HashMap nodeTree) {
synchronized (schema) {
    String nodeName 
= (String)nodeTree.get("nodeName");
    String nodeAttributes 
= (List)nodeTree.get("attributes");
    
if (nodeName == null
        
return false;
    
else
        
return schema.update(nodeName,nodeAttributes);
}
}

上面的代码片D|Z当更?schema"变量时保护这个共享的变量。但获取attribute值部分的代码是线E安全的。因此我们可以将q部分移臛_步块的外面,让同步块变得更短一些:

Code list 2:

public boolean updateSchema(HashMap nodeTree) {
    String nodeName 
= (String)nodeTree.get("nodeName");
    String nodeAttributes 
= (List)nodeTree.get("attributes");
    
synchronized (schema) {
        
if (nodeName == null)
            
return false;
        
else
            
return schema.update(nodeName,nodeAttributes);
    }
}

减小锁的_度

当你使用"synchronized"Ӟ有两U粒度可选择Q?Ҏ??块锁"。如果你?synchronized"攑֜Ҏ上,那么也就意味着锁定?this"对象?/p>

Code list 3:

public class SchemaManager {
     
private HashMap schema;
     
private HashMap treeNodes;
     .
     
public boolean synchronized updateSchema(HashMap nodeTree) {
         String nodeName 
= (String)nodeTree.get("nodeName");
         String nodeAttributes 
= (List)nodeTree.get("attributes");
         
if (nodeName == nullreturn false;
         
else return schema.update(nodeName,nodeAttributes);
     }

     
public boolean synchronized updateTreeNodes() {
         
     }
}
ҎCode list 2中的代码Q这D代码就昑־更糟p些了,因ؓ当调?updateSchema"ҎӞ它锁定了整个
对象Qؓ了获得更好的_度控制Q应该仅仅锁?schema"变量来替代锁定整个对象,q样其他不同的方法就?br /> 以保持ƈ行执行了?br />
避免在staticҎ上加?/strong>

最p糕的状冉|在staticҎ上加"synchronized"Q这样会造成锁定q个class的所有实例对象?br />
--------------------------------
at sun.awt.font.NativeFontWrapper.initializeFont(Native Method)
- waiting to lock <0xeae43af0> (a java.lang.Class)
at java.awt.Font.initializeFont(Font.java:
316)
at java.awt.Font.readObject(Font.java:
1185)
at sun.reflect.GeneratedMethodAccessor147.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:
324)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:
838)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1736)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:
1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:
1835)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1759)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:
1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:
1835)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:
452)
at com.fr.report.CellElement.readObject(Unknown Source)

当用Java 2D来ؓ报表生成字体对象Ӟ开发h员放了一个native的static锁在"initialize"Ҏ上,不过q是sun JDK 1.4中才会出现的Q在JDK 5.0中,q个static lock消׃?br id="q2z33" />

在Java SE 5.0中用lock free的数据结?/strong>

在Java中,"synchronized"关键字是一个较单、ƈ且相Ҏ说比较好用的协作机制Q不q同时对于管理一个简单的操作Q例如增加统计值或更新一个|来说显得比较重量了,像以下的代码:

Code list 4:

public class OnlineNumber {
    
private int totalNumber;
    
public synchronized int getTotalNumber() { return totalNumber; }
    
public synchronized int increment() { return ++totalNumber; }
    
public synchronized int decrement() { return --totalNumber; }
}

以上的代码只是用来锁定非常简单的操作Q?synchronized"块也是非常的短。但是锁是非帔R量Q当锁被其他U程持有ӞU程会去频繁试获取锁)的,吞吐量会下降Qƈ且同步锁的竞争也是很昂贵的?br id="ns9d3" />

q运的是Q在Java SE 5.0或以上版本,你可以在不用native代码的情况下使用gU同步语义的wait-free、lock-free的算法。几乎所有现代的处理器都h和防止其他处理器ƈ发修改变量的基础设施。这些基设施UCؓ比较q交换,或CAS?br id="kd-s2" />

一个CAS操作包含三个参数 -- 一个内存地址Q期待的旧的g及新的倹{?如果内存地址上的值和所期待的旧的值是同一个的话,处理器将此地址的值更Cؓ新的|否则它就什么都不做Q同时它会返回CAS操作前内存地址上的倹{一个用CAS来实现同步的例子如下Q?/p>

Code list 5:

public int increment() {
    
int oldValue = value.getValue();
    
int newValue = oldValue + 1;
    
while (value.compareAndSwap(oldValue, newValue) != oldValue)
       oldValue 
= value.getValue();
    
return oldValue + 1;
}

首先Q我们从地址上读取一个|然后执行几步操作来生新的|例子中只是做?的操作)Q最后用CAS方式来将地址中的旧值改变ؓ新倹{如果在旉片段内地址上的值未改变Q那么CAS操作成功。如果另外的U程同时修改了地址上的|那么CAS操作失败,但会到q个操作p|Qƈ在while循环中进行重试。CAS最好的原因在于它是gU别的实现ƈ且非常轻量Q如?00个线E同时执行这个increment()ҎQ最p糕的情冉|?incrementҎ执行完毕前每个线E最多尝?9ơ?br id="e8l:2" />

在Java SE 5.0和以上版本的java.util.concurrent.atomic包中提供了在单个变量上lock-free和线E安全操作支持的cR这些原子变量的c都提供了比较和交换的原语,它基于各U^C可用的最后的native的方式实玎ͼq个包内提供了九U原子变量,包括QAtomicIntegerQAtomicLongQAtomicReferenceQAtomicBooleanQarray forms of atomic integer、long、referenceQ和atomic marked reference和stamped referencecR?br id="hh.52" />

使用atomic包非常容易,重写上面code list 5的代码片D:

Code list 6:

import java.util.concurrent.atomic.*;
.

private AtomicInteger value = new AtomicInteger(0);
public int increment() {
    
return value.getAndIncrement();
}
.
几乎java.util.concurrent包中所有的c都直接或间接的采用了原子变量来替代synchronized。像
ConcurrentLinkedQueue采用了原子变量来直接实现wait-free法Q而像ConcurrentHashMap则采?br /> ReentrantLock来实现必要的锁,而ReentrantLock则是采用原子变量来维护所有等待锁的线E队列?/pre>

在我们实验室中一个最成功的关于lock free法的案例发生在一个金融系l中Q当?Vector"数据l构替换?ConcurrentHashMap"后,在我们的CMT机器Q?核)性能提升了超q?倍?br id="gni13" />

竞争条g也会D可扩展性出现问?/strong>

太多?synchronized"关键字会D可扩展性出现问题。但在某些场合,~少"synchronized"也会Dpȝ无法垂直扩展。缺?synchronized"会生竞争场景,在这U场景下允许两个U程同时修改׃n的资源,q有可能会造成破坏׃n数据Qؓ什么我说它会导致可扩展性出现问题呢Q?br id="avul2" />

来看一个实际的例子。这是一个制作业的ERPpȝQ当在我们最新的一台CMT服务器(2CPU?6核?28芯)上进行性能试Ӟ我们发现CPU的用率过90%Q这非常让h惊讶Q因为很有应用能够在这ƾ机器上扩展的这么好。但我们仅仅兴奋?分钟Q之后我们发现^均响应时间非常的慢,同时吞吐量也降到不可思议的低。那么这些CPU都在q嘛呢?它们不是在忙吗,那么它们到底在忙些什么呢Q通过OS的跟t工P我们发现几乎所有的CPU都在q同一件事-- "HashMap.get()"Q看h所有的CPU都进入了d@环,之后我们在不同数量的CPU的服务器上再试了这个应用,l果表明Q服务器拥有多CPUQ那么生死循环的概率就会越高?br id="up:s2" />

产生q个d@环的Ҏ在于对一个未保护的共享变?-- 一?HashMap"数据l构的操作。当在所有操作的Ҏ上加?synchronized"后,一切恢复了正常。检?HashMap"(Java SE 5.0)的源码,我们发现有潜在的破坏其内部结构最l造成d@环的可能。在下面的代码中Q如果我们得HashMap中的entriesq入循环Q那?e.next()"永远都不会ؓnull?/p>

Code list 7:

public V get(Object key) {
    
if (key == nullreturn getForNullKey();
    
int hash = hash(key.hashCode());
    
for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e 
!= null;
         e 
= e.next) {
         Object k;
         
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            
return e.value;
    }
    
return null;
}

不仅get()Ҏ会这Pput()以及其他对外暴露的方法都会有q个风险Q这jvm的bug吗?应该说不是的Q这个现象很早以前就报告出来了(详细见:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6423457Q。Sun的工E师q不认ؓq是bugQ而是在这L场景下应采用"ConcurrentHashMap"Q在构徏可扩展的pȝ时应这点纳入规范中?br id="vgbz3" />

非阻?IO vs. dIO

Java 1.4中引入的java.nio包,允许开发h员在q行数据处理时获取更好的性能q提供更好的扩展性。NIO提供的非dIO操作允许java应用像其他底层语aQ例如cQ一h作IO。目前已l有很多NIO的框Ӟ例如Apache的Mina、Sun的GrizzlyQ了被广泛的使用在很多的目和品中?br id="z.kv6" />

在最q的5个月内,我们实验室有两个Java EE目试Ҏ了基于传l的dI/O构徏的服务器和非dI/O构徏的服务器上的性能。他们选择了Tomcat 5作ؓZdI/O的服务器QGlassfish作ؓZ非阻塞I/O的服务器?br id="s5ed3" />

首先Q他们测试了一些简单的JSP面和servletsQ得到如下结果:Q在一? CPU的服务器上)

Concurrent Users
Average Response Time (ms)
Tomcat
Glassfish
5
30
138
15
35
142
30
37
142
50
41
151
100
65
155


从测试结果来看,Glassfish的性能q低于Tomcat。客户对非阻塞I/O能够带来的提升表C怀疑,但ؓ什么那么多的文章以及技术报告都告诉大家NIO具备更好的性能和可扩展性呢Q?br id="y0vp8" />

当在更多的场景进行测试后Q随着NIO的能力逐步的展现出来,他们改变了观点,他们做了以下的测试:

1、比单的JSP、servlet更ؓ复杂的场景,包括EJB、数据库、文件IO、JMS和事务;

2、模拟更多的q发用户Q从1000?0000Q?/p>

3、在不同的硬件环境上q行试Q从2 CPU? CPU?6 CPU?/p>

以下的图为在4 CPU服务器上的测试结果:

Figure 1: Throughput in a 4CPU server

传统的阻塞I/O为每个请求分配一个工作线E,q个工作U程负责h的整个过E的处理Q包括从|络dh数据、解析参数、计或调用其他的业务逻辑、编码结果ƈ其q回l请求者,然后q个U程返回到U程池中供其他线E复用。Tomcat 5采用的这U方式在应对完美的网l环境、简单的逻辑以及量的ƈ发用h是非帔R效的?br id="cm9u3" />

但如果请求包括了复杂的逻辑、或需要和外部的系l(例如文gpȝ、数据库或消息服务器Q进行交互时Q工作线E在其处理的大部分时间都会处于等待同步的调用或网l传输返回的状态中Q这个阻塞的U程会被h持有直到h处理完毕Q但操作pȝ需要暂停线E来保证CPU能够处理其他的请求,如果客户端和服务器端的网l状况不太好的话Q网l的延时会导致线E被d更长旉Q在更糟的状况下Q当需要keep-alive的话Q当前的工作U程会在h处理完毕后阻塞很长一D|_在这L情况下,Z更好的用CPUQ就必须增加更多的工作线E了?br id="owzc3" />

Tomcat采用了一个线E池Q每个请求都会被U程池中一个空闲的U程q行处理?maxThreads"表示Tomcat 能创建的处理h的最大线E数。如果我们把"maxThreads"讄的太的话,׃能充分的使用CPU了,更ؓ重要的是Q随着q发用户的增长,会有很多h被服务器抛弃和拒l。在此次试中,我们?maxThreads"讄Z1000Q这对于Tomcat来说有些太大了)Q在q样的设|下Q当q发用户增长到较高数量时QTomcat会创建很多的U程。大量的JavaU程会导致JVM和OS忙于执行和维护这些线E,而不是执行业务逻辑处理Q同Ӟ太多的线E也会消耗更多的JVM heap内存Q每个线E堆栈需要占用一些内存)Qƈ且会D更ؓ频繁的gc?br id="hzd92" />

Glassfish不需要这么多的线E,在非dIO中,一个工作线Eƈ不会l定C个特定的h上,如果h被某些原因所dQ那么这个线E将被其他的h复用。在q样的方式下QGlassfish可以用几十个工作U程来处理几千的q发用户。通过限制U程资源Q非dIO拥有了更好的可扩展性,q也是Tomcat 6采用非阻塞IO的原因了?br id="crca2" />

Figure 2: scalability test result


单线EQ务问?br id="dh7x" />

几个月前我们实验室测试了一个基于Java EE的ERPpȝQ它其中的一个测试场景是Z产生非常复杂的分析报告,我们在不同的服务器上试了这个应用场景,发现竟然是在最便宜的AMD PC服务器上拥有最好的性能。这台AMD的服务器只有两个2.8HZ的CPU以及4G的内存,但它的性能竟然过了昂늚拥有8 CPU?2G内存的SPARC服务器?br id="cc-t2" />

原因在于这个场景是个单U程的Q务,它同时只能被一个用戯行(q发的多用户执行在这个案例中毫无意义Q,因此当运行时它只使用了一个CPUQ这Ld是没法扩展到多个处理器的Q在大多数时候,q种场景下的性能仅取决于CPU的运行速度?br id="d6vc2" />

q行是解册个问题的Ҏ。ؓ了让一个单U程的Q务ƈ行执行,你需要按序扑ևq个操作的过E中从某U程度上来讲不依赖的操作Q然后采用多U程从而实现ƈ行。在上面的案例中Q客户重新定义了"分析报告产生"的Q务,改ؓ先生成月度报告,之后Z产生的这?2个月的月度报告来生成分析报告Q由于最l用户ƈ不需?#8220;月度报告”Q因此这?#8220;月度报告”只是临时产生的结果,?月度报告"是可以ƈ行生成的Q然后用于快速的产生最后的分析报告Q在q样的方式下Q这个应用场景可以很好的扩展? CPU的SPARC服务器上q行Qƈ且在性能上比在AMD Server?0%多?br id="bjdu3" />

重新调整架构和重写代码的解决Ҏ是一个耗时q且Ҏ出现错误的工作。在我们实验室中的一个项目中采用了JOMP来ؓ其单U程的Q务获得ƈ行性。JOMP是一个基于线E的SMPq行~程的Java API。就像OpenMPQJOMP也是Ҏ~译指示来插入ƈ行运行的代码片段到常规的E序中。在JavaE序中,JOMP 通过//ompq样的指C方式来表示需要ƈ行运行的部分。JOMPE序通过q行一个预~译器来处理q些//omp的指Cƈ生成最l的java代码Q这?java代码再被正常的编译和执行。JOMP支持OpenMP的大部分Ҏ,包括׃n的ƈ行@环和q行片段Q共享变量,thread local变量以及reduction变量。以下的代码为JOMPE序的示例:

Code list 8:

Li n k e dLi s t c = new Li n k e dLi s t ( ) ;
c . add ( 
" t h i s " ) ;
c . add ( 
" i s " ) ;
c . add ( 
" a " ) ;
c . add ( 
"demo" ) ;
/ / #omp p a r a l l e l i t e r a t o r
f o r ( S t r i n g s : c )
    System . o u t . p r i n t l n ( 
" s " ) ;

像大部分的q行~译器,JOMP也是x于loop-level和集合的q行q算Q研I如何同时执行不同的q代。ؓ了ƈ行化Q两个P代之间不能生Q何的数据依赖Q这也就是说Q不能依赖于其他M一个执行后产生的计结果。要~写一个JOMPE序q不是容易的事。首先,你必ȝl用OpenMP的指C,同时q得熟悉JVM对于q些指示的内存模型映,最后你需要知道在你的业务逻辑代码的正的地方攄正确的指C?br id="f0_v2" />

另外一个选择是采用Parallel Java。Parallel JavaQ就像JOMP一P也支持OpenMP的大部分Ҏ;但又不同于JOMPQPJ的ƈ行结构部分是通过在代码中调用PJ的类来实玎ͼ而不是通过插入预编译的指示Q因此,"Parallel Java"不需要另外的预编译过E。Parallel Java不仅对于在多CPU上ƈ行有效,对于多节点的扩展能力上也同样有效。以下的代码?Parallel Java"E序的示例:

Code list 9:

static double[][] d;
new ParallelTeam().execute (new ParallelRegion()
    {
    
public void run() throws Exception
        {
        
for (int ii = 0; ii < n; ++ ii)
            {
            
final int i = ii;
            execute (
0, n-1new IntegerForLoop()
                {
                    
public void run (int first, int last)
                        {
                        
for (int r = first; r <= last; ++ r)
                           {
                           
for (int c = 0; c < n; ++ c)
                                {
                                d[r][c] 
= Math.min (d[r][c],
                                d[r][i] 
+ d[i][c]);
                                }
                            }
                        }
                    });
                }
            }
        });

扩展使用更多的内?/strong>

内存是应用的重要资源。够的内存对于M应用而言都是关键的,其是数据库pȝ和其他I/O操作频繁的系l。更多的内存意味着更大的共享内存空间以及更大的数据~冲Q这也就使得应用能够更多的从内存中读取数据而不是缓慢的盘中读取?br id="h_:l6" />

Java gc程序员从繁琐的内存分配和回收中解脱了出来,从而得程序员能够更加高效的编写代码。但gc不好的地方在于当gcq行Ӟ几乎所有工作的U程都会被挂赗另外,在gc环境下,E序员缺调度CPU来回攉些不再用的对象的控制能力。对于那些几乎实时的pȝ而言Q例如电信系l和股票交易pȝQ这Ugq和~少控制的现象是很大的风险?br id="h_:l12" />

回到Java应用在予更多的内存时是否可以扩展的问题上,{案是有些时候是的。太的内存会导致gc频繁的执行,_的内存则保证JVMp更多的时间来执行业务逻辑Q而不是进行gc?br id="uxk62" />

但它q不一定是q样的,在我们实验室中出现的真实例子是一个构建在64位JVM上的电信pȝ。?4位JVMQ应用可以突?2位JVM?GB内存的限Ӟ试时用的是一? CPU/16G内存的服务器Q其?2GB的内存分配给了java应用使用Qؓ了提高性能Q他们在初始化时q存了过3,000,000个的对象到内存中Q以免在q行时创建如此多的对象。这个品在W一个小时的试中运行的非常快,但突Ӟpȝ差不多停止运行了30多分钟,l过,发现是因为gcD了系l停止了半个时?br id="u-.z2" />

gc是从那些不再被引用的对象回收内存的过E。不被引用的对象是指应用中不再用的对象Q因为所有对于这些对象的引用都已l不在应用的范围中了。如果一堆巨大的zd的对象存在在内存中(像3,000,000个缓存的对象Q,gc需要花费很长的旉来检查这些对象,q就是ؓ什么系l停止了如此长乃至不可接受的旉?br id="qqit2" />

在我们实验室中测试过的以内存Z心的Java应用中,我们发现具备有如下特征:

1、每个请求的处理q程需要大量和复杂的对象;
2、在每个会话的HttpSession对象中保存了太多的对象;
3、HttpSession的timeout旉讄的太长,q且HttpSession没有昄的invalidatedQ?br id="ypr03" /> 4、线E池、EJB池或其他对象池设|的太大Q?br id="vvvl" /> 5、对象的~存讄的太大?br id="ypr04" />

q样的应用是不好做扩展的Q当q发的用h增长Ӟq些应用所使用的内存也会大q度的增ѝ如果大量的zd对象无法被及时的回收QJVM会在gc上消耗很长的旉Q另外,如果i予了太大的内存Q在64位JVM上)Q在q行了相对较长的旉后,jvm会花费相当长的一D|间在 gc上,因此l论是如果给jvm分配了太多的内存的话Qjava应用不可扩展。在大部分场合下Q给jvm分配3G内存(通过"-Xmx"属?是?(在windows和linux中,32位的pȝ最多只能分?G的内?的。如果你拥有更多的内存,请将q些内存分配l其他的应用Q或者就它留给OS 使用Q许多OS都会使用I闲的内存来作ؓ数据的缓冲和~存来提升IO性能。实时JVM(JSR001)可以让开发h员来控制内存的回Ӟ应用Z此特性可以告诉JVMQ?#8220;q个巨大的内存空间是我的~存Q我自己来理它,请不要自动对它进行回?#8221;Q这个功能特性得Java应用也能够扩展来支持大量的内存资源,希望JVM的提供者们能将q个Ҏ在不久的将来带入到免费的JVM版本中?/p>

Z扩展q些以内存ؓ中心的java应用Q你需要多个jvm实例或者多台机器节炏V?br id="k9em2" />

其他垂直扩展的问?/strong>

有些Java EE应用的扩展性问题ƈ不在于其本nQ有些时候外部系l的限制会成为系l扩展能力的瓉Q这些瓶颈可能包括:

  • 数据库系l:q在企业应用和web 2.0应用中是最常见的瓶颈,因ؓ数据库通常是jvmU程中共享的资源。因此数据库执行的效率、数据库事务隔离的别将会很明显的媄响系l的扩展能力。我 们看到很多的目大部分的业务逻辑以存储过E的方式攑֜数据库中Q而web层则非常的轻量,只是用来执行下数据的qo{,q样的架构在随着h数的增长 后会出现很多的扩展性问题?
  • 盘IO和网lIO?
  • 操作pȝQ有些时候系l扩展能力的瓉可能会出现在操作pȝ的限制上Q例如,在同一个目录下放了太多的文ӞD文gpȝ在创建和查找文g时变得非常的慢;
  • 同步loggingQ这是一个可扩展性的常见问题。在有些案例中,可以通过采用Apache log4j来解冻I或者采用jms消息来将同步的logging转ؓ异步执行?br id="yas50" />

q些不仅仅是Java EE应用的问题,对于所有^台的所有系l而言同样如此。ؓ了解册些问题,需要从pȝ的各个层面来从数据库理员、系l工E师和网l分析h员处得到帮助?/p>

q篇文章的第二个部分来探讨水^扩展的问题?br id="yas54" />



CONAN 2008-07-10 19:36 发表评论
]]>源代码解读Cas实现单点d(single sign out)功能实现原理 http://m.tkk7.com/conans/articles/214078.htmlCONANCONANThu, 10 Jul 2008 11:17:00 GMThttp://m.tkk7.com/conans/articles/214078.html阅读全文

CONAN 2008-07-10 19:17 发表评论
]]>
持箋集成工具hudson http://m.tkk7.com/conans/articles/213462.htmlCONANCONANTue, 08 Jul 2008 15:01:00 GMThttp://m.tkk7.com/conans/articles/213462.html一.什么是持箋集成

持箋集成的核心概?/span>

CI q程会经常构Y件组Ӟ在许多情况下Q每当源代码存储库(比如 Subversion ?ClearCaseQ中的代码发生变化时Q都要构Y件组件。CI 的好处是Q经常构Y件可以确保尽早遇到问题(比如代码~陷Q,避免问题在Y件开发周期晚期变复杂时才被发现?/span>

工具与过E?/span>

管 CI 实际上是一个过E,但是持箋集成 q个词常怸一个或多个工具相关联。在本教E中Q讲解如何安装、配|和使用 Hudson 作ؓ CI 服务器,但是要记住,CI q不只是个工兗实际上Q用的工具可能?CI 比较ơ要的方面,因ؓ CI 工具所做的仅仅是在代码存储库中探测CҎq行构徏。构E本w比用来q行它的工具重要得多?/span>

开始?CI

开始?CI 需要三个组Ӟ

  • ?Ant ?Maven {工具徏立的自动构徏q程
  • 一个代码存储库Q比?CVS ?Subversion
  • 一?CI 服务器,比如 HudsonQ但?cron 作业也可以满需?/strong>

我们来详l讨些组件?/span>

自动的构?/span>

CI q程会经帔R成YӞq需要通过构徏来完成。在 Java 环境中,Ant 是常用的构徏q_。可以?Ant 可靠地自动执行编译、测试等dQ甚臛_以执行Y件检查和部v。在掌握?CI 的所有组件之后,您会发现构徏{略是成功的 CI q程最重要的方面。如果缺适当的构E,CI 难以发挥作用?/span>

源代码管?/span>

Z?CI 正确地发挥作用,需要一个源代码理QSCMQ系l或存储库,比如 Subversion ?CVS。CI 服务器向 SCM 存储库查询代码修攏V在扑ֈ修改ӞCI 服务器执行签出(x新本地沙)q执行构建。除了执行得更频J之外,构徏q程与在本地环境中执行的构徏相同?

CI 服务?/span>

对于成功?CI q程Q需要用一个自动的q程监视 SCM 存储库ƈ在探到修改时运行构建,q也非常重要。对?Java q_Q有许多可用?CI 服务器,包括开放源码Y件和商业产品。它们的基本配置都很怼Q适合监视特定?SCM q在探测CҎq行构徏。所?CI 服务器都有自q优缺炏VHudson 其让h感兴,因ؓ它容易配|而且h强大的插Ӟq些插g可以昄试l果势{信息?br />

?Hudson ?/span>

Hudson 是一U革命性的开放源?CI 服务器,它从以前?CI 服务器吸取了许多l验教训。Hudson 最吸引人的Ҏ之一是它很容易配|:很难扑ֈ更容易设|的 CI 服务器,也很难找到开即用特性如此丰富的 CI 服务器。Hudson Ҏ使用的第二个原因是它h强大的插件框Ӟ所以很ҎdҎ。例如,一?Hudson 插g可以随时间的推移跟踪 FindBugs 和代码覆盖。它q可以报告测试结果的势Q来?JUnit ?TestNGQ以及构建结果和对应的执行时间?

Hudson 需要运?Java 5。如果需要?Hudson 附带的嵌入式容器QWinstoneQ之外的其他容器Q那么只需使用一U?Servlet 2.4 容器。对于大多数情况QWinstone p够了?br />

?Hudson使用

CI q程的最后一个方面是 CI 服务器本w。CI 服务器在整个开发过E中的主要作用是控制者:当服务器在代码存储库中探到修改Ӟ它将q行构徏的Q务委托给构徏q程本n。如果构建失败了Q那?CI 服务器将通知相关斚wQ然后l监视存储库。它的角色看h是被动的Q但是,它是快速反映问题的关键?/span>

安装 Hudson

使用 Hudson 的主要好处之一是它的设|很单。在最单的情况下,Hudson 只需要两个步骤:

  1. 下蝲最新的版本Q它打包Z?WAR 文gQ?hudson官方|址:https://hudson.dev.java.net/
  2. q行 java -jar hudson.war?

q样可以了。因Z载的是一?WAR 文gQ所以如果愿意,可以它部v?Tomcat ?JBoss {容器中。这完全由您自己军_。当ӞHudson 假设在安装它的机器上q行着 Java 5Q而且如果定义?JAVA_HOME 环境变量QHudson ׃使用它。(正如前面提到的,Hudson 需?Java 5。)

在安装ƈq行 Hudson 之后Q将 WAR 文g部v?servlet 容器或从命o行执?java -jar hudson.warQ,启动览器ƈ讉K默认安装位置。如果通过命o行运?Hudson 而且您在本地机器上,那么可以讉K http://localhost:8080/?/span>


如果一切正常(实际上不太可能出问题Q,应该会看到图 2 所C的 Hudson 启动面?/span>

配置 Hudson

如果讉K Hudson 主页的本地实例ƈ单击左上角的 Manage Hudson 链接Q应该会看到?3 所C的可配|选项列表?/strong>

?3. 配置 Hudson 非常Ҏ

参数说明:
system.message 填写一些说明信?br /> Quiet period:hudson定时构徏工程的时?U?
 :讄hudson登陆的规?默认为匿名登?
TCP port for JNLP slave agents:不了解JNLP不敢胡写M是三种方式:固定(fixed) 随机(Radom) 不?disabled),使用固定时可以填入JNLP信息

security realm:可以使用中间件容?数据?LDAP来验证安?具体怎样用法没用q?以后会有更新,研究?
authorized:可以讄w䆾的验证方?pȝ用户,匿名用户,自定义用?q有l承用户(此处也在研究?使用匿名用户)
JDK installations:讄JDK的安装\?br /> Shell executable:讄window shell命o
Ant installation:讄ant 的安装\?br /> mave installation讄mave的安装\?br /> cvs executable:讄cvsnt执行q程的\?cvs.exe)
.cvspass file:讄cvsnt理员文件的路径(passwd文g)
e-mail notification:讄当发生错误时发送的邮箱地址
hudson url:是hudson的默认地址

q可以配|服务器的其他几个方面,比如?Hudson 提供一个电子邮件服务器的位|,以便在构建失败时接收电子邮g。根据您的组l设|电子邮件的方式Q可能需要让pȝ理员帮助设|这个特性。设|电子邮件ƈ不是必需的;Hudson q支持以 RSS 作ؓ通知机制Q对于某些h来说Q这U方式比电子邮g更好。究竟选择哪些通知机制完全取决于您。(注意Q这里说的是 “哪些”Q也是_可以同时使用多种通知机制Q)

?Hudson 中配|项?/strong>

既然 Hudson 已经能够?SCM 存储库通信了,p配置目了。这个示例所用的目UCؓ solar-ci。在 Hudson 主页上单d上角?New Job 链接。这时会看到?5 所C的屏幕Q?/strong>



该页面可以我们通过hudson来管?/span>cvs里的一个对应的工程

Project name:工程名称

Description:描述信息

Discard build:如果选择此项可以讄build记录保存的天?/span>,或?/span>build记录保存的数?/span>,或者只保存最新的build记录,一般不需填写

Advance project options:可以讄hudson定时?/span>cvs工程的时间间?/span>,q可以指?/span>cvs工程check out到本地的工程路径,一般不需要填?/span>

Source code management:我们选择cvs出C下参?/span>:

Cvsroot:cvs登陆字符?/span>,格式(:protocol:user:password@host:path),例如: :pserver:cvsadmin:1@127.0.0.1:2401:/CVSNT/Repository,使用cvs必填
 

Modules:填写cvs仓库下的具体工程?span lang="EN-US">, 使用cvs必填

Branch:填写分支名称,也可以勾?span lang="EN-US">this is a tag,no a branch指定标记名称

 

选择subversion可以q行相应?span lang="EN-US">subversion

Build trigger可以讄hudson自动执行的一些动?span lang="EN-US">,build after others projects are built指定hudson构徏完成后需要l构建的工程?span lang="EN-US">

Build periodically Ҏhudson定义的语法规则来讑֮自动构徏工程的时间间?span lang="EN-US">

Post-build actions

讄一些构建完成后的动?span lang="EN-US">,如放邮g,打包,产生试报告,产生java doc {?span lang="EN-US">.

点击ok保存讄

使用hudson
q入刚配|的目,可以在左?span lang="EN-US">build history看到历史?span lang="EN-US">build
记录,点击build now 可以手动执行构徏动作,完成后可以通过记录标记的颜色来看是否出?span lang="EN-US">,U色有错,蓝色成功.点击记录查看详细信息,如果有变?span lang="EN-US">hudson列出类信息

elipse插g应用
eclipse updatesite:http://code.google.com/p/hudson-eclipse/
重新打开eclipse在windows->preferences下将出现hudson选项,讄默认的hudson url保存.
然后选择windows->open view打开hudson view
如果你己l配|hudson目列出hudson的项目名U?右键菜单可以看到所有的执行菜单,使用q是很方便的,希望大家来完善这文?


CONAN 2008-07-08 23:01 发表评论
]]>
JSP的Request session的有效时间应合理讄 http://m.tkk7.com/conans/articles/212859.htmlCONANCONANSun, 06 Jul 2008 07:04:00 GMThttp://m.tkk7.com/conans/articles/212859.html q个jsp是这LQ非常简单:
<%@ page contentType="text/html;charset=GBK" %>
Just Test.
造成q个问题的具体原因需要结合session的机制来讲了Q讲session机制的文章相当多Q感兴趣的话可以参见以下两篇文章Q?br /> http://www.builder.com.cn/2007/1123/650439.shtml
http://bbs.chinaunix.net/viewthread.php?tid=1178466

q个问题怎么说呢Q只能说session用的时候要非常注意吧,毕竟是消耗内存资源的Q而且通常session都不会去配置成即时invalidateQ都是有一定的时旉的,在这L情况下,如果在超时时间范围内出现高访问量的话Q是很有可能会造成问题的,因此时旉的合理设|非帔R要?br />
ps: 好久没玩qjsp和session了,实没太注意q种状况Q对于熟悉jsp和session机制的h来说也许q是常识
了,^_^Q见谅见谅?br /> 如果面上不需要session的话Q可以这么做Q?br /> <%@ page session="false" %>


CONAN 2008-07-06 15:04 发表评论
]]>
CAS 学习W一?http://m.tkk7.com/conans/articles/211533.htmlCONANCONANSun, 29 Jun 2008 14:21:00 GMThttp://m.tkk7.com/conans/articles/211533.html 的SSO(single sign-on)的服务,CAS 分ؓ服务端和客户端,在服务端开启SSLQ服务器下发证书安装到各个客L中,客户端在与服务器q行通讯验证Ӟ检验二者的证书是否一致?br />
STEP 1Q搭建Java Web服务器环?/strong>
安装 JDK + Tomcat 6.0.14 Q?HTTP端口8080 Q?HTTPS端口8443
JAVA_HOME = D:\Java\jdk1.6.0_04
CATALINA_HOME = D:\Java\apache-tomcat-6.0.14
安装完毕Q启动Tomcat Q在览器上 试 http://Linly:8080/

出现上述界面Q表明系lSTEP1成功搭徏?

STEP 2Q用Java Keytool工具为系l生成HTTPS证书Qƈ为系l注?/strong>
QJava Keytool相关资料可参阅:Java keytool 安全证书学习W记Q, 在DOSH体q行以下指oQ徏议编写一个BAT批处理文件执行)
[quote]
cls
rem please set the env JAVA_HOME before run this bat file
rem delete alia tomcat if it is existed
keytool -delete -alias tomcatsso -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
keytool -delete -alias tomcatsso -storepass changeit
Q注释: 清除pȝ中可能存在的名字为tomcatsso 的同名证书)
rem list all alias in the cacerts
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
Q注释: 列出pȝ证书仓库中存在证书名U列表)
rem generator a key
keytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=linly" -storepass changeit
Q注释:指定使用RSA法Q生成别名ؓtomcatsso的证书,存贮口o为changeitQ证书的DN?cn=linly" Q这个DN必须同当前主机完整名UC致哦Q切讎ͼQ!Q?/span>rem export the key
keytool -export -alias tomcatsso -file %java_home%/jre/lib/security/tomcatsso.crt -storepass changeit
Q注释: 从keystore中导出别名ؓtomcatsso的证书,生成文gtomcatsso.crtQ?/span>rem import into trust cacerts
keytool -import -alias tomcatsso -file %java_home%/jre/lib/security/tomcatsso.crt -keystore %java_home%/jre/lib/security/cacerts -storepass changeit
Q注释:tomcatsso.crt导入jre的可信Q证书仓库。注意,安装JDK是有两个jre目录Q一个在jdk底下Q一个是独立的jreQ这里的目录必须同Tomcat使用的jre目录一_否则后面Tomcat的HTTPS通讯找不到证书了)
rem list all alias in the cacerts
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
Q注释:列出jre可信任证书仓库中证书名单Q验证先前的导入是否成功Q如果导入成功,应该在列表中能找到tomcatssoq个别名Q如下图Q[/quote]

同时Q在D:\Java\jdk1.6.0_04\jre\lib\security目录下能扑ֈ“tomcatsso.crt”q个文gQ在C:\Documents and Settings\Linly目录下能扑ֈ“.keystore”文g?
满上述条g则STEP2部v完成?

STEP 3Q配|Tomcat的HTTPS服务
~辑D:\Java\apache-tomcat-6.0.14\conf下的server.xml文gQ在connector的配|位|添加以下的配置Q?
[quote]<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:/Documents and Settings/new/.keystore" keystorePass="changeit"
truststoreFile="D:/Java/jdk1.6.0_04/jre/lib/security/cacerts"
clientAuth="false" sslProtocol="TLS"/>[/quote]

启动TomcatQ访问https://linly:8443/Q出C下界面说明HTTPS配置生效Q?


STEP 4QؓHelloWorldExampleE序配置CASqo?/strong>
讉Khttp://linly:8080/examples/servlets/servlet/HelloWorldExampleQ出C下界面说明应用正常启动:

~辑D:\Java\apache-tomcat-6.0.14\webapps\examples\WEB-INF下的web.xml文gQ添加如下信息:
[quote]<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://Linly:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://Linly:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>Linly:8080</param-value>
</init-param>
</filter>
[/quote]

[quote]
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
</filter-mapping>
[/quote]

拯casclient.jar文g到目录D:\Java\apache-tomcat-6.0.14\webapps\examples\WEB-INF\lib下?
׃我们使用的是Tomcat6.0.14Q因此,q要拯commons-logging-1.0.4.jar到该目录下?

STEP 5Q部|JA-SIGQCASQ服务器
拯cas.war到D:\Java\apache-tomcat-6.0.14\webapps目录下。启动TomcatQ访问网址http://linly:8080/cas/index.jsp,出现以下画面Q?

输入用户?密码 Qlinly/linlyQQ意两个相同的字窜Q,点击“d”Q出C下画面:

表示CAS服务器配|运行成功?


STEP 6Q测试JA-SIGQCASQ部|结?/strong>
启动Tomcat?
试使用览器登陆以下网址Qhttp://linly:8080/examples/servlets/servlet/HelloWorldExampleQ页面将弹出以下认证框,点击“定”


面重定向到JA-SIG的SSOd认证面



输入用户?密码Q如Qlinly/linlyQ则通过验证Q进入应用的入口界面Q如下:


l心的用户将发现Q此时的URL不再是:
http://linly:8080/examples/servlets/servlet/HelloWorldExampleQ?
URL的尾端带上了一个ticket参数Q?
http://linly:8080/examples/servlets/servlet/HelloWorldExample?ticket=ST-2-qTcfDrdFb0bWndWgaqZD
到此QJA-SIGQCASQ服务器的初步SSO部v宣告成功

CONAN 2008-06-29 22:21 发表评论
]]>
中小型企业遗留系l{换指?/title><link>http://m.tkk7.com/conans/articles/210661.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Wed, 25 Jun 2008 11:46:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/210661.html</guid><description><![CDATA[<p><a name="N1005B"><span id="uyw4aiw" class="atitle">引言</span></a></p> <p>成功的大型企业需要其 IT 部门通过跟上技术发展来保持高水准的竞争力。这通常需要代价很高的l常性投资以l护当前?IT 投资和增L的投资。然而,中小型企业通常只有有限的预来设法C化其 IT 基础设施和资产。通常可以注意刎ͼ中小型企业只有在充分利用当前 IT 投资以后才会考虑重大的升U。他们每隔几q进行一ơ较大规模的C化投资,而不是连l地q行投资?</p> <p>“中小型企?#8221;Qsmall and medium businessQSMBQ这个术语非怸观ƈ取决于若q因素,例如q度营业额、员工数量、业务的地理分布{等。就本文而言Q我们的虚构公司 Mod Communications , Inc.Q以下也UCؓ“该公?#8221;Q是一家ؓ中西部若q个城区的家庭客户和当地企业提供高?Internet 接入、有U电视、本地和镉K电话以及无UK信服务的电信服务提供商。该公司是需要现代化?IT pȝ的中型企业的代表。该公司拥有 200 名员工,已有 20 q的l营历史Q分支机构不过 10 个,q拥有大U?75 ?IT 人员l护其当前的 IT 解决Ҏ?/p> <p>面对新的竞争Q他们感觉到了ؓ当前客户l持较高服务U别的压力。该公司希望着手进行遗留系l{换活动。该公司准备{换活动做出重大投资,q正在寻求现代化路线图规划方面的帮助。本文是?IT N、架构师和解x案开发h员准备的Qƈ解释了如何分析该公司的当前现状、组l动力和挑战Qƈ提供了一l?IT 转换zd。本文还演示了一些可在该解决Ҏ开发过E中提供帮助?IBM 产品和服务?/p> <p>Mod Communications Inc. 的大多数应用E序都是客户信息控制pȝQCustomer Information Control SystemQCICS®Q应用程序,q些应用E序使用 COBOL ~写q运行在 IBM System z™ pd中的 IBM 中端大型机系l上。虽然这些应用程序l尽最大可能地提供核心业务服务Q但是它们非常庞大、独立ƈ且难于修攏V替换或从头重新构徏q些应用E序会对当前业务程产生破坏性的影响Qƈ需要收集在q去 15 q里加入到系l中的业务智能和规则。采用某个基于面向服务的体系l构原则的渐q式遗留pȝ转换q程Q是有选择地替换该公司的应用程序组合的更加l济合算和风险更低的Ҏ。此Ҏ的一个示例是使用 Java EE (Java™ Enterprise Edition) 来开发将在诸?IBM 推出?Websphere® Application Server {应用程序服务器上运行的应用E序。新的应用程序将在可能和适当的Q何场合重用现有的功能。在构徏和部|新lgӞ其用范围超出目前应用程序的部分lg公开为服务,以便在以后的开发工作中重用?/p> <p>下面几个部分解?IT 架构师或N如何执行数据攉、分析和zdQƈ遗留系l{换过E告知公司的重要高层理人员。下面将从数据收集期间的各个步骤、分析阶D得出的各种输出、所定的徏议备选解x案和针对转换规划的指C等斚w对相x动进行描q?/p> <p><a name="N10079"><span id="uw8iq2o" class="atitle">数据攉</span></a></p> <p>数据攉的重点在于获得关于业务活动、所使用?IT 技术和 IT 投资{事的当前状态的信息。然后可以分析该数据以确定{换机会。以下步骤将准备q执行有效的数据攉工作Q?/p> <p><a name="N10083"><span id="2cmk4o4" class="smalltitle">步骤 A. 获得或准备公司的l织l构?/span></a></p> <p>务必要了解公司的l织l构图,以便定重要的团队成员和权力人物。Mod Communications, Inc. 的组l结构图表明Q总裁和首席运营官QChief Operating OfficerQCOOQ以及执行副总裁QExecutive Vice President Q将负责监督重要的业务和技术活动以及投资。对于日常职能和zdQ该l织拥有诸如“操作l?#8221;?#8220;业务服务l?#8221;?#8220;财务服务l?#8221;?#8220;通用开发组”{小l。其中每个小l都h业务和技术h员。这些小l的负责人将向执行副总裁报告Qƈ且是主要的业务和技术相兛_{的权力人物?/p> <p><a name="N1008D"><span id="2ewmww8" class="smalltitle">步骤 B. 获得有关公司l营的初步信?/span></a></p> <p>此步骤将为准备用于数据收集的详细问题集奠定基。v初,可以从与高人员q行的讨Z获得有关公司l营的粗略概c在非正式的气氛中提出有兛_司背景、公司发展、公司所属行业、优ѝ弱炏V新Z、察觉到的竞争威胁、所获奖以及类g题的诱导性问题?/p> <p>?Mod Communications, Inc. q行的有兌{换活动的M目标的讨E中Q一名高U员工提到该公司作ؓ中小型企业区D中的最佛_工工作场所之一而感到自豪。大多数员工都已lؓ该公司工作了 15 q以上。另一位高层管理h员提到实现面向服务的体系l构在公司日E上处于优先位置。该信息可以在分析阶D中提供重要的输入,以评估关于组l更改和准备情况的可能徏议所h的媄响?/p> <p><a name="N1009A"><span id="c2gyqy8" class="smalltitle">步骤 C. 准备用于详细信息攉的问卯?/span></a></p> <p>此类问卷上的问题应该跨越q泛的主题,例如业务目标、当前流E评估、应用程序组合评估、企业数据体pȝ构、基设施和操作体pȝ构、面向服务的体系l构Q以及治理。以下问题类g一个样本集?/p> <ul> <li>Mod Communications, Inc. 在未来三至五q的业务目标是什么? <li>当前用于为各方(例如客户、供应商{等Q提供h值的业务程Q由人员?或系l执行的zd集)是什么?请列出ƈ提供要的叙述? <li>业务程是否h文记录Q其中每个业务流E是否存在端到端的业务流E视图? <li>为未来三至五q计划的主要业务目标和远景是什么?其中一些示例包括改q服务请求周转时间、收入增?<em>x</em> 倍、操作成本降?<em>y</em> 倍、改q客h意度指标{等? <li>所定和分析的业务程是否与业务目标和q景持箋一_当前Q哪些业务流E可以认为是与业务目标和q景保持一致的Q哪些是不一致的Q? <li>当前的应用程序是什么,它们支持哪些业务程Q? <li>是否计划在即到来的一q里设计、开发或实现M新应用程序?h据情冉|供详l信息? <li>在当前应用程序中Q业务逻辑x事项是否与操作关注事分,从而支持操作上的松散耦合q促qY件和信息资的重用? <li>是否存在针对遗留应用E序或功能子集的既定{略Q遗留代码中是否存在导致难于随旉推移而停用遗留系l的代码依赖性? <li>h供有兛_前企业数据体pȝ构、数据模型、维护以及增强方法、数据管理方面、数据仓库等的详l信息? <li>对于您的操作的某些方面,您是否必M赖批处理数据传输Q如果是Q请详述? <li>h供有兛_前存在的g和Y件基设施的详l信息? <li>提供当前|络界面Ҏ的详l信息。什么功能通过|络提供Q以及在使用什么体pȝ构和产品Qؓ来的网l界面计划了什么附加功能? <li>h供当前的设计、开发、测试和生应用环境的详l信息? <li>是否准备了够和有效的流E来处理以下有关当前操作环境的事?q将包括用于变更理、引入新技术和服务理Q如果适用的话Q的程? <li>您是否与W三Ҏ务提供商或代理徏立连接?如果是,该连接的性质是什么(例如Q同步、异步、单向、双向)Q? <li>是否存在促进Z服务的体pȝ构的基础设施Q例如,帮助实现应用E序之间的消息交换、消息{换、独立服务查扄技术)Q如果是Q请详述? <li>是否有团体在考虑跨功能应用程序的可重用性? <li>您关?SOA 采用的动机是什么?是定位于实现附加的收入生渠道(例如实现更快的新产品上市或获取新客户Q,q是通过促进当前应用E序及系l的更好可重用性和l护来降低成本? <li>您当前的 SOA 方向是什么?您计划将要用的技术是什么?是否存在M用于目标 SOA 体系l构的现有高U设计? <li>您是否有M现有?Web 服务实现Q如果是Q请提供详细信息?</li> </ul> <p>来自 Mod Communications, Inc. 的高Uh员群{群力,一起合作回{上q问题?/p> <p><a name="N100EF"><span id="2gqigga" class="smalltitle">步骤 D. 计划安排与重要客L团队成员的后l访?/span></a></p> <p>从问L案中Q确定进一步的信息需求领域,q计划安排与重要人员的后l访谈。用组l结构图来确定要访谈的其他h员。完成后l访谈时Q数据收集阶D差不多完成了。随后的解释说明可以通过电子邮g或电话来获得?/p> <p>对于 Mod Communications, Inc.Q将准备一个关于访谈成果的报告。该报告提供了公?IT 环境和基设施、IT l织、主要角色和职责的当前状态摘要、应用程序组合概q、系l和功能摘要Q以及当前治理、未来三至五q的业务q景和目标的要概q。这可用作将来的所有工作的参考?/p> <p><a name="N100FC"><span id="oqs2yya" class="atitle">数据分析</span></a></p> <p>在数据分析过E中Q研I收集到的相兌料和文信息Q以分析各种备选解x案,从而提供徏议。按以下几个斚w对信息进行组l:</p> <ul> <li>?IT 转换的成功最重要和最关键的业务远景和目标Q以及指标? <li>隄。这些是公司正在试解决的关键业务和技术问题? <li>解决Ҏ所要考虑的约束? <li>应用E序l合分析的发现结果?</li> </ul> <p>对于 Mod Communications, Inc.Q以下是重要的业务远景和目标Q?/p> <ul> <li>实现业务各方之间改进的信息流Q包括客戗客h务代表、技术h员以及销售和市场代表。计划通过此目标削?7 - 10% 的业务开支? <li>通过C化活动和新技术采用来处理公司的客户保留问题。创建现代化路线图。向重要客户和员工传达该路线图? <li>提高软g和应用程序开发这个重要流E的效率。公叔R要简化活动和dQ以推动更高的团队成员效益和工作效率。目前,预计要发布的实际软g或应用程序要在发布日期之前一个星期才能准备就l。通过提高程效率此旉提前Z个星期。满x目标可以降低压力U别Q同时还可以提供更多的时间进行有兌发布的附加测试、交和其他zd? <li>通过新技术和更好的直观用L面降低培训和支持成本。预计通过此目标将培训成本削减 15%? <li>最q的一调查表明,该公司的内部应用E序供应感觉非常~慢Q尽该解决Ҏ所提供的全面功能获得了好评。开发团队需要用最新技术业务解决Ҏ对用h有吸引力。公司应该通过更好的用L面设计来促进易用性和工作职能效率改进? <li>提高市场竞争CQ同时吸引更多销售潜力。通过遗留资的现代化Q销售主能够吸引更多销售潜力ƈ赢得更多业务?</li> </ul> <p>Z与团队成员进行的有关该公怋用的当前程和实늚详细讨论Q以下是重要的难点和问题场景Q?/p> <ul> <li>随着旉推移Q代码变得日益难于维护。因此,引入更改要花更多的旉。这Dl护成本增加Q给定版本所接受的增强功能请求数量减。开发h员的工作效率有待提高? <li>公司不能Ҏ地招募新的开发h员来从事 COBOL 斚w的工作,COBOL 是目前用的主要~程语言。此外,要让新的开发h员在短期内高效地工作也非常困难? <li>技术文和信息非常有限Qƈ且构建和发布q程很不可靠? <li>需求、设计以及代码和试需求之间的可跟t性非常有限。这Dl护和代码修改工作非常耗时Qƈ且无法准预时间和成本? <li>公司拥有几名对公司的业务、遗留系l和数据库非怺解的q程开发h员,但他们不具备使用C~程语言所必需的面向对象技能? <li>公司~Z用于试发布准备情况的测试用例主集,q且~陷跟踪也不够全面。缺LҎ分析跟踪非常随意Q没有进行广泛的文记录?</li> </ul> <p>对于 Mod Communications, Inc.Q解x案徏议需要考虑的各U约束如下:</p> <ul> <li>公司在技术方面拥有几名非怺解业务方面、代码结构和数据库的团队成员。然而,׃目前的应用程序维护和对增强功能的承诺Q不能期待这些资源在转换工作期间的大规模可用性和参与? <li>该公司的几乎所有技术团队成员在 COBOL ~程斚w都非怼U。然而,他们~Z有关面向对象的方法和最新技术的知识。该公司希望保留大多数技术h员,因ؓ他们非常了解该业务解x案。该公司q因为善待员工而获奖,据行业调查表明这是个工作的好地方? <li>该公司的代码文非常有限?</li> </ul> <p>该公司的应用E序l合分析提供了以下信息: </p> <ul> <li>应用E序主要Z大型机? <li>20 个主要应用程序? <li>15 个应用程序有 7 q以上的历史? <li>所有应用程序都随着旉推移而进行了大量的自定义?</li> </ul> <p>该公怸直?IBM Host Access Transformation Services (HATS) 来将某些应用E序从已有基于字W的屏幕界面转换?Web 用户界面。这使该公司可以快速将现有的基于字W的屏幕界面转换为网和表单Q从而将 Web 通道用于光留应用程序。该公司应该通过创徏Z最l用戯入、易用性、导航和上下文内容呈现的新用L面来Ҏq行改进?/p> <p><a name="N10169"><span id="2o4gy4s" class="atitle">解决Ҏ</span></a></p> <p>下一步是为客户交付一l解x案徏议?/p> <p>Z对信息的分析Qؓ重要?Mod Communications, Inc. 高层理人员准备一个解x案徏议,以从资金和项目决{方面说明后l步骤?/p> <p>核心是让公司在保留其当前遗留应用E序l合的h值的同时Q逐渐地迁Ud可促q松散耦合的体pȝ构的新技术。一个徏议是采用 Java Enterprise Edition (Java EE) 作ؓq行遗留pȝ转换的合适应用程序技术。Java EE Ҏ使公司可以开发能够提供出色的囑Ş和多通道用户界面的应用程序,同时qؓ面向服务的体pȝ构做好定位。这D对各U方法进行分析以实现 Java EE 环境。这些方法如下:</p> <p><strong>a) 替换Q?/strong>诸如服务订单管理、问题报告和理及计费系l等当前核心应用E序替换为商业化现成Qcommercial off-the-shelfQCOTSQ应用程序。然后自定义和配|该应用E序和界面。这是实现{换的快速方法,但它在客h受、对现有业务程和功能的影响、组l变更和培训需求方面引入了风险?/p> <p><strong>b) 重新~写Q?/strong>使用 Java EE Ҏ重新~写应用E序。优先重新编写将l历转换的应用程序。对q些应用E序执行ZҎ的完整Y件生命周期开发,包括需求分析、设计以及开发和试。已知当前应用程序的数据库层l构非常良好和高效。在可能的情况下Q新lg可以重用数据库层的功能?</p> <p><strong>c) 大规模{换然后客户化定制Q?/strong>q是选项 b) 的一U变化Ş式。在此情况下Q将使用自动化的工具执行所有应用程序到 Java EE lg的大规模转换。然后修Ҏ得到的组件以适合需求?</p> <p><strong>d) 渐进地{换到目标q_lgQ?/strong>使用Z Java EE 的体pȝ构来构徏q渡环境。从当前遗留pȝ中公开?#8220;q后”模块提供实现。渐q地在目标^C~写代码以取代对遗留模块的依赖?</p> <p><strong>e) 使用W?4 代语aQ?th Generation LanguageQ?GLQ方法渐q地转换Q?/strong>在此情况下,用某U?4GL 语言来定义应用程序。用工具将 4GL l构自动转换?Jave EE lgQ然后将后者部|在目标q_上。例如,此方法可以?IBM 企业生成语言QEnterprise Generation LanguageQEGLQ来实现Qƈ且很适合于非常精通诸?COBOL {程序语a的程序员Q他们将不必学习诸如 Java {面向对象的语言?/p> <p>从诸如成本、工作量、时间和复杂性等斚w分析上述Q然后按照下面图 1 所C的方式对这些徏议进行归c:每个参数都具有一个优先名称—?#8220;?(H)”?#8220;?(M)”?#8220;?(L)”?/p> <br /> <a name="fig1"><strong>?1. 对各U备选解x案方法徏议的分析</strong></a><br /> <img height="376" alt="各种备选解x案的分析图解" src="http://www.ibm.com/developerworks/cn/architecture/ar-legtrans/AlternativeAnalysis.gif" width="482" /> <br /> <p>下面是一些补充徏议:</p> <ol> <li>采用模型-视图-控制器(Model-View-ControllerQMVCQ体pȝ构模式以保体系l构的灵zL。用此ҎQ数据(模型Q和用户界面Q视图)彼此分,以便对一个方面的更改不会影响另一个方面。控制器处理q响应用h作? <li>优先考虑要{换的应用E序Q以便在对业务具有最中断的情况下获得递增的业务好处。优先考虑影响客户感受的应用程序,例如服务订单理、故障单理和新服务的供应。这样可以将重点充分集中在从客户和业务用戯度看来最重要的应用程序上。这样可以帮助获得客户信仅R采用、保留和改进的满意度? <li>建立 IT ȝ理委员会,保 IT 投资处于正轨Q以在可接受的风险预内产生预期的投资回报。该委员会应该监督技术活动、重要参与者之间的交流、标准化zd和体pȝ构审核? <li>采用Ҏ驱动的步骤进行Y件开发。这会提供更好地规划和管理各U{换项目的d、日E安排、预的能力。这q有助于更好地管理风险,例如成本支、时间和功能覆盖率风险。IBM GS-Method ?Rational® Unified Process (RUP) 是此类Ҏ的示例? <li>对于从需求到设计以至开发和试的每个开发生命周期阶D采用最新的工具。这可以实现更好的文档、可跟踪性和控制Qƈ具体化方法驱动的步骤。IBM Rational 产品和工L合具有满Y件开发生命周期和ȝ需求的丰富工具集。请参见<a cmimpressionsent="1">参考资?/a>部分以获得指向更多信息的链接? <li>构徏和主动管理服务模型:各种应用E序lg是在其他应用程序中重用的直接候选组件。通过d辨别跨部门边界所需的服务,来的开发和l护工作会得益不少。这q可以推动功能的重用? <li>执行遗留资的审核:q可以帮助从当前pȝ中获得重要信息,例如业务规则。它q有助于了解业务功能和模块化工作。一些现有的遗留代码可以lg化,q公开为服务以供新pȝ使用Q直到将遗留代码替换为新lg? <li>对于中长期而言Q应评估可在应用E序之间的消息交换、消息变换和转换以及独立服务查找斚wQ进一步促q整个组l中的面向服务的基础设施软g的采用。在q方面,IBM WebSphere l合提供了若q个产品。请参见<a cmimpressionsent="1">参考资?/a>部分以获得指向有兌些品的|页的链接? <li>评估规则引擎技术的采用Q以在捕获和使用业务规则斚w引入效率。目前,该公司的代码资非常脆弱Q因为在q些q来Q代码中已引入了各种对业务规则的更改。目前,业务规则与主代码紧密耦合Q得在做出更改时必d心}慎,同时q增加了试需求? <li>在初始项目中利用外部专家或顾问:q允许更好地集中于现代化工作Qƈ为现有h员提供更多时间来跟上新技术的发展步伐。在C化工作期_完全使用现有人员也许无法应付q去Q因为团队成员将会忙于满_前承诺。此可以通过与服务提供商的一个或多个服务U定来实现。例如,IBM Global Services 拥有这斚w的各U解x案?</li> </ol> <p>提供一l在C化期间优化内部操作的Q以便ؓ当前人员提供更多参与Z。这些徏议包括:</p> <ol> <li>减少软g发布周期数量Q同时将重点更改Z集中于最关键的增强功能领域:q允许将资源集中于对客户满意度、保留和获取非常关键的领域? <li>Ҏ逻辑相关的领域对l护目q行分组Q这有助于提高开发h员的工作效率? <li>创徏q用一套全面的试用例Q在开发和l护周期中,会发生以下一U或多种情况Q?) 更改现有的功?数据l构Q?) 引入新的功能/数据l构Q?) 在完成项?1 ??2 的同时确定ƈ修复错误。由于应用程序具有如此多怺兌的部分,必须以有l织的方式执行测试以实现全面的覆盖率。在q方面,全面的测试套件可以提供好处? <li>评估所要采用的帮助台工P以便提高快速查找、分析和解决问题的能力。此cd兯可以通过分析问题势Q从而帮助确定问题正在增多的应用E序领域。用于处理问题的知识库的更好文档记录和创Z是非常有益的成果?</li> </ol> <p>h意,q些会因情况而异Qƈ且应该基于与某个情Ş有关的相关信息。上q案例研I只是一个用作指导原则的CZ?/p> <p><a name="N101EC"><span id="sog0asi" class="atitle">转换规划</span></a></p> <p>Z所选的Qؓ执行团队草拟l的转换计划。这包括短期Q一至两q_、中期(两至三年Q和长期Q五q_的项目计划。创建活动(目Q、活动的业务价倹{持l时间、大致成本和资源需求的摘要。这有助于推动资金分配决{和成果?/p> <p>转换规划期间的重要考虑事项之一涉及到硬件或遗留q_的现代化。在q一点上Q评估重用可能性也是最有利的。例如,客户拥有一?System z pd中的 IBM 中端大型机系l。该pȝ的功能之一是能够在q行 AIX® ?WebSphere Application Server 的单独分Zq行 Java 工作负蝲。该pȝ的此功能可用于实现重用,q且是确定投资需求时的一个重要考虑事项。请参见<a cmimpressionsent="1">参考资?/a>部分以获得指向更多信息的链接?/p> <p><a name="N101FF"><span id="smmuumu" class="atitle">l束?/span></a></p> <p>本文提供了深入的见解Q说明了如何Z型企业的主要高层管理h员提供遗留系l{换和C化活动的和指对{本文介l了如何通过执行数据攉、分析和步骤Qƈ提供转换规划信息以支持资金分配决{,从而有条不紊地完成该Q务?/p> <img src ="http://m.tkk7.com/conans/aggbug/210661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-06-25 19:46 <a href="http://m.tkk7.com/conans/articles/210661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGih(OSGi for Beginners) http://m.tkk7.com/conans/articles/210660.htmlCONANCONANWed, 25 Jun 2008 11:45:00 GMThttp://m.tkk7.com/conans/articles/210660.html阅读全文

CONAN 2008-06-25 19:45 发表评论
]]>
?Firebug 动态调试和优化应用E序http://m.tkk7.com/conans/articles/209619.htmlCONANCONANFri, 20 Jun 2008 15:26:00 GMThttp://m.tkk7.com/conans/articles/209619.html?/span>

Firebug ?Mozilla Firefox 览器的开源扩展,提供了很多工P可以监视、编辑和调试M Web 站点的联样式表QCSSQ、HTML、文档对象模型(DOMQ和 JavaScript。Firebug 包括一?JavaScript 控制台、一个日志记?API 以及一U有用的|络监视器。借助 FirebugQ可以很L地调试和优化 Web ?Ajax 应用E序?/p>

本文帮助您熟悉所如下?Firebug Ҏ:

  • ~辑zd Web 面?HTML、CSS ?JavaScript
  • 调试和剖析报?
  • q行日志记录以测试执行时?
  • 使用 Network Monitor 分析 Web 面的加载时?
  • 错误报告

 





立即开?/span>

使用 FirefoxQ?a cmimpressionsent="1">下蝲 Firebug。通过单击面右侧的橙色按?Install Firebug 安装此扩展?

Firefox 安装了此扩展后,重启览器。要使用 FirebugQ?

  1. 转到M一?Web 面q按 F12 在浏览器H口打开 Firebug?
  2. ?CTRL-F12 在另一个窗口打开 FirebugQ如果有两个监视器,q是一个很好的Ҏ)?

    本文使用了第一U方法在相同的浏览器H口中打开 FirebugQ如?1 所C:

 


?1. 安装后的 Firebug
安装后的 Firebug

安装后,Firebug 是禁用的。单?Enable Firebug 启用它,如图 2 所C:


?2. Firebug 昄?developerWorks 的首?/strong>
Firebug 昄?developerWorks 的首? src=

本文的后面的内容讨?Firebug 的特性?





HTML ?CSS 工具

HTML ?CSS 工具包括QHTML 查和~辑、CSS ~辑?CSS 可视化?

查和~辑 HTML

可以使用 HTML 查特性在源代码中定位可视 HTML?/p>

  1. ?Firebug H口Q单?Inspect?
  2. 鼠标移CQ何一?HTML lg之上。这样就可以?Firebug H口上看到该 HTML 元素Q被蓝色Ҏ围绕Q和 HTML 源代码。如?3 的示例:

    ?3. ?Firebug ?HTML
    ?Firebug ?HTML

  3. 单击选中?HTML 元素。有的是这会此次?#8220;锁定”到所选定的元素?
  4. 可以转到 Firebug H口q单?Edit ~辑选定的元素?

    ?4 l出?Firebug ~辑H口以及览器窗口中已编辑的文本?#8220;Editing with Firebug” 已经代替了原先的 Ajax 标题?/p>

    ?4. ~辑 HTML
    ~辑 HTML

在检查元素时Q将会看?Firebug H口内的元素嵌套Q如?5 所C:


?5. 元素嵌套
元素嵌套

~辑 CSS

q可以通过查这?Web 面q行 CSS ~辑。Inspection 视图会显C相关的 CSS 条目Q包括承样式。如?6 的示例:


?6. CSS ?/strong>
CSS ? src=

CSS 工具q可用来~辑 CSS x属性、禁用属性、自动完成和囄预览Q如?7 所C:


?7. CSS 囄预览
CSS 囄预览

CSS 的可视化

CSS 的可视化在检?HTMLQ回??3 中的蓝色ҎQ已l展C了。Firebug Layout 选项卡显CZ更多的信息,比如间隙?偏移和其他相关的量度。图 8 中的布局H口则显CZ一个导航元素的量度Q?


?8. CSS 盒的量度
CSS 盒的量度

?9 展示了能x~辑 CSS 盒的奇妙?Firebug Ҏ:


?9. CSS 盒编?/strong>
CSS 盒编? src=




JavaScript 工具

现在QJavaScript 工具?Web 开发中最有用的工具之一。Firebug 提供了调试、剖析、日志记录和命o行控制台Ҏ?

调试和剖?/font>

Firebug JavaScript 工具包括断点、监视表辑ּ和典型调试器中常见的其他一些工兗图 10 展示了断点和逐步调试的实际例子。请注意作ؓ工具提示的主机变量的倹{?/p>
?10. JavaScript 调试?/strong>
JavaScript 调试? src=

有用的调试工兯Q?

  • 直接D?JavaScript 中的特定?
  • 监视表达式(可以是Q意的 JavaScript 表达式)
  • 以可视格式调用堆?
  • 条g断点
  • 错误后进行调试的能力

 

JavaScript 剖析非常有用。如 Firebug 中的其他Ҏ一P剖析也很Ҏ使用。单?Console 选项卡上?Profile 启动剖析器,如图 11 所C:


?11. 启动 JavaScript 剖析?/strong>
JavaScript 剖析? src=

剖析开始后Q可以浏览一下此站点。单?Profile 获得剖析报告Q如?12 所C:


?12. JavaScript 剖析器报?/strong>
JavaScript 剖析器报? src=

该报告显CZ花在函数上的旉和^均时间等{?

JavaScript 日志记录

对于更愿意用老的日志记录Q而非调试Q方式的开发h员,Firebug 提供了日志记录功能。日志记录用的是一U?Firebug JavaScript API。最单的一U日志条目是 console.log("logging");?/p>

Console API 包含其他一些功能,如清?1 所C:


清单 1. Firebug Console API CZ
            console.time("test timer");
            console.log("Hello from ",document.title);
            console.info("This is info");
            console.warn("This is warning");
            console.error("This is error");
            console.timeEnd("test timer");
            

可以使用 console.time ?console.timeEnd 来测量执行时间。在详细报告中显C结果的 console.profile() ?console.profileEnd() Q见清单 1Q也可用来测量执行时间?/p>

?13 昄了这些结果。JavaScript 控制台日志测试功能被d到由 Web 服务器提供服务的面中?/p>
?13. Console 日志
Console 日志

Console API 内其他有用的Ҏ还有堆栈跟t、对象检查和字符串格式化?

JavaScript 命o?/font>

Firebug 最为强大特性之一是 JavaScript 命o行。这U命令行的用方式与其他命o行一P它执行您~写的所?JavaScript 代码Q好像它们就是页面的一部分一栗通过命o行,可以?DOM、获得属性等{。所有返回值都昄在控制台上?/p>

命o行具有自动完成功能(使用 Tab 键)以及完善的文本编辑器Q能够编写完整的函数而不仅仅是几行代码){等。图 14 l出了一个简单的控制C话。请注意 Web 面左上角的徽标。这里也可以q行x~辑?/p>
?14. 命o?JavaScript
命o?JavaScript

与控制台cMQ命令行也有一?APIQ它包含可用?Firebug 的特D函敎ͼ比如 $(id)。该函数能够q回带有l定 id 的元素?





|络监控

Firebug Network Monitor Ҏ可用来监视加蝲 Web 面所p的时间。?Net 选项卡可以看到进度栏Q该q度栏显CZ一个文件相Ҏ有其他文件开始和停止加蝲的时间。Network Monitor 分开每个文g的流量,因此可以查看加载图像、JavaScript、HTML {各占用了多时间。此外,q可以查看资源是否从览器缓存中加蝲?/p>

对于本例中的 Ajax 开发,Firebug ?Net 选项卡和 Console 选项卡中均显CZ每个 XMLHttpRequest?

?15 昄了如何利?Network Monitor 查看 HTTP h和响应头。要查看 HTTP _只需单击每个h左侧的箭头将其展开。全部请求、已用时间和内容的大均昄?Firebug H口底部?/p>
?15. Network Monitor
Network Monitor




其他Ҏ?/span>

Firebug 的其他特性包括:

错误报告

一旦错误发生,Firebug 能够提供有用的:

  • 状态栏指示?
  • 行号、文件和堆栈跟踪
  • 调试器集?
  • 搜烦和过滤器

Firebug q会昄只与所查看的页面相关的错误?/p>

DOM

Document Object Model ?Web 面中的对象和函数的{l构。Firebug DOM 包括所有定制的和标准的对象Q而且 DOM explorer 能够分L它们。这里同样可以进?JavaScript 代码D、自动完成和x~辑?/p>

定制

Firebug 定制Ҏ包括黑名单和白名单以及依据个h需要更改字体大的功能?/p>

CONAN 2008-06-20 23:26 发表评论
]]>
q接各种数据库方式速查?/title><link>http://m.tkk7.com/conans/articles/209591.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 20 Jun 2008 15:05:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/209591.html</guid><description><![CDATA[1、Oracle8/8i/9i数据库(thin模式Q?br /> Class.forName("oracle.jdbc.driver.Oracl<span id="S__699_ADDIV_2" onmouseover="S__699.SHOWFLOW('ED','2',event);this.style.textDecoration='none';" style="cursor: pointer; color: rgb(102,0,255); border-bottom: rgb(102,0,255) 1px dotted; background-color: transparent; text-decoration: underline" onclick="S__699.SHOWFLOW('ED','2',event);" onmouseout="S__699.hidden('2');;this.style.textDecoration='underline';" oncontentextmenu="return false">ED</span>river").newInstance();<br /> String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID<br /> String user="scott";<br /> String password="tiger";<br /> Connection conn= DriverManager.getConnection(url,user,password);<br /> <br /> <br />   2、DB2数据?br /> Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();<br /> String url="jdbc:db2://localhost:5000/sample"; //sampleZ的数据库?br /> String user="admin";<br /> String password="";<br /> Connection conn= DriverManager.getConnection(url,user,password);<br /> <br /> <br />   3、Sql Server7.0/2000数据?br /> Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();<br /> String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";<br /> //mydb为数据库<br /> String user="sa";<br /> String password="";<br /> Connection conn= DriverManager.getConnection(url,user,password);<br /> <br /> <br />   4、Sybase数据?br /> Class.forName("com.sybase.jdbc.SybDriver").newInstance();<br /> String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDBZ的数据库?br /> Properties sysProps = System.getProperties();<br /> SysProps.put("user","userid");<br /> SysProps.put("password","user_password");<br /> Connection conn= DriverManager.getConnection(url, SysProps);<br /> <br /> 5、Informix数据?br /> Class.forName("com.informix.jdbc.IfxDriver").newInstance();<br /> String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;<br /> user=testuser;password=testpassword"; //myDB为数据库?br /> Connection conn= DriverManager.getConnection(url);<br /> <br /> <br />   6、MySQL数据?br /> Class.forName("org.gjt.mm.mysql.Driver").newInstance();<br /> String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"<br /> //myDB为数据库?br /> Connection conn= DriverManager.getConnection(url);<br /> <br /> <br />   7、PostgreSQL数据?br /> Class.forName("org.postgresql.Driver").newInstance();<br /> String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库?br /> String user="myuser";<br /> String password="mypassword";<br /> Connection conn= DriverManager.getConnection(url,user,password);<br /> <br /> <br />   8、access数据库直q用ODBC?br /> Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;<br /> String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");<br /> Connection conn = DriverManager.getConnection(url,"","");<br /> Statement stmtNew=conn.createStatement() ;   <img src ="http://m.tkk7.com/conans/aggbug/209591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-06-20 23:05 <a href="http://m.tkk7.com/conans/articles/209591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Firefox: 开发h员必备的 6 个扩?/title><link>http://m.tkk7.com/conans/articles/209586.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 20 Jun 2008 15:02:00 GMT</pubDate><guid>http://m.tkk7.com/conans/articles/209586.html</guid><description><![CDATA[<p>如今Q我怿M一个网开发h员的电脑中,Firefox 览器的重要E度和用频率一定程度上会超q?Internet Explore。不仅因为它可以<a target="_blank"><font style="background-color: #eaffcc" color="#336633">良好的支持标?/font></a>Q而且众多强大的扩展已l把 Firefox 从一个单U的试q_转变Z个良好的调试q_。由于我qx也做一?Web Dev 相关的工作,几个我个h认ؓ对开发很有用的扩展推荐给大家?/p> <ol> <li><a target="_blank"><font style="background-color: #eaffcc" color="#336633">FireBug</font></a>Q在 Web 调试工具中,FireBug 现在几乎已经成ؓ了众多调试工L标准Q其强大E度l对乎你的惌。FireBug 可以快速分析出面?DOM l构Qƈ生成可折叠、展开的树状图。对于每一个元素,我们都可以通过 FireBug 来实时更改它的属性、值甚?CSSQ特别是?CSS 的修改,l果会实时展现在面上,q对 Web UI 人员来说l对是个非常实用的功能。而对于开发h员来_FireBug 可以?Javascript 讑֮短点Q可以通过z的函数监控变量、生成日志方便调试。FireBug l对无愧?Firefox 中第一调试工具的称受? <li><a target="_blank"><font style="background-color: #eaffcc" color="#336633">WebDeveloper</font></a>Q老牌 Firefox 扩展调试工具Q发展到现在Q虽然功能明显不?FireBugQ但有些功能q是非常实用。例如根据预设调整窗口大、显C?HTTP 相应报头、快速标准验证等都是非常实用的。对?Web Developer 们还是个必不可少的扩展? <li><a target="_blank"><font style="background-color: #eaffcc" color="#336633">TabMixPlus</font></a>QWeb Developer 们浏览器的一大特点,是开得标{ַ多无比。这时一个良好的标签理扩展必不可了Q在q方面,TabMixPlus q是最为强大的。当然如果机器配|不好,可以用功能相对较的 Tab Mix Lite CE 来代ѝ? <li><a target="_blank"><font style="background-color: #eaffcc" color="#336633">View Source Chart</font></a>Q查看源码的好助手,不仅可以?HTML 代码整理得非常易读,而且通过语法高亮q一步提高可L? <li><a target="_blank"><font style="background-color: #eaffcc" color="#336633">IETab</font></a>Q不你怎么憎恨 IEQ做Z?Firefox Only 的网站还是会意味着失去 80% 的访客,因此最l成品在 IE 中测试一下还是很有必要的。有了这个扩展,你就不用再费力的d开一?IE H口了,直接一点击可以切换(相当于ؓ Firefox 武装上了 IE 引擎Q? <li><a target="_blank"><font style="background-color: #eaffcc" color="#336633">Personal Menu</font></a>Q对于网开发者来_一个浏览器有尽可能大的工作区面U是非常重要的。Firefox 上的菜单多少有点鸡肋Q用q个扩展既可以隐藏掉菜单Q而且q可以毫不损失它的功能,非常爽? <div id="gggogyo" class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6b751716-c296-4618-bf1d-9dd9d1875828" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"></div> </li> </ol> <img src ="http://m.tkk7.com/conans/aggbug/209586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/conans/" target="_blank">CONAN</a> 2008-06-20 23:02 <a href="http://m.tkk7.com/conans/articles/209586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://guilinsix.com" target="_blank">һëƬѿ</a>| <a href="http://htsp777.com" target="_blank">ձÿӰѿ</a>| <a href="http://8izh.com" target="_blank">߹ۿ</a>| <a href="http://liulian88.com" target="_blank">һaƬþëƬ </a>| <a href="http://bjmyhfc.com" target="_blank">¾þþƷ</a>| <a href="http://zs0451.com" target="_blank">EEUSSӰԺWWW߹ۿ</a>| <a href="http://f2dai.com" target="_blank">߹ۿ</a>| <a href="http://sxgzjssb.com" target="_blank">ݾ߹ۿվ</a>| <a href="http://2002tw.com" target="_blank">aëƬȫƵ18</a>| <a href="http://szqsnt.com" target="_blank">Ĺѹۿ߲</a>| <a href="http://42329c.com" target="_blank">˳Ƶ</a>| <a href="http://aabbcc567.com" target="_blank">18Ůվ</a>| <a href="http://www769393.com" target="_blank">ĻӰwwwĻ</a>| <a href="http://zuahowan.com" target="_blank">ҹAVר߲</a>| <a href="http://dgyinhezy.com" target="_blank">վС˵</a>| <a href="http://nmcytsi.com" target="_blank">ŷ͵ҹɫ</a>| <a href="http://guakao88.com" target="_blank">Ƭѹۿ</a>| <a href="http://fsrongxing.com" target="_blank">޵һҳۺͼƬ</a>| <a href="http://gztzbj.com" target="_blank">һɫþ88ۺ</a>| <a href="http://billtsssrvp.com" target="_blank">ˬָ߳Ƶ </a>| <a href="http://sxjttxkywl.com" target="_blank">auƵӰԺ</a>| <a href="http://4794d.com" target="_blank">һػƬ</a>| <a href="http://zuahowan.com" target="_blank">޻߹ۿ</a>| <a href="http://wwwby1378.com" target="_blank">պ˳ۺ</a>| <a href="http://www-65jjj.com" target="_blank">99þ99þѾƷС˵</a>| <a href="http://gyqcy.com" target="_blank">ձѲ</a>| <a href="http://taoduoduo666.com" target="_blank">޹Ʒһһҳ</a>| <a href="http://fuhui123.com" target="_blank">޹պƵ</a>| <a href="http://masfd.com" target="_blank">޹Ʒһ</a>| <a href="http://baiyifuwu.com" target="_blank">þ99޾Ʒۿ</a>| <a href="http://www611rr.com" target="_blank">޾ƷƬþò</a>| <a href="http://yy1514.com" target="_blank">츾AV</a>| <a href="http://jgc528.com" target="_blank">ھƷƵѡ߹ۿ</a>| <a href="http://www4438xx2.com" target="_blank">MV߹ۿѸ</a>| <a href="http://86trader.com" target="_blank">Ƶ88</a>| <a href="http://snsdtv.com" target="_blank">AVҹƷһ</a>| <a href="http://avav2021.com" target="_blank">޾Һһ</a>| <a href="http://26672814.com" target="_blank">һƵ</a>| <a href="http://mangshigas.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://btztjxc.com" target="_blank">2019Ļ</a>| <a href="http://002309.com" target="_blank">av߹ۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>