Нелегальный доступ: этот экземпляр веб-приложения уже остановлен - PullRequest
6 голосов
/ 22 августа 2011

Я занимаюсь разработкой приложения с 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 голосов
/ 22 августа 2011

Вы, вероятно, открываете все больше и больше соединений и никогда не закрываете их, в конечном счете достигая настроенного максимального количества соединений в вашей базе данных.

Найдите, где вы открываете соединения, и убедитесь, что вы закрываете их.Если вы открываете соединение для каждого запроса, но не закрываете его, это легко найти и исправить.Или, возможно, вы не закрываете свое соединение, когда получаете ошибку - проверьте код обработки исключений.

Рекомендуемый подход при использовании соединений с БД состоит в том, чтобы использовать try finally, чтобы приложить максимальные усилия для закрытия соединений БД:

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);
        }
    }
}
...