最近网站运行了一段时间就会报错,线程满,然后打开就很慢,重启又好了,因为我跑了三个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)
2.ClientAbortException:java.net.SocketException:连接被同行复位:套接字写入错误
<%@ 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>
我也看不出你这个jsp页面有什么问题,我想问题可能不是这个页面,还得检查其它地方,比如action呀、service、DAO等等这些,这个你得有耐心慢慢一点点测试了,呵呵
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);
}
}这是我的连接池
檢查看看有沒有都正確關閉 connection。
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;
}
这个有很多种情况可能导致,没法确定具体原因。
如果有线程满异常的话。感觉还是和数据库连接有关系。
发出你的配置文件大家看下吧。
<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>
之后好像是写了一段代码,大概就是刷新连接吧//先初始化N个连接
while(condition){
//逻辑处理
//kill掉
if(N==0)
//再初始化N个连接
}印象中是这样的问题,解决方法是刷新连接,具体的解决方法有点忘了。