当前位置:   article > 正文

解决Tomcat异常:java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。_java.lang.illegalstateexception: 非法访问:此web应用程序实例已停

java.lang.illegalstateexception: 非法访问:此web应用程序实例已停止。无法加载[

调试项目的时候发现每次使用idea重新部署项目时会出现这个错误,但是不影响实际使用,重启服务器第一次部署时也不会出现错误,尝试搜索解决这个问题。

解决方法:

进入tomcat目录下查找配置文件,conf > Context.xml,查找Context标签,修改属性reloadble为 reloadable=“false” (如果没有reloadable属性,就自己创建一个)

  1. <Context reloadable="false">
  2. <WatchedResource>WEB-INF/web.xml</WatchedResource>
  3. <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
  4. <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
  5. <Manager pathname="SESSIONS.ser" />
  6. </Context>

reloadable的功能:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用 ,也就是热部署。 有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的发存阶段将reloadable设为false。

后续问题:

如果reloadable变为false后依然有一个报错:

意思是注册过jdbc驱动,在容器关闭时没有注销,并且是在AbandonedConnectionCleanupThread线程中。 所以为了内存避免泄露,就强制注销了驱动。

解决方法:

写一个容器监听器,在容器销毁时注销AbandonedConnectionCleanupThread。

网上的查找到的监听器代码是基于旧版驱动的,我修改了一个新版本的,记得在配置中添加对应的包扫描

  1. import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
  2. import jakarta.servlet.ServletContextEvent;
  3. import jakarta.servlet.ServletContextListener;
  4. import jakarta.servlet.annotation.WebListener;
  5. import java.sql.Driver;
  6. import java.sql.DriverManager;
  7. import java.sql.SQLException;
  8. import java.util.Enumeration;
  9. @WebListener
  10. public class MyContextListener implements ServletContextListener {
  11. //注销驱动,防止服务器重新部署时jdbc报错
  12. @Override
  13. public void contextDestroyed(ServletContextEvent sce) {
  14. Enumeration<Driver> drivers = DriverManager.getDrivers();
  15. while (drivers.hasMoreElements()) {
  16. try {
  17. DriverManager.deregisterDriver(drivers.nextElement());
  18. } catch (SQLException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. // 关闭AbandonedConnectionCleanupThread线程
  23. AbandonedConnectionCleanupThread.checkedShutdown();
  24. System.out.println("注销驱动、关闭AbandonedConnectionCleanupThread线程");
  25. }
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/347701
推荐阅读
相关标签
  

闽ICP备14008679号