tomcat 监听器启动线程导致tomcat卡死只允许线程的run方法,不能访问项目,急,在线等

未之未央丶 2017-01-05 03:26:14
项目简介:Jsp+servlet3.0+dbcp连接池1.4+tomcat8.0

因连接池泄露,有些connection无法关闭,想可以手动kill掉那些连接时间超过2分钟的Connection连接。然后写了一个线程,将它挂在ServletContextListener监听器下,然后tomcat一启动,tomcat会被该线程卡住,出现一直执行线程,而不继续加载项目的情况,导致项目无法访问,想请问下,这种情况该怎么办。怎么改这种模式才是对的。

tomcat启动错误:
信息: Deploying web application directory F:\tomcat-8.0\webapps\host-manager
一月 05, 2017 3:17:32 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory F:\tomcat-8.0\webapps\host-manager has finished in 41 ms
一月 05, 2017 3:17:32 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory F:\tomcat-8.0\webapps\manager
一月 05, 2017 3:17:32 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deployment of web application directory F:\tomcat-8.0\webapps\manager has finished in 24 ms
一月 05, 2017 3:17:32 下午 org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory F:\tomcat-8.0\webapps\ROOT
一月 05, 2017 3:17:33 下午 org.apache.jasper.servlet.TldScanner scanJars
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
kill 5 ;
kill 6 ;
kill 7 ;
kill 5 ;
kill 6 ;
kill 7 ;


代码如下:

ServletContextListener监听器类
package com.hebeu.util;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ApplicationListener implements ServletContextListener{
Thread thread = new Thread(new KillConn());

public void contextInitialized(ServletContextEvent sce) {
while (true) {
try {
thread.run();
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void contextDestroyed(ServletContextEvent sce) {

}

}

KillConn.java线程
package com.hebeu.util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class KillConn implements Runnable{

public void run() {
String fingSql = "SELECT CONCAT('kill ',id,' ;')'sql' FROM information_schema.`PROCESSLIST` WHERE TIME>10";
ArrayList<String> listSql = new ArrayList<String>();
Connection conn = null;
try {
conn = JDBCUtil.getConn();
conn.setAutoCommit(false);
ResultSet rs = JDBCUtil.findOne(fingSql, conn);
while(rs.next())
{
listSql.add(rs.getString(1));
}
for (String string : listSql) {
System.out.println(string);
// JDBCUtil.doSql(string, conn);
}
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JDBCUtil.closeAll(null, null, conn);
}

}
}
...全文
259 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ichavin 2017-01-09
  • 打赏
  • 举报
回复
1楼的哥们是对的: 1、你的线程启动应该是start(),而不是run; 2、你的线程执行完后,是没有返回值的,导致你的while(true)一直会循环不会跳出来,程序一直会卡死 3、我看你的KillConn24行是在for循环里面执行sql,建议如果可以优化一下,最好就不要for循环执行sql,可以改成一条语句,或者其他方式。。
yuqi_hz 2017-01-05
  • 打赏
  • 举报
回复
你在contentInitialized里面不要设置while(true),在线程的run方法里面设置,你现在的情况是一直在contentInitialized里面
h2plus0 2017-01-05
  • 打赏
  • 举报
回复
contextInitialized()里面, while (true) { try { thread.run(); Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } } 如果 contextInitialized()没有返回(不停循环), 就会造成卡死现象 启动线程调用是用过 thread.start(),不应该调用thread.run(); 也不需要在while里面不停循环

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧