﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-志当存高远,功到自然成!-随笔分类-应用服务器调优与管理</title><link>http://www.blogjava.net/shanben/category/32658.html</link><description>少年强则中国强,少年进步则中国进步!</description><language>zh-cn</language><lastBuildDate>Thu, 12 Aug 2010 08:02:21 GMT</lastBuildDate><pubDate>Thu, 12 Aug 2010 08:02:21 GMT</pubDate><ttl>60</ttl><item><title>TOMCAT崩溃事件</title><link>http://www.blogjava.net/shanben/archive/2010/08/11/328532.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Wed, 11 Aug 2010 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2010/08/11/328532.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/328532.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2010/08/11/328532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/328532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/328532.html</trackback:ping><description><![CDATA[<p>TOMCAT崩溃事件</p>
<p><a href="../../tedeyang/archive/2008/06/04/205740.html" target="_blank">http://www.blogjava.net/tedeyang/archive/2008/06/04/205740.html</a></p>
<p><span style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"><span style="font-size: 13px; color: #5e5e5e; line-height: 18px; font-family: Verdana,Helvetica,Arial; text-align: justify;">今天一大早产品一部项目经理就来找我，他们的一台服务器昨天晚上tomcat服务崩溃，还不能重启服务，最后将服务器重启才OK。<br />
我将事件过程和分析过程记录如下：<br />
<br />
服务器：win 2000 sp4，apache 2 + tomcat 5.0 采用mod_jk级联。内存2G，硬盘剩余空间充足，CPU基本空闲。<br />
主要应用：J2EE 1.4，JDBC（连接另一台mysql服务器）<br />
崩溃时间： 2008-6-3 18：37：50<br />
<br />
</span></span></p>
<h3 style="font-size: 14px; margin: 5px 0px; color: #ff6600;"><font color="#000000"><strong>一.</strong>各种日志综合如下：</font></h3>
<p>&nbsp;&nbsp;&nbsp;<strong>1.</strong>37分45秒，操作系统事件中诺顿杀毒软件报内存过低警报<br />
&nbsp;&nbsp;&nbsp;<strong>2.</strong>37分45秒，web应用抛出JDBC连接异常： </p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 1383px; background-color: #eeeeee;"><span style="font-weight: bold; color: #800000;">2008</span><span style="color: #808080;">-</span><span style="font-weight: bold; color: #800000;">06</span><span style="color: #808080;">-</span><span style="font-weight: bold; color: #800000;">03</span>&nbsp;<span style="font-weight: bold; color: #800000;">18</span><span style="color: #000000;">:</span><span style="font-weight: bold; color: #800000;">37</span><span style="color: #000000;">:</span><span style="font-weight: bold; color: #800000;">45</span><span style="color: #000000;">&nbsp;cn.</span><span style="color: #808080;">*</span><span style="color: #000000;">.db.DBManager.getConnection(DBManager.java:</span><span style="font-weight: bold; color: #800000;">157</span><span style="color: #000000;">)&nbsp;ERROR&nbsp;swim.db.DBManager&nbsp;&nbsp;&nbsp;com.mysql.jdbc.CommunicationsException:&nbsp;Communications&nbsp;link&nbsp;failure&nbsp;due&nbsp;</span><span style="color: #0000ff;">to</span><span style="color: #000000;">&nbsp;underlying&nbsp;exception:<br />
</span><span style="color: #808080;">**</span>&nbsp;<span style="color: #0000ff;">BEGIN</span><span style="color: #000000;">&nbsp;NESTED&nbsp;EXCEPTION&nbsp;</span><span style="color: #808080;">**</span><span style="color: #000000;"><br />
java.net.SocketException<br />
MESSAGE:&nbsp;java.net.SocketException:&nbsp;No&nbsp;buffer&nbsp;</span><span style="color: #ff00ff;">space</span><span style="color: #000000;">&nbsp;available&nbsp;(maximum&nbsp;connections&nbsp;reached?):&nbsp;JVM_Bind</span></div>
<p><br />
&nbsp;&nbsp;&nbsp;<strong>3.</strong>37分50秒，tomcat抛出session无法save异常： </p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 1383px; background-color: #eeeeee;"><span style="color: #000000;">2008</span><span style="color: #000000;">-</span><span style="color: #000000;">06</span><span style="color: #000000;">-</span><span style="color: #000000;">03</span>&nbsp;<span style="color: #000000;">18</span><span style="color: #000000;">:</span><span style="color: #000000;">37</span><span style="color: #000000;">:</span><span style="color: #000000;">50</span><span style="color: #000000;">&nbsp;ERROR</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;IOException&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;saving&nbsp;persisted&nbsp;sessions:&nbsp;java.io.FileNotFoundException:&nbsp;"izzs"SESSIONS.ser&nbsp;(系统资源不足，无法完成请求的服务。)<br />
java.io.FileNotFoundException:&nbsp;"izzs"SESSIONS.ser&nbsp;(系统资源不足，无法完成请求的服务。)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.io.FileOutputStream.open(Native&nbsp;Method)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.io.FileOutputStream.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(FileOutputStream.java:</span><span style="color: #000000;">179</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.io.FileOutputStream.</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(FileOutputStream.java:</span><span style="color: #000000;">70</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:</span><span style="color: #000000;">511</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.session.StandardManager.unload(StandardManager.java:</span><span style="color: #000000;">485</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.session.StandardManager.stop(StandardManager.java:</span><span style="color: #000000;">687</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.StandardContext.stop(StandardContext.java:</span><span style="color: #000000;">4496</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.StandardContext.reload(StandardContext.java:</span><span style="color: #000000;">3037</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:</span><span style="color: #000000;">4658</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:</span><span style="color: #000000;">1619</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:</span><span style="color: #000000;">1628</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:</span><span style="color: #000000;">1628</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:</span><span style="color: #000000;">1608</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.Thread.run(Thread.java:</span><span style="color: #000000;">534</span><span style="color: #000000;">)</span></div>
<p><br />
&nbsp;</p>
<h3 style="font-size: 14px; margin: 5px 0px; color: #ff6600;">二.简单分析</h3>
<p>崩溃原因：内存不足导致资源不足，引起Tomcat的session崩溃。<br />
&nbsp; 这台服务器上运行着很多应用，是什么原因引起内存不足还无法确定。<br />
初步判断罪魁祸首可能是apache，该进程平常占用500MB内存，经常会飚到1G以上。<br />
<br />
Apache2的配置文件中：<strong>KeepAlive=On，MaxKeepAliveRequests=100，KeepAliveTimeout=15</strong>，分析aceess.log文件可以发现每个页面触发的request数量在10个以下，点击率较低，可能使连接过多。<br />
我建议将keepAlive设为off，增加CPU负载，降低内存消耗。<br />
<br />
</p>
<h3 style="font-size: 14px; margin: 5px 0px; color: #ff6600;">三.效果</h3>
<p>&nbsp;有待观察......<br />
<br />
参考资料：<br />
http://www.withend.com/post/78.html<br />
<br />
<strong>四.结局&nbsp;</strong><br />
时隔一天，晚上九点再次崩溃，黑暗事件重演。<br />
这一次，我才得知原来该apache还配置有其他域名，于是调出该域名下的access.log。项目经理去了机房，在轰轰地风扇声中打电话给我，让我分析分析。<br />
仔细看访问日志，发现原来有N多Connect 443连接，443是什么？是SSL端口！HTTPS！，Connect命令则显然是代理功能！<br />
而且这些connect的IP来自全球各地，加拿大、美国、澳洲、新西兰、北京、上海、英国、哪都有。<br />
看来这台服务器是被人当代理服务器用了。<br />
怪不得半夜会死机，人家西半球那时正大白天撒欢儿呢。<br />
<br />
问题就出在apache的配置上，由于应用众多，并且这台服务器还是其他几台web服务器的对外出口，因此apache中配置了反向代理，不过不小心把正向代理（mod_proxy模块的<a id="ProxyRequests" name="ProxyRequests">ProxyRequests</a><a id="proxyrequests" name="proxyrequests">指令</a>）也打开了。<br />
看看<a style="color: #8d8c8c; text-decoration: none;" href="http://doc.chinahtml.com/Manual/ApacheManual/mod/mod_proxy.html" target="_blank">apache2.0的官方文档中mod_proxy部分</a>，里面明明白白写着：<br />
</p>
<div>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 1383px; background-color: #eeeeee;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">警告<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />在您没有对服务器采取安全措施之前，请不要用ProxyRequests启用您的代理。一个开放的代理服务器不仅对您的网络有威胁，对整个因特网来说也同样如此。<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span></div>
真的是很有威胁！大量代理请求急剧消耗内存，最终造成死机！<br />
<br />
解决办法就是把正向代理关掉：<font face="Courier New">ProxyRequests Off</font></div>
<img src ="http://www.blogjava.net/shanben/aggbug/328532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2010-08-11 14:25 <a href="http://www.blogjava.net/shanben/archive/2010/08/11/328532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次weblogic调优的经过</title><link>http://www.blogjava.net/shanben/archive/2008/09/04/226905.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Thu, 04 Sep 2008 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2008/09/04/226905.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/226905.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2008/09/04/226905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/226905.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/226905.html</trackback:ping><description><![CDATA[项目组反应数据库有问题，<br />
检查发现sga还用的默认参数，缓冲区命中率很低。根据系统内存调整后，好像系统正常了。数据库调整就算是结束了<br />
一天后，我再登这个数据库的时候，发现一个提示说线程已经超过限制，不允许再登录。然后我去修改了process到250，增加并发连接数。然后重启了数据库。当天没发生什么事情，第二天，发现250又被撑满了，这个时候，我就开始换衣中间件有问题，登入中间件那边看了下日志，一直报错，提示无法打开新的连接。一般来说，中间件连接数据库能开10个都算可以了。至少websphere是这样，weblogic应该差不多。然后修改了一下，调整了weblogic的连接池，修改最大连接到100.<br />
<br />
1、&nbsp; &nbsp; &nbsp; &nbsp; 报错信息<br />
<br />
&lt;2008-4-22 上午04时33分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '1' for queue: 'weblogic.kernel.Default' has been busy for "102" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
&lt;2008-4-22 上午04时33分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '7' for queue: 'weblogic.kernel.Default' has been busy for "178" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
&lt;2008-4-22 上午04时34分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '0' for queue: 'weblogic.kernel.Default' has been busy for "111" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
&lt;2008-4-22 上午04时34分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '1' for queue: 'weblogic.kernel.Default' has been busy for "162" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
&lt;2008-4-22 上午04时35分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '0' for queue: 'weblogic.kernel.Default' has been busy for "171" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
&lt;2008-4-22 上午04时35分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '12' for queue: 'weblogic.kernel.Default' has been busy for "111" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
&lt;2008-4-22 上午04时36分18秒 CST&gt; &lt;Error&gt; &lt;WebLogicServer&gt; &lt;BEA-000337&gt; &lt;ExecuteT<br />
hread: '12' for queue: 'weblogic.kernel.Default' has been busy for "171" seconds<br />
working on the request "Http Request: /guestAction.jsp", which is more than the<br />
configured time (StuckThreadMaxTime) of "60" seconds.&gt;<br />
2、&nbsp; &nbsp; &nbsp; &nbsp; 判断可能存在部分sql语句未优化，造成执行时间过长（request超时）造成挂死<br />
<br />
3、&nbsp; &nbsp; &nbsp; &nbsp; 解决<br />
开发模式和产品模式的一些参数的默认值不同，可能会对性能造成影响，下面是对性能有影响的参数列表：<br />
参数&nbsp; &nbsp; &nbsp; &nbsp; 开发模式默认值&nbsp; &nbsp; &nbsp; &nbsp; 产品模式默认值<br />
Execute Queue: Thread Count&nbsp; &nbsp; &nbsp; &nbsp; 15 threads&nbsp; &nbsp; &nbsp; &nbsp; 25 threads<br />
JDBC Connection Pool: MaxCapacity&nbsp; &nbsp; &nbsp; &nbsp; 15 connnections&nbsp; &nbsp; &nbsp; &nbsp; 25 connections<br />
通过启动管理控制台，在域（如：mydomain）&gt; 配置 &gt; 常规选择产品模式。<br />
<br />
修改了server-myserver参数中的threadcount参数，按照cpu数量，修改为100<br />
修改jdbc数据库连接池，修改为初始15，最大100。<br />
<br />
晚间进行跟踪，系统运行正常，高峰时段，尤其是早晨的高峰时段，系统没有再出现挂死的问题。<br />
早晨点击页面查询发现有时会出现页面无法访问的情况。<br />
跟踪发现weblogic最高时有100多并发，同时注意到内存占用比较高，检查发现，原来内存配置较低。<br />
<br />
检查原配置文件：<br />
:bea<br />
if "%PRODUCTION_MODE%" == "true" goto <br />
bea_prod_mode<br />
set JAVA_VM=-jrockit<br />
set MEM_ARGS=-Xms96m -Xmx256m<br />
set <br />
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none<br />
goto <br />
continue<br />
:bea_prod_mode<br />
set JAVA_VM=-jrockit<br />
set MEM_ARGS=-Xms128m <br />
-Xmx256m<br />
goto continue<br />
<br />
<br />
:sun<br />
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode<br />
set <br />
JAVA_VM=-client<br />
set MEM_ARGS=-Xms32m -Xmx200m -XX:MaxPermSize=128m<br />
set <br />
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none<br />
goto <br />
continue<br />
:sun_prod_mode<br />
set JAVA_VM=-server<br />
set MEM_ARGS=-Xms32m <br />
-Xmx200m -XX:MaxPermSize=128m<br />
goto continue<br />
<br />
很明显配置为96m，最高256m。修改后的参数：<br />
修改后结果为<br />
:bea<br />
if "%PRODUCTION_MODE%" == "true" goto <br />
bea_prod_mode<br />
set JAVA_VM=-jrockit<br />
set MEM_ARGS=-Xms256m -Xmx768m<br />
set <br />
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none<br />
goto <br />
continue<br />
:bea_prod_mode<br />
set JAVA_VM=-jrockit<br />
set MEM_ARGS=-Xms256m <br />
-Xmx768m<br />
goto continue<br />
<br />
<br />
:sun<br />
if "%PRODUCTION_MODE%" == "true" goto sun_prod_mode<br />
set <br />
JAVA_VM=-client<br />
set MEM_ARGS=-Xms256m -Xmx768m -XX:MaxPermSize=128m<br />
set <br />
JAVA_OPTIONS=%JAVA_OPTIONS% -Xverify:none<br />
goto <br />
continue<br />
:sun_prod_mode<br />
set JAVA_VM=-server<br />
set MEM_ARGS=-Xms256m <br />
-Xmx768m -XX:MaxPermSize=128m<br />
goto continue<br />
<br />
:continue<br />
<br />
<br />
最低256，最高768.查看跟踪信息比较调整前后性能：<br />
<br />
调整前内存<br />
<br />
<br />
调整后情况：<br />
<br />
<br />
现在垃圾回收不那么频繁了，整体稳定性应该有好处。再频繁打开一个页面的情况下，页面仍然能正常显示。<br />
<img src ="http://www.blogjava.net/shanben/aggbug/226905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2008-09-04 13:30 <a href="http://www.blogjava.net/shanben/archive/2008/09/04/226905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic]weblogic 8.1.4服务器挂起,出现StuckThreadMaxTime错误</title><link>http://www.blogjava.net/shanben/archive/2008/09/04/226900.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Thu, 04 Sep 2008 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2008/09/04/226900.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/226900.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2008/09/04/226900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/226900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/226900.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>前几天用spring+hibernate+struts写了个增/删/改/查的例子。调试期间问题就来了，当查询结果<font face="Arial">翻页好几次就没N久没有响应了。最后控制报错。网上查了，它说数据库连接（池）问题。</font></p>
<p>出现错误如下:</p>
<p><font face="Arial"><font face="Arial"><font face="Arial">[2007-9-30 下午12时03分03秒 CST] [Error] [WebLogicServer] [<span class="hilite1"><span class="hilite1">BEA-000337</span></span>] [ExecuteThread: '13' for queue: 'weblogic.kernel.Default' has been busy for "901" seconds working on the request "Http Request: /admin/school.do", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.]</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">&lt;转为[，&gt;转为]，才发得出以上面错误。可能是javaeye的bug。&nbsp;</font><error></error><weblogicserver></weblogicserver><bea-000337></bea-000337></font></font></p>
<p>先说下我配置</p>
<p>1.环境：</p>
<p>spring 2.0.6，hibernate 3.2.3，struts 1.2.9，oracle 10.2，weblogic 8.1.4</p>
<p>jdbc是ojdbc14.jar</p>
<p>2.连接池用DBCP</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"dataSource"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.commons.dbcp.BasicDataSource"</span><span>&nbsp;</span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">"close"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"driverClassName"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${jdbc.driverClassName}"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"url"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${jdbc.url}"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"username"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${jdbc.username}"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"${jdbc.password}"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>&nbsp;3.分页方法（参考springside的），此类继承HibernateDaoSupport</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;Page&nbsp;listByPage(Class&nbsp;entityClass,&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageNo,&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageSize,&nbsp;List&nbsp;criterions,&nbsp;List&nbsp;orders)&nbsp;{ &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;createCriteria(entityClass,&nbsp;criterions); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;CriteriaImpl&nbsp;impl&nbsp;=&nbsp;(CriteriaImpl)&nbsp;criteria; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;先把Projection和OrderBy条件取出来,清空两者来执行Count操作 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Projection&nbsp;projection&nbsp;=&nbsp;impl.getProjection(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取总记录数 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount&nbsp;=&nbsp;((Integer)&nbsp;criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(totalCount&nbsp;&lt;&nbsp;</span><span class="number">1</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Page(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//加排序 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(orders&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.addOrder((Order)&nbsp;orders.get(i)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//原来的投影 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;criteria.setProjection(projection); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex&nbsp;=&nbsp;Page.getStartOfPage(pageNo,&nbsp;pageSize); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//取得结果 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=&nbsp;criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Page(startIndex,&nbsp;totalCount,&nbsp;pageSize,&nbsp;list); &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span class="keyword">public</span><span>&nbsp;Criteria&nbsp;createCriteria(Class&nbsp;entityClass,&nbsp;List&nbsp;criterions)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;getSession().createCriteria(entityClass); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(criterions&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add((Criterion)&nbsp;criterions.get(i)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;criteria; &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><span lang="EN-US"><font face="Arial"><font face="Arial"><error></error><weblogicserver></weblogicserver><bea-000337></bea-000337></font><error></error><weblogicserver></weblogicserver><bea-000337></bea-000337></font></span></p>
<p></p>
<p><span>另外，没有用<font face="Arial">OpenSessionInViewFilter，struts与spring的整合：<font face="Arial">DelegatingRequestProcessor、action path与bean name同名。</font></font></span></p>
<p></p>
<p><span><font face="Arial">翻页不过10次，服务器就没响应了，最后出现上面的错误的了。</font></span></p>
<br />
<br />
<p>问题解决，问题的原因是数据库连接耗尽，我用HiberanteDaoSupport的getSession()方法取得Session后没有释放Session。</p>
<p>出问题的代码处：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;Criteria&nbsp;createCriteria(Class&nbsp;entityClass,&nbsp;List&nbsp;criterions)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;getSession().createCriteria(entityClass);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(criterions&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add((Criterion)&nbsp;criterions.get(i));&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;criteria;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>用完Session释放后就没事了，调用HiberanteDaoSupport的<font face="Arial">releaseSession(session);方法后即可解决。</font></p>
<p>现在正确的代码：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;Page&nbsp;listByPage(Class&nbsp;entityClass,&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageNo,&nbsp;</span><span class="keyword">int</span><span>&nbsp;pageSize,&nbsp;List&nbsp;criterions,&nbsp;List&nbsp;orders)&nbsp;{ &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;getSession(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建criteria </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Criteria&nbsp;criteria&nbsp;=&nbsp;session.createCriteria(entityClass); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//为criteria添加criterions </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;createCriteria(entityClass,&nbsp;criteria,&nbsp;criterions); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;CriteriaImpl&nbsp;impl&nbsp;=&nbsp;(CriteriaImpl)&nbsp;criteria; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;先把Projection和OrderBy条件取出来,清空两者来执行Count操作 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Projection&nbsp;projection&nbsp;=&nbsp;impl.getProjection(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//获取总记录数 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;totalCount&nbsp;=&nbsp;((Integer)&nbsp;criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(totalCount&nbsp;&lt;&nbsp;</span><span class="number">1</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Page(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//加排序 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(orders&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i&lt;orders.size();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.addOrder((Order)&nbsp;orders.get(i)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//原来的投影 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;criteria.setProjection(projection); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;startIndex&nbsp;=&nbsp;Page.getStartOfPage(pageNo,&nbsp;pageSize); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//取得结果 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=&nbsp;criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//释放hiberante资源,一定要释放,要不然就数据库连接耗尽. </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;releaseSession(session); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Page(startIndex,&nbsp;totalCount,&nbsp;pageSize,&nbsp;list); &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;Criteria&nbsp;createCriteria(Class&nbsp;entityClass,&nbsp;Criteria&nbsp;criteria,&nbsp;List&nbsp;criterions)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(criterions&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;&nbsp;i&lt;criterions.size();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add((Criterion)&nbsp;criterions.get(i)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;criteria; &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<img src ="http://www.blogjava.net/shanben/aggbug/226900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2008-09-04 13:02 <a href="http://www.blogjava.net/shanben/archive/2008/09/04/226900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEBLOGIC调优方案</title><link>http://www.blogjava.net/shanben/archive/2008/06/30/211741.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Mon, 30 Jun 2008 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2008/06/30/211741.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/211741.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2008/06/30/211741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/211741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/211741.html</trackback:ping><description><![CDATA[<span style="font-size: 12px">注：在下面做的介绍都是以Weblogic8.1为例的，其它版本的Weblogic可能会有些许不同。<br />
1) 设置JAVA参数；<br />
a) 编辑Weblogic Server启动脚本文件；<br />
l&nbsp;&nbsp; BEA_HOME\user_projects\domains\domain-name\startWebLogic.cmd(startWebLogic.sh on Unix)<br />
l BEA_HOME\user_projects\domains\domain-name\startManagedWebLogic.cmd(startManagedWebLogic.sh on Unix)<br />
b) 编辑set JAVA_OPTIONS命令，如：set JAVA_OPTIONS=-Xms256m &#8211;Xmx256m；<br />
c) 保存，重启即可。<br />
注：在WebLogic中，为了获得更好的性能，BEA公司推荐最小Java堆等于最大Java堆。<br />
2) 开发模式 vs. 产品模式；<br />
开发模式和产品模式的一些参数的默认值不同，可能会对性能造成影响，下面是对性能有影响的参数列表：<br />
参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发模式默认值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产品模式默认值<br />
Execute Queue: Thread Count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15 threads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25 threads<br />
JDBC Connection Pool: MaxCapacity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15 connnections&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25 connections<br />
通过启动管理控制台，在域（如：mydomain）&gt; 配置 &gt; 常规选择产品模式。<br />
3) 尽量开启本地I/O；<br />
通过启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt; 配置 &gt; 调整选择启用本地I/O。<br />
注：此值也可通过手动的修改config.xml配置文件。<br />
4) 调优执行队列线程；<br />
a) 修改默认执行线程数<br />
在这里，执行队列的线程数表示执行队列能够同时执行的操作的数量。但此值不是设的越大越好，应该恰到好处的去设置它，太小了，执行队列中将会积累很多待处理的任务，太大了，则会消耗大量的系统资源从而影响整体的性能。在产品模式下默认为25个执行线程。<br />
为了设置理想的执行队列的线程数，我们可以启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt; 监视 &gt; 性能中监控最大负载时执行队列的吞吐量和队列中的等待请求数，据此确定理想的数值。<br />
理想的默认执行线程数是由多方面的因素决定的，比如机器CPU性能、总体体系架构、I/O、操作系统的进程调度机制、JVM的线程调度机制。随着CPU个 数的增加，WebLogic可以近乎线性地提高线程数。线程数越多，花费在线程切换的时间也就越多；线程数越小，CPU可能无法得到充分的利用。为获取一 个理想的线程数，需要经过反复的测试。在测试中，可以以25*CPU个数为基准进行调整。当空闲线程较少，CPU利用率较低时，可以适当增加线程数的大小 （每五个递增）。对于PC Server和Windows 2000，则最好每个CPU小于50个线程，以CPU利用率为90%左右为最佳。<br />
通过启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt; Execute Queue &gt; weblogic.kernel.Defalt &gt; 配置中修改线程计数。<br />
b) 设定执行队列的溢出条件；<br />
Weblogic Server提供给默认的执行队列或用户自定义的执行队列自定义溢出条件的功能，当满足此溢出条件时，服务器改变其状态为&#8220;警告&#8221;状态，并且额外的再分配一些线程去处理在队列中的请求，而达到降低队列长度的目的。<br />
通过启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt; Execute Queue &gt; weblogic.kernel.Defalt &gt; 配置下面几项：<br />
L 队列长度：此值表示执行队列中可容纳的最大请求数，默认值是65536，最后不要手动改变此值。<br />
L 队列长度阈值百分比：此值表示溢出条件，在此服务器指出队列溢出之前可以达到的队列长度大小的百分比。<br />
L 线程数增加：当检测到溢出条件时，将增加到执行队列中的线程数量。如果CPU和内存不是足够的高，尽量不要改变默认值&#8220;0&#8221;。因为Weblogic一旦增加后不会自动缩减，虽然最终可能确实起到了降低请求的作用，但在将来的运行中将影响程序的性能。<br />
L&nbsp;&nbsp; 最大线程数：为了防止创建过多的线程数量，可以通过设定最大的线程数进行控制。<br />
在实际的应用场景中，应根据具体情况适当的调整以上参数。<br />
c) 设定执行队列监测行为<br />
Weblogic Server能够自动监测到当一个执行线程变为&#8220;阻塞&#8221;。变为&#8220;阻塞&#8221;状态的执行线程将无法完成当前的工作，也无法再执行新请求。如果执行队列中的所有执 行线程都变为&#8220;阻塞&#8221;状态，Weblogic server可能改变状态为&#8220;警告&#8221;或&#8220;严重&#8221;状态。如果Weblogic server变为&#8220;严重&#8221;状态，可以通过Node Manager来自动关闭此服务器并重新启动它。具体请参考：Node Manager Capabilities文档。<br />
通过启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt;配置 &gt; 调整下可配置下面几项：<br />
l&nbsp;&nbsp; 阻塞线程最长时间：在此服务器将线程诊断为阻塞线程之前，线程必须连续工作的时间长度(秒)。默认情况下，WebLogic Server 认为线程在连续工作 600 秒后成为阻塞线程。<br />
l&nbsp;&nbsp; 阻塞线程计时器间隔：WebLogic Server 定期扫描线程以查看它们是否已经连续工作了 "阻塞线程最长时间" 字段中指定的时间长度的间隔时间(秒)。默认情况下，WebLogic Server 将此时间间隔设置为 600 秒。<br />
5) 调优TCP连接缓存数；<br />
WebLogic Server用Accept Backlog参数规定服务器向操作系统请求的队列大小，默认值为50。当系统重载负荷时,这个值可能过小,日志中报Connection Refused,导致有效连接请求遭到拒绝,此时可以提高Accept Backlog 25%直到连接拒绝错误消失。对于Portal类型的应用,默认值往往是不够的。Login Timeout和SSL Login Timeout参数表示普通连接和SSL连接的超时时间,如果客户连接被服务器中断或者SSL容量大,可以尝试增加该值。<br />
通过启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt;配置 &gt; 调整下可配置&#8220;接受预备连接&#8221;。<br />
6) 改变Java编译器；<br />
标准的Java编译器是javac，但编译JSP servlets速度太慢，为了提高编译速度，可以使用sj或jikes编译器取代javac编译器。下面说说更改Java编译器：<br />
通过启动管理控制台，在域（如：mydomain）&gt; 服务器 &gt; server实例（如：myserver）&gt;配置 &gt; 常规下改变Java 编译器，默认为javac。输入完整路径，如：c:\visualcafe31\bin\sj.exe。然后打开高级选项，在预规划到类路径填写编译 Java 代码时为 Java 编译器类路径预规划的选项，如：BEA_HOME\jdk141_02\jre\lib\rt.jar。<br />
7) 使用Webogic Server集群提高性能；<br />
具体关于如何配置Weblogic集群，我就不细说了。详情可参考：Introduction to WebLogic Server Clustering。<br />
8) Weblogic EJB调优<br />
由于EJB2.0已经很少项目在用了，EJB3.0再成熟一点，我再补充这一部分吧！<br />
9) JDBC应用调优<br />
JDBC Connection Pool的调优受制于WebLogic Server线程数的设置和数据库进程数,游标的大小。通常我们在一个线程中使用一个连接,所以连接数并不是越多越好,为避免两边的资源消耗，建议设置连 接池的最大值等于或者略小于线程数。同时为了减少新建连接的开销,将最小值和最大值设为一致。<br />
增加Statement Cache Size对于大量使用PreparedStatement对象的应用程序很有帮助,WebLogic能够为每一个连接缓存这些对象,此值默认为10。在保 证数据库游标大小足够的前提下,可以根据需要提高Statement Cache Size。比如当你设置连接数为25,Cache Size为10时,数据库可能需要打开25*10=250个游标。不幸的是,当遇到与PreparedStatement Cache有关的应用程序错误时,你需要将Cache Size设置为0。<br />
尽管JDBC Connection Pool提供了很多高级参数,在开发模式下比较有用,但大部分在生产环境下不需调整。这里建议最好不要设置测试表, 同时Test Reserved Connections和Test Released Connections也无需勾上。 当然如果你的数据库不稳定,时断时续,你就可能需要上述的参数打开。<br />
最后提一下驱动程序类型的选择,以Oracle为例,Oracle提供thin驱动和oci驱动,从性能上来讲,oci驱动强于thin驱动,特别是大数 据量的操作。但在简单的数据库操作中,性能相差不大,随着thin驱动的不断改进,这一弱势将得到弥补。而thin驱动的移植性明显强于oci驱动。所以 在通常情况下建议使用thin驱动。而最新驱动器由于WebLogic server/bin目录下的类包可能不是最新的,请以Oracle网站为准: <a href="http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html" target="_blank"><font color="#003366">http://www.oracle.com/technology ... tdocs/jdbc9201.html</font></a>。<br />
10) JSP调优<br />
l&nbsp;&nbsp; 设置jsp-param pageCheckSeconds=-1；<br />
l&nbsp;&nbsp; 设置serlet-reload-check=-1或ServletReloadCheckSecs=-1；<br />
l&nbsp;&nbsp; 设置jsp-param precompile=true，关闭JSP预编译选项。(转载)</span>
 <img src ="http://www.blogjava.net/shanben/aggbug/211741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2008-06-30 20:55 <a href="http://www.blogjava.net/shanben/archive/2008/06/30/211741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>