2013-12-20 1 views
0

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

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) 

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

Любые идеи?

+0

Используете ли вы учетную запись AccountTO как JPA-аннотированную сущность на уровне сохранения? –

+0

Нет, нет JPA в этом приложении, AccountDTO является базовым POJO – Jay

+0

. Я не понимаю. Какова цель TopLink, если не является реализацией интерфейса менеджера сущностей? Извините, если вопрос глупо ... –

ответ

1

Возможно, это так; прямо из Металинк:

Причина:

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

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

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

Потенциальные Обходные

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

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

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

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

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

+0

Я не видел этого в моих поисках, спасибо, я попробую, когда вернусь с перерыва. – Jay