最近网站运行了一段时间就会报错,线程满,然后打开就很慢,重启又好了,因为我跑了三个TOMCAT,所以我用的是startup.bat,
然后我打开TOMCAT下面的log,localhost_log.2010-10-07,看到的就是下面的这些错误,我不知道,这些错误是不是导致网站线程满的原因,那这些错误是怎么产生的呢,怎么才能不让这些错误产生呢,我要怎么才能查出TOMCAT线程满的原因呢,一直很郁闷,希望大家给我支招。
2010-10-07 09:08:01 org.apache.catalina.core.StandardHostValve@43da1b: Exception Processing ErrorPage[errorCode=404, location=/errpage/500error.jsp]
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.coyote.tomcat5.OutputBuffer.doFlush(OutputBuffer.java:331)
at org.apache.coyote.tomcat5.OutputBuffer.flush(OutputBuffer.java:297)
at org.apache.coyote.tomcat5.CoyoteResponse.flushBuffer(CoyoteResponse.java:537)
at org.apache.coyote.tomcat5.CoyoteResponseFacade.flushBuffer(CoyoteResponseFacade.java:238)
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:303)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:147)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)

解决方案 »

  1.   

    1.首先看看你这个页面是不是有问题/errpage/500error.jsp
    2.ClientAbortException:java.net.SocketException:连接被同行复位:套接字写入错误
      

  2.   

    这个就是那个500的页面,应该没什么问题的.报这个错误跟TOMCAT线程满有关吗?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <%@ page isErrorPage="true" language="java" contentType="text/html; charset=GBK" %>
    <html>
    <head>
    <style>
    a:link {font:9pt/12pt 宋体, MS Song; color:red}
    a:visited {font:9pt/12pt 宋体, MS Song; color:#4e4e4e}
    </style>
    <meta HTTP-EQUIV="Content-Type" Content="text-html; charset=gb2312">
    <title>500错误</title>
    </head><body bgcolor="white"><table width="400" cellpadding="3" cellspacing="5">
      <tr>
        <td id="tableProps" valign="top" align="left">您请求的页面不存在。</td>
      </tr>
    </table>
    </body>
    </html>
      

  3.   

    呵呵,静态页面肯定不会报线程满的错误
    我也看不出你这个jsp页面有什么问题,我想问题可能不是这个页面,还得检查其它地方,比如action呀、service、DAO等等这些,这个你得有耐心慢慢一点点测试了,呵呵
      

  4.   

    我用的是TOMCAT5.0,难道5.0处理并发数这么差经吗?
      

  5.   


    package com.ttkd.dao;import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;import org.apache.commons.dbcp.ConnectionFactory;
    import org.apache.commons.dbcp.DriverManagerConnectionFactory;
    import org.apache.commons.dbcp.PoolableConnectionFactory;
    import org.apache.commons.dbcp.PoolingDriver;
    import org.apache.commons.pool.ObjectPool;
    import org.apache.commons.pool.impl.GenericObjectPool;public class DBConnection {
        
          private static String    
          driver="com.microsoft.sqlserver.jdbc.SQLServerDriver",//驱动   
          url = "jdbc:sqlserver://localhost:1433;DatabaseName=test",//URL   
          Name="sa",//用户名   
          Password="sa";//密码   
     
    private static Class driverClass = null;   
    private static ObjectPool connectionPool = null;   public DBConnection(){          
             }       
     
     
    /**   
    * 初始化数据源   
    */    
    private static synchronized void initDataSource() {            
      if (driverClass == null) {    
          try {    
              driverClass = Class.forName(driver);    
          } catch (ClassNotFoundException e) {    
              e.printStackTrace();   
          }    
      }    
    }    /**   
    * 连接池启动   
    * @throws Exception   
    */    
    public static void StartPool() {   
      //loadProperties();   
      initDataSource();    
      if (connectionPool != null) {    
          ShutdownPool();    
      }     
      try {    
          connectionPool = new GenericObjectPool(null);  
          ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, Name, Password);    
          PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);    
          Class.forName("org.apache.commons.dbcp.PoolingDriver");    
          PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");    
          driver.registerPool("dbpool", connectionPool);                 
      } catch (Exception e) {    
          e.printStackTrace();   
      }    
    }    /**   
    * 释放连接池   
    */    
    public static void ShutdownPool() {    
      try {    
          PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");    
          driver.closePool("dbpool");   
      } catch (SQLException e) {    
          e.printStackTrace();   
      }    
    }        /**   
    * 取得连接池中的连接   
    * @return   
    */    
    public static Connection getConnection() {    
      Connection conn = null;    
      if(connectionPool == null)    
          StartPool();    
      try {    
          conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:dbpool");    
      } catch (SQLException e) {    
          e.printStackTrace();   
      }    
      return conn;    
    }    
     
    /**  
    * 获取连接  
    * getConnection  
    * @param name  
    * @return  
    */  
    public static Connection getConnection(String name){   
     return getConnection();   
    }   
    /**  
    * 释放连接  
    * freeConnection  
    * @param conn  
    */  
    public static void freeConnection(Connection conn){   
      if(conn != null){   
          try {   
              conn.close();   
          } catch (SQLException e) {                 
              e.printStackTrace();   
          }   
      }   
    }   
    /**  
    * 释放连接  
    * freeConnection  
    * @param name  
    * @param con  
    */  
    public static void freeConnection (String name,Connection con){   
      freeConnection(con);   
    }   
    }这是我的连接池
      

  6.   

    你有哪些程式會使用到 connection ?
    檢查看看有沒有都正確關閉 connection。
      

  7.   

    这是我业务类的一个方法,都有关闭的,按我的理解,所有的都马上得到马上关闭的。也就不存在有人一直占着连接池啊,难道是我的连接类没写好??????????????????public CompanyModel getCompanyInfoListById(String id) throws Exception {
    conn = DBConnection.getConnection();
    sql = "select * from company where id=?";
    try {
    ps = conn.prepareStatement(sql);
    ps.setString(1, id);
    rs = ps.executeQuery();
    while (rs.next()) {
    model = new CompanyModel();
    model.setName(rs.getString("name"));
    model.setBianhao(rs.getString("bianhao"));
    model.setManage(rs.getString("manage"));
    model.setMobil(rs.getString("mobil"));
    model.setShengId(Integer.parseInt(rs.getString("sheng")));
    model.setShiId(Integer.parseInt(rs.getString("shi")));
    model.setQuId(rs.getInt("quid"));
    model.setTel(rs.getString("tel"));
    model.setTel1(rs.getString("tel1"));
    model.setQq(rs.getString("qq"));
    model.setAddress(rs.getString("address"));
    model.setPost(rs.getString("post"));
    model.setCz(rs.getString("cz"));
    model.setPsfw(rs.getString("psfw"));
    model.setPsfwShi(rs.getString("psfw_shi"));
    model.setPsfwXian(rs.getString("psfw_xian"));
    model.setPsfwZhen(rs.getString("psfw_zhen"));
    model.setBfps(rs.getString("bfps"));
    model.setBpsfw(rs.getString("bpsfw"));
    model.setBpsfwShi(rs.getString("bpsfw_shi"));
    model.setBpsfwZhen(rs.getString("bpsfw_zhen"));
    model.setPssx(rs.getString("pssx"));
    model.setTsfw(rs.getString("tsfw"));
    model.setBz(rs.getString("bz"));
    model.setHtmlFileName(rs.getString("htmlFileName"));
    model.setHtmlFilePath(rs.getString("htmlFilePath"));
    model.setDeleteFlag(rs.getString("deleteFlag"));
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (rs != null) {
    rs.close();
    }
    if (ps != null) {
    ps.close();
    }
    conn.close();
    }
    return model;
    }
      

  8.   

    java.net.SocketException: Connection reset by peer: socket write error
    这个有很多种情况可能导致,没法确定具体原因。
    如果有线程满异常的话。感觉还是和数据库连接有关系。
    发出你的配置文件大家看下吧。
      

  9.   

    我一直在想,JAVA的线程是怎么算的,难道每个打开网页的人,只要那个网页是动态连接数据库的,就算他是一个线程吗?如果他一直不关闭,是不是就一直占用那个线程呢,这样算的话,只要有1000个用户访问数据库,那肯定是要报线程满的错误的啊,那访问量大的怎么办啊。
      

  10.   

    以前遇到过Tomcat报线程满的问题。我用的是JNDI方式连接数据库。最后修改了对连接的配置中关于限制数据库连接数量的设置等。问题解决了。建议你修改下数据库连接方式,先确定下问题是否因此引起。
      

  11.   

    我的数据库连接方式和你的不一样。
    <naming>
       <context>
         <resource name="jdbc/pool_engine" type="javax.sql.DataSource">
           <parameter>
             <name>factory</name>
             <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
           </parameter>
           <parameter>
             <name>driverClassName</name>
             <value>oracle.jdbc.driver.OracleDriver</value>
           </parameter>
           <parameter>
             <name>url</name>
             <value>jdbc:oracle:thin:@192.168.1.30:1521:fm2</value>
           </parameter>
           <parameter>
             <name>username</name>
             <value>sms</value>
           </parameter>
           <parameter>
             <name>password</name>
             <value>sms</value>
           </parameter>
           <parameter>
             <name>maxActive</name>
             <value>20</value>
           </parameter>
       <parameter>
             <name>initialSize</name>
             <value>10</value>
           </parameter>
       <parameter>
             <name>maxIdle</name>
             <value>10</value>
           </parameter>
       <parameter>
             <name>minIdle</name>
             <value>5</value>
           </parameter>
           <parameter>
             <name>removeAbandoned</name>
             <value>true</value>
           </parameter>
           <parameter>
             <name>logAbandoned</name>
             <value>true</value>
           </parameter>

         </resource>
         </context>
     </naming>
      

  12.   

    大家说说,是TOMCAT的问题吗?升级能解决问题吗?那TOMCAT能处理多少个并发数呢。
      

  13.   

    有朋友遇到过这样的问题,貌似是连接老化的问题。
    之后好像是写了一段代码,大概就是刷新连接吧//先初始化N个连接
    while(condition){
      //逻辑处理
      //kill掉
      if(N==0)
         //再初始化N个连接
    }印象中是这样的问题,解决方法是刷新连接,具体的解决方法有点忘了。