Ошибка выполнения Toplink в Tomcat 6

Позвольте мне дать небольшую предысторию, чтобы дать контекст этому вопросу. Со временем приложение, над которым мне поручили работать, утратило возможность сборки и развертывания как полноценного приложения. Под этим я подразумеваю, что предыдущий разработчик скомпилировал код в своей локальной среде IDE и удалил отдельные файлы классов, в отличие от создания правильных JAR и WAR для развертывания на tomcat. Поэтому мне было поручено очистить проект, чтобы он снова стал стандартным развертываемым приложением. Итак, чтобы подвести итог важной части, приложение существует в рабочем формате в среде Windows Tomcat, которая долгое время не имела чистого развертывания, моя цель - сделать приложение пригодным для сборки и развертывания через сервер jenkins CI для экземпляр tomcat, работающий на сервере Linux. Теперь о проблеме. Я получаю следующее исключение toplink в одном модуле приложения.

Local Exception Stack:
Exception [TOPLINK-6007] (OracleAS TopLink - 10g (9.0.4) (Build 031126)): oracle.toplink.exceptions.QueryException
Exception Description: Missing descriptor for [class edu.cornell.finsys.datamodel.AccountDTO].
Query: ReadObjectQuery(edu.cornell.finsys.datamodel.AccountDTO)

Я проверил, что файл отображения верхней ссылки был загружен tomcat, и AccountDTO отображается в файле. Чтобы проверить это еще раз, я переместил файл сопоставления и получил совершенно другую ошибку во время загрузки. Я знаю, что сопоставление файлов правильное, так как оно правильно работало на старом сервере. Я не знаю, что еще может быть причиной исключения toplink. Для получения дополнительной информации я использую версию tomcat 6.0.37, версию Java 1.6.0_45, версию верхней ссылки 9.0.4.031126.

Есть идеи?


person Jay    schedule 20.12.2013    source источник
comment
Используете ли вы AccountDTO в качестве аннотированного объекта JPA на уровне сохраняемости?   -  person David Lakatos    schedule 20.12.2013
comment
Нет, в этом приложении нет JPA, AccountDTO — это базовый POJO.   -  person Jay    schedule 20.12.2013
comment
Я не понимаю. Какова цель TopLink, если он не является реализацией интерфейса диспетчера сущностей? Извините, если вопрос глупый...   -  person David Lakatos    schedule 20.12.2013
comment
Toplink — это технология ORM, которая сопоставляет элементы Java с таблицами/полями базы данных. Это было довольно мило в это день.   -  person Jay    schedule 20.12.2013


Ответы (1)


Это может быть он; прямо из Металинка:

Причина:

Это проблема с загрузкой файла session.xml один раз, когда приложение было впервые развернуто с помощью загрузчика классов этого приложения, а затем не перезагрузить сеанс, когда приложение было повторно развернуто и был создан новый XMLContext. Это заставило нас попытаться использовать сеанс, который был загружен другим загрузчиком классов, отличным от текущего приложения.

Возможное решение:

Проблема возникает, когда TopLink является частью основного пути к классам (например, каталог Applib, а не хранится в файле ear). Когда это происходит, у статического SessionManager возникают проблемы с поиском дескрипторов при втором и последующих развертываниях приложения. В основном дескрипторы индексируются по классам. При повторном развертывании приложения классы, используемые для индексации, выгружаются, и появляются новые версии этих классов. Это вызывает исключения «Дескриптор не найден».

Возможные обходные пути

  1. Поместите файл toplink.jar в ухо.

  2. Напишите код для ручной очистки, когда приложение toplink снесено.

  3. Для определенных архитектур они могут использовать версию sessionManager.getSession(), которая позволяет обновлять сеанс.

Обходной путь 3 является лучшим и очень осуществимым. Сеанс должен быть лениво получен из SessionManager и храниться в переменной кода приложения. Когда приложение будет перезапущено, его дескриптор сеанса TopLink будет нулевым. Затем сеанс можно получить из SesssionManager с помощью API getSession(XMLLoader xmlLoader, String sessionName, ClassLoader objectClassLoader, boolean shouldLoginSession, boolean shouldRefreshSession) с параметром shouldRefreshSession, для которого задано значение true. Это гарантирует, что старый сеанс (если он есть) выйдет из системы и будет удален из SessionManager перед созданием нового.

Помог ли какой-нибудь обходной путь?

person David Lakatos    schedule 20.12.2013
comment
Я не видел этого в своих поисках, спасибо, я попробую, когда вернусь с перерыва. - person Jay; 22.12.2013