首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

tomcat频繁死掉的有关问题,常例分析

2012-01-16 
tomcat频繁死掉的问题,常例分析某天在服务器上的网页打不开了,频繁报以下错误。2007-3-181:08:26org.apache

tomcat频繁死掉的问题,常例分析
某天在服务器上的网页打不开了,频繁报以下错误。

2007-3-18   1:08:26   org.apache.tomcat.util.threads.ThreadPool   logFull
严重:   All   threads   (150)   are   currently   busy,   waiting.   Increase   maxThreads   (150)   or   check   the   servlet   status

在网上找了些回答,以下是我觉得正确的回答:
    1.我想你的部分资源没有释放,积压卡死的
    2.连接池问题
    3.应该是服务器端响应request的线程的处理时间过长导致的

分析:
当时使用网站的人数只有2个人,不可能答到到了并发线程150的上线。所以应该不是数据库的问题。
通过对出错的提示判断,应该是连接池使用不合理造成的,或者根本没设置连接池。和数据库连接的部分是使用Spring的数据源JDBC连的,如下:
<beans>
        <bean   id= "dataSource "   class= "org.springframework.jdbc.datasource.DriverManagerDataSource ">
                <!--   driver   for   MySQL-->
                <property   name= "driverClassName "> <value> org.gjt.mm.mysql.Driver </value> </property>
                <property   name= "url "> <value> jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF8 </value> </property>
                <property   name= "username "> <value> test </value> </property>
                <property   name= "password "> <value> test </value> </property>              
</beans>

问题应该出现在Spring的DriverManagerDataSource上,它负责管理这些连接的。
下边是对DriverManagerDataSource   的解释
DriverManagerDataSource   in   Spring   Framework  

      javax.sql   Interface   DataSource

Implementation   of   SmartDataSource   that   configures   a   plain   old   JDBC   Driver   via  
bean   properties,   and   returns   a   new   Connection   every   time.  

Useful   for   test   or   standalone   environments   outside   of   a   J2EE   container,   either  
as   a   DataSource   bean   in   a   respective   ApplicationContext,   or   in   conjunction   with  
a   simple   JNDI   environment.   Pool-assuming   Connection.close()   calls   will   simply  
close   the   connection,   so   any   DataSource-aware   persistence   code   should   work.  

In   a   J2EE   container,   it   is   recommended   to   use   a   JNDI   DataSource   provided   by   the  
container.   Such   a   DataSource   can   be   exported   as   a   DataSource   bean   in   an  
ApplicationContext   via   JndiObjectFactoryBean,   for   seamless   switching   to   and   from  
a   local   DataSource   bean   like   this   class.  

If   you   need   a   "real "   connection   pool   outside   of   a   J2EE   container,   consider  
Apache 's   Jakarta   Commons   DBCP.   Its   BasicDataSource   is   a   full   connection   pool  


bean,   supporting   the   same   basic   properties   as   this   class   plus   specific   settings.  
It   can   be   used   as   a   replacement   for   an   instance   of   this   class   just   by   changing  
the   class   name   of   the   bean   definition   to  
"org.apache.commons.dbcp.BasicDataSource ".  

-----------------------------------------------
Many   Jakarta   projects   support   interaction   with   a   relational   database.   Creating   a  
new   connection   for   each   user   can   be   time   consuming   (often   requiring   multiple  
seconds   of   clock   time),   in   order   to   perform   a   database   transaction   that   might  
take   milliseconds.   Opening   a   connection   per   user   can   be   unfeasible   in   a  
publicly-hosted   Internet   application   where   the   number   of   simultaneous   users   can  
be   very   large.   Accordingly,   developers   often   wish   to   share   a   "pool "   of   open  
connections   between   all   of   the   application 's   current   users.   The   number   of   users  
actually   performing   a   request   at   any   given   time   is   usually   a   very   small  
percentage   of   the   total   number   of   active   users,   and   during   request   processing   is  
the   only   time   that   a   database   connection   is   required.   The   application   itself  
logs   into   the   DBMS,   and   handles   any   user   account   issues   internally.

There   are   several   Database   Connection   Pools   already   available,   both   within  
Jakarta   products   and   elsewhere.   This   Commons   package   provides   an   opportunity   to  
coordinate   the   efforts   required   to   create   and   maintain   an   efficient,  
feature-rich   package   under   the   ASF   license.

The   commons-dbcp   package   relies   on   code   in   the   commons-pool   package   to   provide  
the   underlying   object   pool   mechanisms   that   it   utilizes.

Applications   can   use   the   commons-dbcp   component   directly   or   through   the   existing  
interface   of   their   container   /   supporting   framework.   For   example   the   Tomcat  
servlet   container   presents   a   DBCP   DataSource   as   a   JNDI   Datasource.   James   (Java  
Apache   Mail   Enterprise   Server)   has   integrated   DBCP   into   the   Avalon   framework.   A  
Avalon-style   datasource   is   created   by   wrapping   the   DBCP   implementation.   The  


pooling   logic   of   DBCP   and   the   configuration   found   in   Avalon 's   excalibur   code   is  
what   was   needed   to   create   an   integrated   reliable   DataSource.  

看完了解释,事实上是因为DriverManagerDataSource建立连接是只要有连接就新建一个connection,根本没有连接池的作用。改为以下开源的连接池会好点。
<bean   id= "myDataSource "   class= "org.apache.commons.dbcp.BasicDataSource "   destroy-method= "close ">  
<property   name= "driverClassName ">  
<value> org.hsqldb.jdbcDriver </value>  
</property>  
<property   name= "url ">  
<value> jdbc:hsqldb:hsql://localhost:9001 </value>  
</property>  
<property   name= "username ">  
<value> sa </value>  
</property>  
<property   name= "password ">  
<value> </value>  
</property>  
</bean>

测试通过,问题消除,以上情况处理,与大家共鉴!

转http://www.knowsky.com/


[解决办法]
好帖
[解决办法]
up
[解决办法]
qzshi.com这是我自己弄的论坛,刚开的,还没有内容
有谁有时间的可以加我QQ40321289一起管理,请高手
参与
[解决办法]
严重: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status

tomcat默认最大支持 并发150个线程.

if( 楼上的流量比较大)
System.out.println( "出这个错正常. 加大tomcat的并发量就可以了 ");
else
System.out.println( "程序有问题.(服务器端响应request的线程的处理时间过长导致) ");

[解决办法]
不错,
[解决办法]
恩,建议用poolman,还不错的连接池

热点排行