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

<channel>
	<title>Java堂</title>
	<atom:link href="http://www.javatang.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.javatang.com</link>
	<description>Java Tang</description>
	<lastBuildDate>Thu, 08 Dec 2011 08:29:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MySQL中更新与子查询条件中同一个表中的字段数据</title>
		<link>http://www.javatang.com/archives/2011/12/08/2906565.html</link>
		<comments>http://www.javatang.com/archives/2011/12/08/2906565.html#comments</comments>
		<pubDate>Thu, 08 Dec 2011 08:29:06 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=565</guid>
		<description><![CDATA[在MySQL中使用update语句的时候，Where条件或者值都可以使用子查询，比如： UPDATE table_a SET name=(SELECT name FROM table_b WHERE id=1)&#160; WHERE&#160;id IN (SELECT id FROM table_c WHERE age &#62; 24); 但是如果子查询和更新的表是同一个表的话，MySQL会报如下的错误： Error Code : 1093 You can&#8217;t specify target table &#8216;table_a&#8217; for update in FROM clause 这种情况下就需要使用MySQL的临时表做一个中转，代码如下： -- 将查询的结果写入到临时表中 CREATE&#160;TEMPORARY TABLE tmp_table (SELECT * FROM table_a WHERE NAME='Tom'); UPDATE&#160;table_a SET parentId=(SELECT id FROM tmp_table WHERE [...]]]></description>
			<content:encoded><![CDATA[<p>在MySQL中使用update语句的时候，Where条件或者值都可以使用子查询，比如：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">UPDATE</span><span style="color: Gray;"> </span><span style="color: Blue;">table_a</span><span style="color: Gray;"> </span><span style="color: Green;">SET</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;"> </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">table_b</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">WHERE</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Green;">IN</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">table_c</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: Blue;">age</span><span style="color: Gray;"> &gt; </span><span style="color: Maroon;">24</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>但是如果子查询和更新的表是同一个表的话，MySQL会报如下的错误：</p>
<blockquote><p>
Error Code : 1093<br />
You can&#8217;t specify target table &#8216;table_a&#8217; for update in FROM clause
</p></blockquote>
<p>这种情况下就需要使用MySQL的临时表做一个中转，代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">-- 将查询的结果写入到临时表中</span></li>
<li><span style="color: Green;">CREATE</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">TEMPORARY</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp_table</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> * </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">table_a</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: #00008b;">NAME</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">Tom</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">UPDATE</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">table_a</span><span style="color: Gray;"> </span><span style="color: Green;">SET</span><span style="color: Gray;"> </span><span style="color: Blue;">parentId</span><span style="color: Gray;">=</span><span style="color: Olive;">(</span><span style="color: Green;">SELECT</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Green;">FROM</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp_table</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: #00008b;">NAME</span><span style="color: Gray;">=</span><span style="color: #8b0000;">'</span><span style="color: Red;">Tom</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">WHERE</span><span style="color: Gray;"> </span><span style="color: Blue;">id</span><span style="color: Gray;"> = </span><span style="color: Maroon;">100</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;">-- 删除临时表</span></li>
<li><span style="color: Green;">DROP</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">tmp_table</span><span style="color: Gray;">;</span></li></ol></div>
<p>参考资料：<br />
<a href="http://www.cnblogs.com/RoadGY/archive/2011/07/22/2114088.html" target="_blank">语法：MySQL中INSERT INTO SELECT的使用</a><br />
<a href="http://bbs.chinaunix.net/thread-1787620-1-1.html" target="_blank">MySQL中的临时表使用方法</a><br />
<a href="http://www.cnblogs.com/plusium/archive/2010/03/01/1675984.html" target="_blank">关于mysql的 SELECT &#8230; INTO 语法</a><br />
<a href="http://blog.csdn.net/besily/article/details/3194286" target="_blank">MySQL select into 和 SQL select into</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2006/07/23/342351.html" rel="bookmark" class="crp_title">SQL Server中删除重复数据最快的方法</a></li><li><a href="http://www.javatang.com/archives/2008/03/13/5500263.html" rel="bookmark" class="crp_title">Discuz!一次误删会员用户组的恢复</a></li><li><a href="http://www.javatang.com/archives/2006/09/23/542969.html" rel="bookmark" class="crp_title">PHPWind中出现 “Update Error: INSERT LOW_PRIORITY INTO pw_tmsgs ”问题的解决</a></li><li><a href="http://www.javatang.com/archives/2006/06/13/242443.html" rel="bookmark" class="crp_title">Oracle中的”值和null以及java中的null区别</a></li><li><a href="http://www.javatang.com/archives/2006/05/03/061828.html" rel="bookmark" class="crp_title">密码保护：JDBC操作SQL Server小结</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/12/08/2906565.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ext中设置Ajax超时时间</title>
		<link>http://www.javatang.com/archives/2011/10/18/1847563.html</link>
		<comments>http://www.javatang.com/archives/2011/10/18/1847563.html#comments</comments>
		<pubDate>Tue, 18 Oct 2011 12:18:47 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[DynamicLanguage]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=563</guid>
		<description><![CDATA[在Ext中无论是在Grid、Combox中使用Store加载数据，还是直接使用Ajax发送请求，其超时时间均可以统一使用如下代码进行设置： // 超时时间，单位毫秒 Ext.Ajax.timeout = 5 * 60 * 1000; 注意，单位是毫秒。 不过以前不知道是因为在哪里搜索的结果，还是Ext 2.x版本中的问题，使用了Ext.lib.Ajax.timeout = 5 * 60 * 1000;的方式进行设置，但是这种方式是无效的。 Ext的版本是3.2.1. Related Posts:Apache和Resin组合时间歇性出现503错误的解决方法DWR文档之DWR总览Discuz!一次误删会员用户组的恢复最流行的 Ajax/Java 框架DWR文档之 网络上的资料]]></description>
			<content:encoded><![CDATA[<p>在Ext中无论是在Grid、Combox中使用Store加载数据，还是直接使用Ajax发送请求，其超时时间均可以统一使用如下代码进行设置：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">// 超时时间，单位毫秒</span></li>
<li><span style="color: Blue;">Ext</span><span style="color: Gray;">.</span><span style="color: Blue;">Ajax</span><span style="color: Gray;">.</span><span style="color: Blue;">timeout</span><span style="color: Gray;"> = </span><span style="color: Maroon;">5</span><span style="color: Gray;"> * </span><span style="color: Maroon;">60</span><span style="color: Gray;"> * </span><span style="color: Maroon;">1000</span><span style="color: Gray;">;</span></li></ol></div>
<p>注意，单位是毫秒。</p>
<p>不过以前不知道是因为在哪里搜索的结果，还是Ext 2.x版本中的问题，使用了Ext.lib.Ajax.timeout = 5 * 60 * 1000;的方式进行设置，但是这种方式是无效的。</p>
<p>Ext的版本是3.2.1.</p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2010/11/13/1228487.html" rel="bookmark" class="crp_title">Apache和Resin组合时间歇性出现503错误的解决方法</a></li><li><a href="http://www.javatang.com/archives/2006/10/19/301977.html" rel="bookmark" class="crp_title">DWR文档之DWR总览</a></li><li><a href="http://www.javatang.com/archives/2008/03/13/5500263.html" rel="bookmark" class="crp_title">Discuz!一次误删会员用户组的恢复</a></li><li><a href="http://www.javatang.com/archives/2006/10/20/230978.html" rel="bookmark" class="crp_title">最流行的 Ajax/Java 框架</a></li><li><a href="http://www.javatang.com/archives/2006/10/24/424782.html" rel="bookmark" class="crp_title">DWR文档之 网络上的资料</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/10/18/1847563.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache+Resin发布程序时一直出现403错误的解决办法</title>
		<link>http://www.javatang.com/archives/2011/09/20/2831546.html</link>
		<comments>http://www.javatang.com/archives/2011/09/20/2831546.html#comments</comments>
		<pubDate>Tue, 20 Sep 2011 15:28:31 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Web&Server]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=546</guid>
		<description><![CDATA[今天在Linux下面把Apach和Resin整合之后，程序发布的时候总是出现403错误。首先检查了一下Apache和Resin的配置文件，新建一个webapp显示解析成功，这样证明二者整合是正确的；另外还有一个现象，就是同样的程序在Windows下也是使用Apache和Resin进行整合的，但是运行正常，这样就排除了程序自身的问题。 因为页面总是显示403错误，又想到Windows和Linux下面最大的区别就是对文件权限的设置，于是使用 ls -l 命令查看了目录的权限，果然发现目录的权限只是 drwx&#8212;&#8212;，应该设置为 drwxr-xr-x，于是使用 chmod -R 755 directory 其中-R参数用于使设定的权限用于该目录及子目录下所有文件和目录。 另外再复习一下权限的基础知识： “rwx”表示 4(r)+2(w)+1(x)=7 “rw-”表示 {4(r)+2(w)+0(-)=6 参考资料： linux修改文件夹-文件目录权限 Related Posts:Apache+Resin下如何写伪静态和301跳转Resin 3.0.x 经验总结Apache和Resin产生大容量日志的解决办法Windows下安装zip包版本的MySQLApache+Resin泛域名的设置]]></description>
			<content:encoded><![CDATA[<p>今天在Linux下面把<a href="http://www.javatang.com/index.php?s=apache+resin">Apach和Resin整合</a>之后，程序发布的时候总是出现403错误。首先检查了一下Apache和Resin的配置文件，新建一个webapp显示解析成功，这样证明二者整合是正确的；另外还有一个现象，就是同样的程序在Windows下也是使用Apache和Resin进行整合的，但是运行正常，这样就排除了程序自身的问题。</p>
<p>因为页面总是显示403错误，又想到Windows和Linux下面最大的区别就是对文件权限的设置，于是使用 <strong>ls -l</strong> 命令查看了目录的权限，果然发现目录的权限只是 drwx&#8212;&#8212;，应该设置为 drwxr-xr-x，于是使用</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">chmod -R 755 directory</li></ol></div>
<p>其中-R参数用于使设定的权限用于该目录及子目录下所有文件和目录。</p>
<p>另外再复习一下权限的基础知识：</p>
<blockquote><p>
“rwx”表示 4(r)+2(w)+1(x)=7<br />
“rw-”表示 {4(r)+2(w)+0(-)=6
</p></blockquote>
<p>参考资料：<br />
<a href="http://blog.ixm.me/archives/320.html" target="_blank">linux修改文件夹-文件目录权限</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2008/10/18/1942276.html" rel="bookmark" class="crp_title">Apache+Resin下如何写伪静态和301跳转</a></li><li><a href="http://www.javatang.com/archives/2006/08/21/010658.html" rel="bookmark" class="crp_title">Resin 3.0.x 经验总结</a></li><li><a href="http://www.javatang.com/archives/2007/06/20/1513177.html" rel="bookmark" class="crp_title">Apache和Resin产生大容量日志的解决办法</a></li><li><a href="http://www.javatang.com/archives/2007/03/30/1025157.html" rel="bookmark" class="crp_title">Windows下安装zip包版本的MySQL</a></li><li><a href="http://www.javatang.com/archives/2008/03/18/2532264.html" rel="bookmark" class="crp_title">Apache+Resin泛域名的设置</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/09/20/2831546.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决Google浏览器自动更新后一直提示重启浏览器的问题</title>
		<link>http://www.javatang.com/archives/2011/01/14/3017542.html</link>
		<comments>http://www.javatang.com/archives/2011/01/14/3017542.html#comments</comments>
		<pubDate>Fri, 14 Jan 2011 08:30:17 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[chrome]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=542</guid>
		<description><![CDATA[在Google浏览器中的“关于”窗口中可以自动更新浏览器，但是有时候使用自动更新完成后，会提示： Restart google chrome to finish updating 点击“Restart Now”按钮之后再打开“关于”对话框之后还是有上面的提示，反反复复总是这样，更新失败，但是也没有办法再更新。后来Google找到了解决的方法： 首先打开Google浏览器，然后进入浏览器的安装目录（可以右键快捷方式，选择属性，然后再点击“查找目标”按钮），接下来将chrome.exe修改一个其他的名称，比如chrome-old.exe，最后关掉浏览器再打开，就不会有上面的问题了。 参考资料： Issue 58256: Dev cannot update Related Posts:离线版Google Chrome Frame下载GOOGLE服务列表彻底修改Google Chrome浏览器的安装目录Google发布“网站导航”Lucene创建索引时出现的segments或deletable拒绝访问异常的原因]]></description>
			<content:encoded><![CDATA[<p>在Google浏览器中的“关于”窗口中可以自动更新浏览器，但是有时候使用自动更新完成后，会提示：</p>
<blockquote><p>
Restart google chrome to finish updating
</p></blockquote>
<p>点击“Restart Now”按钮之后再打开“关于”对话框之后还是有上面的提示，反反复复总是这样，更新失败，但是也没有办法再更新。后来Google找到了解决的方法：</p>
<p>首先打开Google浏览器，然后进入浏览器的安装目录（可以右键快捷方式，选择属性，然后再点击“查找目标”按钮），接下来将chrome.exe修改一个其他的名称，比如chrome-old.exe，最后关掉浏览器再打开，就不会有上面的问题了。</p>
<p>参考资料：<br />
<a href="http://code.google.com/p/chromium/issues/detail?id=58256#c11" target="_blank">Issue 58256:	Dev cannot update</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2010/01/19/4754372.html" rel="bookmark" class="crp_title">离线版Google Chrome Frame下载</a></li><li><a href="http://www.javatang.com/archives/2006/09/18/365065.html" rel="bookmark" class="crp_title">GOOGLE服务列表</a></li><li><a href="http://www.javatang.com/archives/2010/07/11/4201420.html" rel="bookmark" class="crp_title">彻底修改Google Chrome浏览器的安装目录</a></li><li><a href="http://www.javatang.com/archives/2007/03/12/5833125.html" rel="bookmark" class="crp_title">Google发布“网站导航”</a></li><li><a href="http://www.javatang.com/archives/2007/06/14/5433176.html" rel="bookmark" class="crp_title">Lucene创建索引时出现的segments或deletable拒绝访问异常的原因</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2011/01/14/3017542.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2.x中设置gzip</title>
		<link>http://www.javatang.com/archives/2010/12/01/2805477.html</link>
		<comments>http://www.javatang.com/archives/2010/12/01/2805477.html#comments</comments>
		<pubDate>Wed, 01 Dec 2010 05:28:05 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[Web&Server]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[gzip]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=477</guid>
		<description><![CDATA[在Apache2.x中使用mod_deflate进行gzip压缩，配置信息如下： LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so &#160; # gzip 设置 # Only compress specified content type # see also http://www.devside.net/guides/config/compression &#60;IfModule mod_deflate.c&#62; &#160;&#160; &#160;# The value must between 1 (less compression) and 9 (more compression) &#160;&#160; &#160;DeflateCompressionLevel 7 &#160;&#160; &#160;# compress content with type html, text, and css &#160;&#160; &#160;AddOutputFilterByType DEFLATE text/html text/plain text/xml [...]]]></description>
			<content:encoded><![CDATA[<p>在Apache2.x中使用mod_deflate进行gzip压缩，配置信息如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">LoadModule deflate_module modules/mod_deflate.so</li>
<li>LoadModule headers_module modules/mod_headers.so</li>
<li>&nbsp;</li>
<li># gzip 设置</li>
<li># Only compress specified content type</li>
<li># see also http://www.devside.net/guides/config/compression</li>
<li>&lt;IfModule mod_deflate.c&gt;</li>
<li>&nbsp;&nbsp; &nbsp;# The value must between 1 (less compression) and 9 (more compression)</li>
<li>&nbsp;&nbsp; &nbsp;DeflateCompressionLevel 7</li>
<li>&nbsp;&nbsp; &nbsp;# compress content with type html, text, and css</li>
<li>&nbsp;&nbsp; &nbsp;AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/json</li>
<li>&nbsp;&nbsp; &nbsp;# place filter 'DEFLATE' on all outgoing content</li>
<li>&nbsp;&nbsp; &nbsp;SetOutputFilter DEFLATE</li>
<li>&nbsp;&nbsp; &nbsp;# Properly handle old browsers that do not support compression</li>
<li>&nbsp;&nbsp; &nbsp;BrowserMatch ^Mozilla/4 gzip-only-text/html</li>
<li>&nbsp;&nbsp; &nbsp;BrowserMatch ^Mozilla/4\.0[678] no-gzip</li>
<li>&nbsp;&nbsp; &nbsp;BrowserMatch \bMSIE !no-gzip !gzip-only-text/html</li>
<li>&lt;/IfModule&gt;</li></ol></div>
<p>参考资料：<br />
<a href="http://jackyrong.javaeye.com/blog/797656" target="_blank">apache 2.2.15中配置mod_deflate</a><br />
<a href="http://www.devside.net/guides/config/compression" target="_blank">httpd.conf &#8212; compression</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2007/03/10/3018122.html" rel="bookmark" class="crp_title">使Apache实现gzip压缩</a></li><li><a href="http://www.javatang.com/archives/2008/04/20/5034268.html" rel="bookmark" class="crp_title">Javascript的国际化方案</a></li><li><a href="http://www.javatang.com/archives/2007/11/11/5611239.html" rel="bookmark" class="crp_title">两个PHP的Warning及解决方法</a></li><li><a href="http://www.javatang.com/archives/2007/10/06/5104204.html" rel="bookmark" class="crp_title">Javascript怎样设置文本框的readonly属性？</a></li><li><a href="http://www.javatang.com/archives/2010/03/21/1529393.html" rel="bookmark" class="crp_title">ExtJS hack: Add multiple toolbars to a Panel</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/12/01/2805477.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JRebel运行缓慢或提示内存不足的解决方法</title>
		<link>http://www.javatang.com/archives/2010/11/29/3337530.html</link>
		<comments>http://www.javatang.com/archives/2010/11/29/3337530.html#comments</comments>
		<pubDate>Mon, 29 Nov 2010 09:33:37 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[JavaPlateform]]></category>
		<category><![CDATA[jrebel]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=530</guid>
		<description><![CDATA[JRebel是一个Java类热启动的工具，使Java开发（特别是Web开发）可以实现像PHP开发那样即时刷新的效果，这样再也不用修改java文件之后频繁的去重启Web Server了，用起来非常的顺手。 最近JRebel好像更新也非常频繁，8月份刚发布3.0版本，11月份就发布了3.5版本，而且这个新版本用下来非常给力，针对了spring增加了许多扩展（默认是打开的），比如可以实时更新所有Spring的配置文件等等，手痒痒的同学可以下载下来试试。BTW，我用的是正式版，:) 安装的方法也非常简单，就在vm后面增加一个-noverify 参数： -noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar 当然还是记得将上面的路径修改成你自己本机JRebl的存放路径。 上面的都不是本文的重点，这里需要说一下的就是，或许3.5版本增加的功能特性太多的缘故（特别是针对Spring），刚开始启动的时候速度非常的慢，开始的时候我怀疑是spring插件的问题，于是使用 -Djrebel.spring_plugin=false将spring插件关闭了，之后启动的速度可以接受了，但是运行程序的时候速度非常非常的慢，点一个按钮要等半天。如果不使用JRebel的话程序运行正常，所以排除了程序本身的问题。 刚开始一直在怀疑是不是新版本的问题，因为用2.x和3.0的时候都很正常，所以在这方面查了很多资料，都没有发现好的解决办法。后来，无意中发现程序出现了“java.lang.OutOfMemoryError: PermGen space”的错误，突然才想到是否是给JRebel分配的内存太小了，于是使用下面的参数增加了内存： -noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar -Xmx512M -Xms512M -XX:MaxPermSize=1024m 然后在运行的时候发现速度是非一般的快啊，使用JRebel的spring插件之后启动速度也非常的块了，看来就是这个问题，后来在JRebel官方上的Q&#038;A上面也得到了印证。 需要说明一点的是，如果上面的参数无法启动，需要将内存数设置小一些；还有，增加Eclipse的内存对JRebl是没有任何效果的，虽然现在想起来和可笑，但是当时在这个方面也浪费了不少时间。BTW，Eclipse3.3+内置了一个内存查看的工具，可以在“Windows”-”Preferences”中，选择左边的”General”，然后选择右边的”Show heap status”。 参考资料： I’m getting Java.lang.OutOfMemoryError: PermGen space!?? Javarebel启动程序java.lang.OutOfMemoryError: PermGen space问题的解决 Related Posts:Java 中“Error occurred during initialization of VM”错误的解决方法由MyEclipse内存不足谈谈JVM内存Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题修改Spark的默认字体大小JPA和Hibernate注解的继承问题]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.javatang.com/wp-content/i_jrebel_logo.png" alt="" title="i_jrebel_logo" width="229" height="96" class="aligncenter size-full wp-image-533" /><br />
<a href="http://www.zeroturnaround.com/jrebel/" target="_blank">JRebel</a>是一个Java类热启动的工具，使Java开发（特别是Web开发）可以实现像PHP开发那样即时刷新的效果，这样再也不用修改java文件之后频繁的去重启Web Server了，用起来非常的顺手。</p>
<p>最近JRebel好像更新也非常频繁，8月份刚发布3.0版本，11月份就发布了3.5版本，而且这个新版本用下来非常给力，针对了spring增加了许多扩展（默认是打开的），比如可以实时更新所有Spring的配置文件等等，手痒痒的同学可以下载下来试试。BTW，我用的是正式版，:)</p>
<p>安装的方法也非常简单，就在vm后面增加一个-noverify 参数：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">-noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar</li></ol></div>
<p>当然还是记得将上面的路径修改成你自己本机JRebl的存放路径。</p>
<p>上面的都不是本文的重点，这里需要说一下的就是，或许3.5版本增加的功能特性太多的缘故（特别是针对Spring），刚开始启动的时候速度非常的慢，开始的时候我怀疑是spring插件的问题，于是使用 -Djrebel.spring_plugin=false将spring插件关闭了，之后启动的速度可以接受了，但是运行程序的时候速度非常非常的慢，点一个按钮要等半天。如果不使用JRebel的话程序运行正常，所以排除了程序本身的问题。</p>
<p>刚开始一直在怀疑是不是新版本的问题，因为用2.x和3.0的时候都很正常，所以在这方面查了很多资料，都没有发现好的解决办法。后来，无意中发现程序出现了“java.lang.OutOfMemoryError: PermGen space”的错误，突然才想到是否是给JRebel分配的内存太小了，于是使用下面的参数增加了内存：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">-noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar -Xmx512M -Xms512M -XX:MaxPermSize=1024m</li></ol></div>
<p>然后在运行的时候发现速度是非一般的快啊，使用JRebel的spring插件之后启动速度也非常的块了，看来就是这个问题，后来在JRebel官方上的Q&#038;A上面也得到了印证。</p>
<p>需要说明一点的是，如果上面的参数无法启动，需要将内存数设置小一些；还有，增加Eclipse的内存对JRebl是没有任何效果的，虽然现在想起来和可笑，但是当时在这个方面也浪费了不少时间。BTW，Eclipse3.3+内置了一个内存查看的工具，可以在“Windows”-”Preferences”中，选择左边的”General”，然后选择右边的”Show heap status”。</p>
<p>参考资料：<br />
<a href="http://www.zeroturnaround.com/jrebel/faq/#Im_getting_Java.lang.OutOfMemoryError:" target="_blank">I’m getting Java.lang.OutOfMemoryError: PermGen space!??</a><br />
<a href="http://lonelythinker.javaeye.com/blog/480131" target="_blank">Javarebel启动程序java.lang.OutOfMemoryError: PermGen space问题的解决</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2006/08/11/170654.html" rel="bookmark" class="crp_title">Java 中“Error occurred during initialization of VM”错误的解决方法</a></li><li><a href="http://www.javatang.com/archives/2007/12/03/1653250.html" rel="bookmark" class="crp_title">由MyEclipse内存不足谈谈JVM内存</a></li><li><a href="http://www.javatang.com/archives/2010/11/27/1657519.html" rel="bookmark" class="crp_title">Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题</a></li><li><a href="http://www.javatang.com/archives/2008/07/13/5634273.html" rel="bookmark" class="crp_title">修改Spark的默认字体大小</a></li><li><a href="http://www.javatang.com/archives/2008/06/19/0308269.html" rel="bookmark" class="crp_title">JPA和Hibernate注解的继承问题</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/29/3337530.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题</title>
		<link>http://www.javatang.com/archives/2010/11/27/1657519.html</link>
		<comments>http://www.javatang.com/archives/2010/11/27/1657519.html#comments</comments>
		<pubDate>Sat, 27 Nov 2010 04:16:57 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[OS]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=519</guid>
		<description><![CDATA[Macbuntu是一个可以将Ubuntu修改为Mac风格的集合包，使用shell指令进行安装，其模拟到效果非常逼真和实用，效果图如上，官方网站为：http://sourceforge.net/projects/macbuntu/。 首先介绍一下安装步骤： 1. 在Macbuntu官方网站http://sourceforge.net/projects/macbuntu/上下载最新到集成包文件，目前到版本为10.10，即支持Ubuntu10.10版本，下载下来到文件为Macbuntu-10.10.tar.gz。 2. 定位到上述文件到目录，然后输入下面命令进行安装： tar zxvf Macbuntu-10.10.tar.gz sudo ./Macbuntu-10.10/install.sh 接下来就按照提示进行选择安装即可，全程都是自动的，安装完成之后需要重启。 上面是安装到步骤，下面再说几个安装之后遇到问题到程序： OpenOffice 安装Macbuntu之后发现OpenOffice打开之后，菜单和对话框中到文字都不能正常显示，如下图所示 解决的方法是：在“系统”-“首选项”-“外观”，选择“字体”标签，然后将“应用程序字体”设置为“文泉驿等宽微米黑“。 Eclipse 因为Mac中是将每个应用程序到菜单都集成到最上面到菜单栏中到，但是对于有些应用程序来说，Macbuntu没有很好的进行处理，其中Eclipse就是一个例子。这个时候打开Eclipse之后发现菜单项不见来，而最上面到菜单栏中只有一个File-Exit项。解决的方式就是创建一个shell脚本，命名为eclipse.sh，内容如下： #!/bin/bash export UBUNTU_MENUPROXY=0 PATH=/usr/lib/java/jdk1.6.0_22/bin:/usr/lib/java/jdk1.6.0_22/jre/bin ~/Development/eclipse-java-helios-SR1-linux-gtk/eclipse/eclipse 记住将中间到java和eclipse路径修改为你自己到路径，然后再执行下面到命令： chmod u+x eclipse.sh sudo ./eclipse.sh 这个时候你会发现Eclipse到菜单栏又出现了，你可以将这个eclipse.sh文件放在桌面上，然后直接双击选择“运行”即可。 参考资料： Macbuntu:把 Ubuntu 一键打造成完整的 Mac 风格 求教：openoffice菜单不能显示汉字 Eclipse menubar not appearing in Ubuntu 10.10 Related Posts:查找接口实现类的Eclipse插件在Eclipse WTP中加入Resin server adapterm2eclipse插件使用中提示jar包找不到的解决方法客户真正的需求原来是这样的由MyEclipse内存不足谈谈JVM内存]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.javatang.com/wp-content/zrtn_001n4277513e_tn.jpg" alt="" title="zrtn_001n4277513e_tn" width="500" height="312" class="aligncenter size-full wp-image-520" /></p>
<p><a href="http://sourceforge.net/projects/macbuntu/" target="_blank">Macbuntu</a>是一个可以将Ubuntu修改为Mac风格的集合包，使用shell指令进行安装，其模拟到效果非常逼真和实用，效果图如上，官方网站为：<a href="http://sourceforge.net/projects/macbuntu/" target="_blank">http://sourceforge.net/projects/macbuntu/</a>。</p>
<p>首先介绍一下安装步骤：<br />
1. 在Macbuntu官方网站<a href="http://sourceforge.net/projects/macbuntu/" target="_blank">http://sourceforge.net/projects/macbuntu/</a>上下载最新到集成包文件，目前到版本为10.10，即支持Ubuntu10.10版本，下载下来到文件为Macbuntu-10.10.tar.gz。<br />
2. 定位到上述文件到目录，然后输入下面命令进行安装：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">tar zxvf Macbuntu-10.10.tar.gz</li>
<li>sudo ./Macbuntu-10.10/install.sh</li></ol></div>
<p>接下来就按照提示进行选择安装即可，全程都是自动的，安装完成之后需要重启。</p>
<p>上面是安装到步骤，下面再说几个安装之后遇到问题到程序：<br />
<strong>OpenOffice</strong></p>
<p>安装Macbuntu之后发现OpenOffice打开之后，菜单和对话框中到文字都不能正常显示，如下图所示<br />
<a href="http://www.javatang.com/wp-content/Screenshot.jpeg" target="_blank"><img src="http://www.javatang.com/wp-content/Screenshot.jpeg" alt="" title="Screenshot" width="640" height="400" class="aligncenter size-full wp-image-524" /></a></p>
<p>解决的方法是：在“系统”-“首选项”-“外观”，选择“字体”标签，然后将“应用程序字体”设置为“文泉驿等宽微米黑“。</p>
<p><strong>Eclipse</strong><br />
因为Mac中是将每个应用程序到菜单都集成到最上面到菜单栏中到，但是对于有些应用程序来说，Macbuntu没有很好的进行处理，其中Eclipse就是一个例子。这个时候打开Eclipse之后发现菜单项不见来，而最上面到菜单栏中只有一个File-Exit项。解决的方式就是创建一个shell脚本，命名为eclipse.sh，内容如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">#!/bin/bash</li>
<li>export UBUNTU_MENUPROXY=0</li>
<li>PATH=/usr/lib/java/jdk1.6.0_22/bin:/usr/lib/java/jdk1.6.0_22/jre/bin</li>
<li>~/Development/eclipse-java-helios-SR1-linux-gtk/eclipse/eclipse</li></ol></div>
<p>记住将中间到java和eclipse路径修改为你自己到路径，然后再执行下面到命令：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">chmod u+x eclipse.sh</li>
<li>sudo ./eclipse.sh</li></ol></div>
<p>这个时候你会发现Eclipse到菜单栏又出现了，你可以将这个eclipse.sh文件放在桌面上，然后直接双击选择“运行”即可。</p>
<p>参考资料：<br />
<a href="http://wowubuntu.com/macubuntu.html" target="_blank">Macbuntu:把 Ubuntu 一键打造成完整的 Mac 风格</a><br />
<a href="http://forum.ubuntu.org.cn/viewtopic.php?f=48&#038;t=299379&#038;start=0" target="_blank">求教：openoffice菜单不能显示汉字</a><br />
<a href="http://gnome-look.org/content/show.php?action=knowledgebase&#038;content=129021&#038;kbid=496" target="_blank">Eclipse menubar not appearing in Ubuntu 10.10</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2007/07/04/4045184.html" rel="bookmark" class="crp_title">查找接口实现类的Eclipse插件</a></li><li><a href="http://www.javatang.com/archives/2009/12/30/0134324.html" rel="bookmark" class="crp_title">在Eclipse WTP中加入Resin server adapter</a></li><li><a href="http://www.javatang.com/archives/2010/01/31/3312389.html" rel="bookmark" class="crp_title">m2eclipse插件使用中提示jar包找不到的解决方法</a></li><li><a href="http://www.javatang.com/archives/2010/07/07/2157401.html" rel="bookmark" class="crp_title">客户真正的需求原来是这样的</a></li><li><a href="http://www.javatang.com/archives/2007/12/03/1653250.html" rel="bookmark" class="crp_title">由MyEclipse内存不足谈谈JVM内存</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/27/1657519.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spring MVC中修改校验的异常信息</title>
		<link>http://www.javatang.com/archives/2010/11/23/5817513.html</link>
		<comments>http://www.javatang.com/archives/2010/11/23/5817513.html#comments</comments>
		<pubDate>Tue, 23 Nov 2010 08:58:17 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[JavaPlateform]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=513</guid>
		<description><![CDATA[使用一个例子来说明一下，Spring使用的是3.0.x： public class Account { &#160; &#160; @Pattern(regexp = &#34;[a-z0-9]{3,50}&#34;) &#160; &#160; private&#160;String name; &#160; &#160; &#160; @NotNull &#160; &#160; @NumberFormat(style=Style.CURRENCY) &#160; &#160; private&#160;BigDecimal balance = new BigDecimal(&#34;1000&#34;); &#160; &#160; &#160; @DateTimeFormat(style=&#34;S-&#34;) &#160; &#160; @Future &#160; &#160; private&#160;Date renewalDate = new Date(new Date().getTime() + 31536000000L); &#160; &#160; &#160; // 省略 getter &#38; setter... } 接下来使用注解创建一个Controller： [...]]]></description>
			<content:encoded><![CDATA[<p>使用一个例子来说明一下，Spring使用的是3.0.x：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">Account</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">Pattern</span><span style="color: Olive;">(</span><span style="color: Blue;">regexp</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">[a-z0-9]{3,50}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">String</span><span style="color: Gray;"> </span><span style="color: Blue;">name</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">NotNull</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">NumberFormat</span><span style="color: Olive;">(</span><span style="color: Blue;">style</span><span style="color: Gray;">=</span><span style="color: Blue;">Style</span><span style="color: Gray;">.</span><span style="color: Blue;">CURRENCY</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">BigDecimal</span><span style="color: Gray;"> </span><span style="color: Blue;">balance</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">BigDecimal</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1000</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">DateTimeFormat</span><span style="color: Olive;">(</span><span style="color: Blue;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">S-</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">Future</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">private</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Date</span><span style="color: Gray;"> </span><span style="color: Blue;">renewalDate</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Date</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Date</span><span style="color: Olive;">()</span><span style="color: Gray;">.</span><span style="color: Blue;">getTime</span><span style="color: Olive;">()</span><span style="color: Gray;"> + </span><span style="color: Maroon;">31536000000</span><span style="color: Blue;">L</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// 省略 getter &amp; setter...</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>接下来使用注解创建一个Controller：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">@</span><span style="color: Blue;">Controller</span></li>
<li><span style="color: Gray;">@</span><span style="color: Blue;">RequestMapping</span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/account</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">AccountController</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/**</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * 如果view采用JSP的话&lt;code&gt;@ModelAttribute&lt;/code&gt;注解可以省略，但是如果是使用Velocity或FreeMarker</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * 的话必须要加上，而且&lt;code&gt;@Valid&lt;/code&gt;注解和后面的BindingResult类型的参数之间不能有其他参数。</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; @</span><span style="color: Blue;">RequestMapping</span><span style="color: Olive;">(</span><span style="color: Blue;">method</span><span style="color: Gray;">=</span><span style="color: Blue;">RequestMethod</span><span style="color: Gray;">.</span><span style="color: Blue;">POST</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">String</span><span style="color: Gray;"> </span><span style="color: Blue;">create</span><span style="color: Olive;">(</span><span style="color: Gray;">@</span><span style="color: Blue;">Valid</span><span style="color: Gray;"> @</span><span style="color: Blue;">ModelAttribute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">account</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">Account</span><span style="color: Gray;"> </span><span style="color: Blue;">account</span><span style="color: Gray;">, </span><span style="color: Blue;">BindingResult</span><span style="color: Gray;"> </span><span style="color: Blue;">result</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">result</span><span style="color: Gray;">.</span><span style="color: Blue;">hasErrors</span><span style="color: Olive;">())</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">account/createForm</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// ...</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">redirect:/account/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">account</span><span style="color: Gray;">.</span><span style="color: Blue;">getId</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>另外还有一个view文件、配置文件等等，具体的可以查看<a href="https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/" target="_blank">Spring MVC Basic Sample</a>。</p>
<p>OK，接下来说重点。我参考上面的Spring MVC Basic Sample中的做法也做了一个类似的表单，在表单中的balance中输入非数字的时候旁边的错误信息会出现下面的异常信息：</p>
<blockquote><p>
Failed to convert property value of type java.lang.String to required type java.math.BigDecimal for property balance; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value “eff” from type java.lang.String to type java.math.BigDecimal; nested exception is java.lang.IllegalArgumentException: Unable to parse eff
</p></blockquote>
<p>这个就很郁闷了，明显是格式转换出错，但是列出来一堆的异常信息，对用户来说非常不友好。于是开始在Google中搜索也没有找到比较好的说法，后来运行了Spring MVC Basic Sample，不显示上面的异常信息，而只是显示一句话：”could not be parsed“，这个效果正是我们所期待的。于是我将例子中的所有spring配置文件、Bean信息、Controller都做了对比，甚至JSP模板都一样，但是一到我自己的项目中就会出现那个异常，当时非常郁闷。</p>
<p>后来无意中在Google中查到到了参考资料中的一篇帖子，里面提到只要在messages.properties文件中设置typeMismatch属性就可以了，于是我猛然想到Spring MVC Basic Sample中也有个messages.properties文件，打开之后赫然看到果然有一条typeMismatch属性：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">typeMismatch=could not be parsed</li></ol></div>
<p>原来是在这里设置的，真的很郁闷。还好，参考资料中的帖子中还提到可以设置具体的类型，比如可以这样设置：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline">## 全局的配置信息</li>
<li>typeMismatch=输入的数据格式不正确</li>
<li>## 针对BigDecimal类型的错误信息</li>
<li>typeMismatch.java.math.BigDecimal=请输入数字</li>
<li>## 针对Date类型的错误信息</li>
<li>typeMismatch.java.util.Date=请在{0}中输入正确的日期</li></ol></div>
<p>参考资料：<br />
<a href="http://www.velocityreviews.com/forums/t302365-spring-mvc-data-binding-and-user-friendly-error-messages.html" target="_blank">Spring MVC Data Binding and user-friendly error messages</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2007/03/13/5026128.html" rel="bookmark" class="crp_title">按照指定的类型排序</a></li><li><a href="http://www.javatang.com/archives/2010/08/09/3212438.html" rel="bookmark" class="crp_title">SimpleJdbcInsert使用executeAndReturnKeyHolder方法返回主键时需要注意的一个地方</a></li><li><a href="http://www.javatang.com/archives/2008/07/07/5648271.html" rel="bookmark" class="crp_title">如何使用DWR2.0的注解功能</a></li><li><a href="http://www.javatang.com/archives/2008/06/19/0308269.html" rel="bookmark" class="crp_title">JPA和Hibernate注解的继承问题</a></li><li><a href="http://www.javatang.com/archives/2007/03/05/5722110.html" rel="bookmark" class="crp_title">Java中文排序</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/23/5817513.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resin中对日志输出的配置</title>
		<link>http://www.javatang.com/archives/2010/11/14/1752494.html</link>
		<comments>http://www.javatang.com/archives/2010/11/14/1752494.html#comments</comments>
		<pubDate>Sun, 14 Nov 2010 06:17:52 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[JavaPlateform]]></category>
		<category><![CDATA[Web&Server]]></category>
		<category><![CDATA[resin]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=494</guid>
		<description><![CDATA[Resin中对日志的设置主要有如下参数：log、logger、access-log、stdout-log和stderr-log。前两个放在&#60;resin&#62;标签，也就是主标签下面，其中log主要用于配置JDK logging API，logger用于指定需要log的包及level，跟log4j中的用法相似，只不过resin中level有个特殊的选项就是off，用于关闭日志输出；而后面三个*-log放在&#60;host&#62;或&#60;host-default&#62;下面，access用于HTTP输出，stdout用于标准输出(System.out)，stderr用于错误输出(System.err，对应log4j中的log.error)。 三个*-log中间的属性是相同的，所以我们集中来说明一下： path: 用于设定日志文件的路径，非常有意思的是它支持所谓的El Variables and Functions，也就是resin中的变量，比如${host.name}就是虚拟站点的id名称，所以如果将它放在&#60;host-default&#62;下面的话，将path设置为 logs/${host.name}/access.log的话可以将不同站点的日志存放在不同的目录下面。 archive-format: 这个参数可以设置日志归档的格式，如设置为access-%Y%m%d.log可以在归档的时候自动按日期进行归档命名。另外还有一个特性需要说明的是，resin竟然支持自动压缩log文件，而且设置的方法非常简单，只要后缀名是gz就可以了，如access-%Y%m%d.log.gz，这样归档的时候会自动压缩，而且支持windows和linux系统。 format: 用于设置每条日志输出的格式，这个非常简单，而且通常使用系统内置的格式就可以了。 rollover-size: 用来设置归档日志文件的最小尺寸，单位可以设置成kb、mb等等，默认为1mb。 rollover-period: 用来设置归档日志文件的周期，单位可以是1D（一天）、1W(一周)、1M（一个月）等。 最后给出一个范例供大家参考： &#60;!-- &#160;&#160; - Resin 3.1 configuration file. &#160; --&#62; &#60;resin&#160;xmlns=&#34;http://caucho.com/ns/resin&#34; &#160; &#160; &#160;&#160; xmlns:resin=&#34;http://caucho.com/ns/resin/core&#34;&#62; &#160; &#60;!-- &#160; &#160;&#160; - Logging configuration for the JDK logging API. &#160; &#160; --&#62; &#160; &#60;log&#160;name=&#34;&#34; level=&#34;off&#34; path=&#34;stdout:&#34; &#160; &#160; &#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Resin中对日志的设置主要有如下参数：log、logger、access-log、stdout-log和stderr-log。前两个放在&lt;resin&gt;标签，也就是主标签下面，其中log主要用于配置JDK logging API，logger用于指定需要log的包及level，跟log4j中的用法相似，只不过resin中level有个特殊的选项就是off，用于关闭日志输出；而后面三个*-log放在&lt;host&gt;或&lt;host-default&gt;下面，access用于HTTP输出，stdout用于标准输出(System.out)，stderr用于错误输出(System.err，对应log4j中的log.error)。</p>
<p>三个*-log中间的属性是相同的，所以我们集中来说明一下：</p>
<blockquote>
<li><b>path:</b> 用于设定日志文件的路径，非常有意思的是它支持所谓的<a href="http://caucho.com/resin-3.1/doc/el-var.xtp" target="_blank">El Variables and Functions</a>，也就是resin中的变量，比如${host.name}就是虚拟站点的id名称，所以如果将它放在&lt;host-default&gt;下面的话，将path设置为 logs/${host.name}/access.log的话可以将不同站点的日志存放在不同的目录下面。</li>
<li><b>archive-format:</b> 这个参数可以设置日志归档的格式，如设置为access-%Y%m%d.log可以在归档的时候自动按日期进行归档命名。另外还有一个特性需要说明的是，resin竟然支持自动压缩log文件，而且设置的方法非常简单，只要后缀名是gz就可以了，如access-%Y%m%d.log.gz，这样归档的时候会自动压缩，而且支持windows和linux系统。</li>
<li><b>format:</b> 用于设置每条日志输出的格式，这个非常简单，而且通常使用系统内置的格式就可以了。</li>
<li><b>rollover-size:</b> 用来设置归档日志文件的最小尺寸，单位可以设置成kb、mb等等，默认为1mb。</li>
<li><b>rollover-period:</b> 用来设置归档日志文件的周期，单位可以是1D（一天）、1W(一周)、1M（一个月）等。</li>
</blockquote>
<p>最后给出一个范例供大家参考：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">&lt;!--</span></li>
<li><span style="color: #ffa500;">&nbsp;&nbsp; - Resin 3.1 configuration file.</span></li>
<li><span style="color: #ffa500;">&nbsp; --&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">resin</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">xmlns</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://caucho.com/ns/resin</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #00008b;">xmlns:resin</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://caucho.com/ns/resin/core</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #ffa500;">&lt;!--</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; - Logging configuration for the JDK logging API.</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; --&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">log</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">level</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">off</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stdout:</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #00008b;">timestamp</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">[%H:%M:%S.%s] {%{thread}} </span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: #ffa500;">&lt;!--</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; - 'info' for production</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; - 'fine' or 'finer' for development and troubleshooting</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; --&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">logger</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">com.caucho</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">level</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">info</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">logger</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">com.caucho.java</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">level</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">config</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">logger</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">com.caucho.loader</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">level</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">config</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">host-default</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; - With another web server, like Apache, this can be commented out</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; - because the web server will log this information.</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; --&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">access-log</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">logs/${host.name}/access.log</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">archive-format</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">access-%Y%m%d.log.gz</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">format</span><span style="color: Gray;">='%</span><span style="color: #00008b;">h</span><span style="color: Gray;"> %</span><span style="color: #00008b;">l</span><span style="color: Gray;"> %</span><span style="color: #00008b;">u</span><span style="color: Gray;"> %</span><span style="color: #00008b;">t</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%r</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> %</span><span style="color: #00008b;">s</span><span style="color: Gray;"> %</span><span style="color: #00008b;">b</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%{Referer}i</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%{User-Agent}i</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">rollover-size</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">10mb</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">rollover-period</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1D</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; - stdout log and stderr log</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; --&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">stdout-log</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">logs/${host.name}/stdout.log</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">archive-format</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stdout-%Y%m%d.log.gz</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">timestamp</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">[%Y.%m.%d %H:%M:%S.%s]</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">rollover-size</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">10mb</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">rollover-period</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1D</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">stderr-log</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">logs/${host.name}/stderr.log</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">archive-format</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stderr-%Y%m%d.log.gz</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">timestamp</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">[%Y.%m.%d %H:%M:%S.%s]</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">rollover-size</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">10mb</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">rollover-period</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1D</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">host-default</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">resin</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>最后还有一个事情需要说明一下，如果在windows系统下<a href="http://www.javatang.com/archives/2007/06/20/1513177.html">将resin注册成服务程序</a>之后就会在log目录下产生jvm-defautl.log文件，而且这个文件会一直累加，所以会变的文件非常大而影响resin的性能。原来在<a href="http://www.javatang.com/archives/2007/06/20/1513177.html">Apache和Resin产生大容量日志的解决办法</a>这篇文件中提到的使用httpd -jvm-log NUL的方法在3.1中无法使用，而且查找了大量的文档也没有找到合适的方法，后来索性将log目录中的写入权限去掉了，重启resin也没有任何影响，算是解决了这个问题。</p>
<p>参考资料：</p>
<p>http://caucho.com/resin-3.1/doc/config-log.xtp</p>
<p>http://caucho.com/resin-3.1/doc/el-var.xtp#host</p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2008/03/18/2532264.html" rel="bookmark" class="crp_title">Apache+Resin泛域名的设置</a></li><li><a href="http://www.javatang.com/archives/2007/06/20/1513177.html" rel="bookmark" class="crp_title">Apache和Resin产生大容量日志的解决办法</a></li><li><a href="http://www.javatang.com/archives/2010/08/27/3629451.html" rel="bookmark" class="crp_title">Apache和Resin组合时UrlRewriteFilter失效的解决方法</a></li><li><a href="http://www.javatang.com/archives/2010/11/13/1228487.html" rel="bookmark" class="crp_title">Apache和Resin组合时间歇性出现503错误的解决方法</a></li><li><a href="http://www.javatang.com/archives/2008/10/18/1942276.html" rel="bookmark" class="crp_title">Apache+Resin下如何写伪静态和301跳转</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/14/1752494.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache和Resin组合时间歇性出现503错误的解决方法</title>
		<link>http://www.javatang.com/archives/2010/11/13/1228487.html</link>
		<comments>http://www.javatang.com/archives/2010/11/13/1228487.html#comments</comments>
		<pubDate>Sat, 13 Nov 2010 09:12:28 +0000</pubDate>
		<dc:creator>Jet</dc:creator>
				<category><![CDATA[JavaPlateform]]></category>
		<category><![CDATA[Web&Server]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[resin]]></category>

		<guid isPermaLink="false">http://www.javatang.com/?p=487</guid>
		<description><![CDATA[使用Apache和Resin进行组合时，如果Resin关闭或中断的时会出现如下的HTTP 503错误： Service Temporarily Unavailable The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. 造成这个错误的原因是因为Resin无法启动，可以单独访问resin（如8080端口）查看具体的错误。 我这里要说的是，在Resin和Apache都非常非常正常的情况下，间歇性的出现上述错误，也就是说不是一直有，而是偶尔出现这个错误，刷新下页面就好了。这个问题非常郁闷，后来在resin的bug报告中（见参考资料）竟然发现了解决的办法： The important configuration are load-balance-socket-timeout, socket-timeout, load-balance-idle-time and keepalive-timeout. The two load-balance-* configure mod_caucho. socket-timeout and keepalive-timeout configure the Resin side. load-balance-socket-timeout needs to be large enough to [...]]]></description>
			<content:encoded><![CDATA[<p>使用Apache和Resin进行组合时，如果Resin关闭或中断的时会出现如下的HTTP 503错误：</p>
<blockquote><p>
Service Temporarily Unavailable<br />
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
</p></blockquote>
<p>造成这个错误的原因是因为Resin无法启动，可以单独访问resin（如8080端口）查看具体的错误。</p>
<p>我这里要说的是，在Resin和Apache都非常非常正常的情况下，<strong>间歇性</strong>的出现上述错误，也就是说不是一直有，而是偶尔出现这个错误，刷新下页面就好了。这个问题非常郁闷，后来在resin的bug报告中（见参考资料）竟然发现了解决的办法：</p>
<blockquote><p>
The important configuration are load-balance-socket-timeout, socket-timeout, load-balance-idle-time and keepalive-timeout. The two load-balance-* configure mod_caucho. socket-timeout and keepalive-timeout configure the Resin side.</p>
<p>load-balance-socket-timeout needs to be large enough to handle any server-side processing delays before the first data.</p>
<p>socket-timeout and keepalive-timeout need to be larger than load-balance-idle-time because they need to keep the connection open for a keepalive request. </p>
<p>For a diagram, see</p>
<p>http://caucho.com/resin/admin/load-balancing.xtp</p>
</blockquote>
<p>也就是说，Resin在同Apache进行组合通讯的时候主要依靠四个参数：load-balance-socket-timeout, socket-timeout, load-balance-idle-time 和 keepalive-timeout，其中两个load-balance-*参数用来设置mod_caucho（就是与Apache组合的so文件），socket-timeout和keepalive-timeout用来设置Resin。至于参数数值的大小顺序依此是：load-balance-socket-timeout &gt; socket-timeout 和 keepalive-timeout &gt; load-balance-idle-time。上述四个参数的官方说明地址为：<a href="http://caucho.com/resin-3.1/doc/server-tags.xtp" target="_blank">http://caucho.com/resin-3.1/doc/server-tags.xtp</a></p>
<p>那为什么会间歇性出现503错误呢？这个是因为resin默认的socket-timeout为65s，时间太短了，有些比较大的请求在这个时间之内还没有进行完。综合上面所说，参考的配置如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">resin</span><span style="color: Gray;"> ...</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">cluster</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">app-tier</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">server-default</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">socket-timeout</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">180s</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">socket-timeout</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">keepalive-max</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">3000</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">keepalive-max</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">keepalive-timeout</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">180s</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">keepalive-timeout</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">load-balance-idle-time</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">120s</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">load-balance-idle-time</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">server-default</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">cluster</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">resin</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>从此，这个世界清净了。</p>
<p>参考资料：<br />
<a href="http://bugs.caucho.com/view.php?id=2715" target="_blank">Apache 2.2.x + Resin 3.1.x: frequent 503 status error messages (Service Temporarily Unavailable)</a><br />
<a href="http://bugs.caucho.com/view.php?id=2862" target="_blank">0002862: Apache + Resin and 503 HTTP Error</a><br />
<a href="http://aiter.javaeye.com/blog/391456" target="_blank">resin apache问题</a></p>
<div id="crp_related"><h2>Related Posts:</h2><ul><li><a href="http://www.javatang.com/archives/2011/10/18/1847563.html" rel="bookmark" class="crp_title">Ext中设置Ajax超时时间</a></li><li><a href="http://www.javatang.com/archives/2007/07/04/1548182.html" rel="bookmark" class="crp_title">PHP中出现“Unable to load dynamic library”问题的解决方法</a></li><li><a href="http://www.javatang.com/archives/2010/11/14/1752494.html" rel="bookmark" class="crp_title">Resin中对日志输出的配置</a></li><li><a href="http://www.javatang.com/archives/2008/10/18/1942276.html" rel="bookmark" class="crp_title">Apache+Resin下如何写伪静态和301跳转</a></li><li><a href="http://www.javatang.com/archives/2007/11/02/0146237.html" rel="bookmark" class="crp_title">“终端服务超出最大允许连接数”问题产生原因及解决方法</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.javatang.com/archives/2010/11/13/1228487.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.javatang.com @ 2012-02-06 01:36:18 -->
