非法访问:此Web应用程序实例已经被停止

6
我正在使用GWT,Hibernate(基于XML的映射),MySQL-在Tomcat6.0中开发应用程序。IDE-Netbeans 6.9。我在Netbeans中设置了项目属性“保存时部署”选项。
当我的应用程序在服务器上运行很长时间后,偶尔会无法连接到数据库并抛出以下异常:
最终的堆栈跟踪是由于为了调试目的而引发错误以及尝试终止导致非法访问的线程引起的,并且没有功能影响。
java.lang.IllegalStateException  
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273)  
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)  
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)  
        at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4273)  
        at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1444)  
        at org.hibernate.connection.DriverManagerConnectionProvider.close(DriverManagerConnectionProvider.java:152)  
        at org.hibernate.connection.DriverManagerConnectionProvider.finalize(DriverManagerConnectionProvider.java:142)  
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)  
        at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)  
        at java.lang.ref.Finalizer.access$100(Finalizer.java:14)  
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)  

当我重新启动我的Tomcat服务器时,我又能够连接数据库。请告诉我通过哪种方式可以实现无缝性能,并在不重新启动Tomcat的情况下完成工作。
1个回答

6
您可能在不断地打开连接,但却没有关闭它们,最终达到了数据库配置的最大连接数。请找出您打开连接的位置,并确保您关闭了它们。如果您为每个请求打开一个连接但没有关闭它,那么很容易找到并解决。或者当您遇到错误时可能没有关闭连接,请检查您的异常处理代码。
使用DB连接的推荐方法是使用“try finally”来尽力关闭db连接:
Connection con;
try {
   con = ...; // open connection
   // do work
catch (SQLException e) {
   // do whatever
} finally {
    if (con != null && !con.isClosed()) {
        try {
            con.close();
        catch (SQLException e) {
            // Don't throw from here or you'll lose any return/exception from above
            log.error("Failed to close connection", e);
        }
    }
}

在我看来,如果是这种情况,我会期望出现错误500而不是报告的那个。实际上,不需要数据库连接的Servlet应该仍然可以工作。 - SJuan76
然后寻找Bohemian的解决方案(尽管我仍然认为这是一个非常误导性的信息...) - SJuan76
我认为这对我很有帮助,感谢大家的回复和评论。 - Amandeep Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接