tomcat 6.0.24 Исключение: не удалось загрузить com.mysql.jdbc.SQLError - PullRequest
6 голосов
/ 10 апреля 2011

Мой сервер tomcat 5, работающий на centos часто (несколько раз в день), выдает следующую ошибку:

Apr 7, 2011 11:02:30 PM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load com.mysql.jdbc.SQLError.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1370)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1329)
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291)
        at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1665)
        at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4411)
        at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1315)
        at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2761)
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
        at java.lang.ref.Finalizer.runFinalizer(Unknown Source)
        at java.lang.ref.Finalizer.access$100(Unknown Source)
        at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

В каталоге lib tomcat содержатся mysql-connector-java-5.1.8-bin.jar и mysql-connector-java-5.1.6-bin.jar, а каталог WEB-INF / lib содержит только mysql-connector-java-5.1.8-bin.jar.Все три jar-файла содержат класс SQLError.

Я бы хотел исключить это исключение.Может ли кот искать другое место, чтобы попытаться найти этот класс?

Ответы [ 8 ]

5 голосов
/ 10 апреля 2011

Ошибка не в том, что класс не может быть найден.Загрузка запрещена, поскольку веб-приложение остановлено.Я подозреваю, что это может произойти после перезапуска веб-приложения, когда оно не работает в течение короткого периода времени.Тогда какой-то finalize() метод в коде, вероятно, пытается выполнить некоторую очистку слишком поздно.Я не могу сказать, есть ли это в вашем коде или драйвере MySQL.Вы определенно должны иметь только одну версию jar в каталоге за раз.Возможно, вы захотите обновить его до последней (прямо сейчас 5.1.15) на случай, если что-то исправлено и может повлиять на вас.

2 голосов
/ 12 августа 2013

Использовать только одну версию файла JAR в каталоге WEB-INF / lib. Лучше использовать последнюю версию mysql-connector-java 5.1.26.

1 голос
/ 10 апреля 2011

Более новые версии Tomcat требуют, чтобы вы помещали JAR-файлы драйвера JDBC в каталог Tomcat / lib, а не в WEB-INF.И в этом каталоге должна быть только одна версия - версия, которую вы хотите использовать - и никаких других.

Поскольку вы используете Tomcat 5, я бы рекомендовал поместить JAR в каталог server / lib.

Я не знаю, является ли это основной причиной вашей проблемы, но стоит попробовать.

0 голосов
/ 12 августа 2013

Помимо использования только одной версии jar (которую предложили другие пользователи), пожалуйста, проверьте следующее:

  1. Убедитесь, что, когда вы закончите с подключением к базе данных, закрыть соединение с помощью close() вызова.
  2. Подобные ошибки могут возникать, когда вы открываете количество соединений и не закрываете их явно.
  3. В этих ситуациях много раз база данных фактически закрывает незанятые соединения, но объект, представляющий это соединение на стороне приложения, все еще не закрыт.
  4. Что происходит, эти открытые объекты соединения скрываются, и когда финализатор запускается ( видно из трассировки стека ) и пытается закрыть соединение, вы получаете IllegalStateException как это соединениеОбъект не связан ни с какими подключениями к базе данных.
0 голосов
/ 12 августа 2013

Я думаю, что вы должны использовать механизм пула соединений для незанятых соединений. или проверьте эту ссылку для пула соединений 'http://www.mkyong.com/hibernate/how-to-configure-the-c3p0-connection-pool-in-hibernate/'

0 голосов
/ 12 августа 2013

Скорее всего, вы используете пул соединений в приложении, которое проверяет соединение с базой данных.

0 голосов
/ 09 августа 2013

Где настроен ваш пул соединений JDBC? Это в JNDI Tomcat (conf / server.xml) или непосредственно в вашем приложении? При появлении этого сообщения одно из ваших веб-приложений было развернуто или повторно развернуто?

Из стековой трассировки и исходного кода MysqlIO.java и WebappClassLoader.java я бы предположил, что:

  • один из веб-приложений не развернут - на основе кода в WebappClassLoader:

    // Журнал доступа к остановленному загрузчику классов

    если (! Началось) { пытаться { бросить новый IllegalStateException (); } catch (IllegalStateException e) { log.info (sm.getString ("webappClassLoader.stopped", name), e); } }

  • ваши JDBC-соединения некорректно очищаются во время завершения работы веб-приложения (ваш ServletContextListener.contextDestroyed должен это делать, например, параметр метода bean-компонента Spring)

  • некоторые классы, используемые кодом драйвера MySQL, были выгружены GC
  • эти соединения имеют право на GC, когда ваше приложение закрывается, но GC обнаруживает, что метод завершения соединения MySQL переопределен, поэтому он выполняет его
  • когда этот метод finalize выполняется, для него требуется класс, который необходимо загрузить. Загрузчик классов Tomcat вашего остановленного веб-приложения обнаруживает его и сообщает, что не должно быть других классов, загруженных остановленным веб-приложением.

Мое решение вашей проблемы состояло бы в том, чтобы проверить, как очищается ваш пул соединений JDBC во время завершения работы веб-приложения, и убедиться, что пул также явно отключен.

0 голосов
/ 09 августа 2013

Вы можете проверить порядок каталогов в classpath. Однажды у меня было две версии файла jar: одна в рабочем каталоге, а другая в каталоге Java Extensions. Порядок пути к классам был следующим: сначала проверьте каталог расширений eclipse, а затем рабочий каталог. Как только он нашел версию jar в каталоге расширений, он не стал искать ту, которую я указал в рабочем каталоге. Порядок имеет значение в classpath.

...