Weblogic 10.3, JDBC, Oracle, SQL — таблица или представление не существуют

У меня действительно странная проблема, которую я не смог найти в Google.

Это началось без каких-либо изменений в БД, настройках подключения, коде и т.д.

Проблема в том, что при доступе к сервлету один из EJB выполняет прямой вызов SQL, очень просто

"select \n" +
" value, \n" +
" other_value \n" +
" from \n" +
" some_table \n" +
" where some_condition = ? "

Это явно не прямой SQL, но довольно близко. По какой-то причине это начало возвращать ошибку «ORA-00942: таблица или представление не существует».

Таблица существует, и проблема в том, что если я подключаюсь к отладчику, изменяю пробел или что-то незначительное (не меняя сам запрос) в запросе и внедряю изменение в горячем режиме, все работает нормально. Я не первый раз сталкиваюсь с этим. Кажется, это происходит только в среде разработки (еще не видел этого в тестировании, песочнице или производстве), не всегда воспроизводимо и сводит меня с ума.

Под не всегда воспроизводимым я подразумеваю, что иногда чистая сборка и повторное развертывание иногда решают проблему, но не всегда. Это не всегда одна и та же таблица (хотя, если возникает ошибка, она продолжается с тем же запросом).

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


person shelfoo    schedule 07.04.2010    source источник
comment
Два вопроса: 1) Какая версия Oracle 2) Есть ли в средах разработки несколько схем, каждая из которых содержит таблицу с тем же именем.   -  person dpbradley    schedule 07.04.2010
comment
Oracle 11g (11.2.0.1.0) и нет, одиночная схема   -  person shelfoo    schedule 07.04.2010
comment
Ну, вот моя идея - у нас была проблема в среде разработки 10g, где несколько схем будут иметь копию одной и той же таблицы, и у нас была прерывистая проблема, подобная вашей. То, что происходило, можно было бы в общем описать как ошибку Oracle, когда одна схема пыталась выполнить SQL для объекта другой схемы с тем же именем, когда SQL был найден в общем пуле. Обновление версии Oracle (забудьте, какое) в конечном итоге исправило это, но до этого мы просто периодически очищали общий пул. Я полагаю, что это также решит вашу проблему - попробуйте в следующий раз, когда это произойдет.   -  person dpbradley    schedule 07.04.2010
comment
Круто, спасибо за информацию. Я попробую, когда это произойдет снова.   -  person shelfoo    schedule 07.04.2010


Ответы (1)


Похоже, что у одного соединения в вашем пуле JDBC есть проблема, которая может объяснить прерывистый характер, и что повторное развертывание только иногда исправляет это, поскольку впоследствии вы можете по-прежнему использовать одно и то же соединение. Возможно, вы можете попробовать сбросить пул соединений вместо повторного развертывания. (java weblogic.Admin -url t3://<server_url> RESET_POOL <pool_name>, кажется)

Вы сказали, что существует только одна схема, но означает ли это, что существует только одна схема или что все таблицы находятся в одной схеме? Возможно ли, что вы где-то выполняете ALTER SESSION SET CURRENT_SCHEMA, и когда любое соединение, которое было создано, возвращается в пул, а затем случайным образом используется для запроса позже, оно больше ничего не видит в основной схеме? Это может произойти в пакете или триггере, а также на стороне Java, и может быть «временным» изменением, которое не отменяется после исключения. Похоже, что-то, что может существовать только в среде разработки...

person Alex Poole    schedule 08.04.2010
comment
Спасибо, я попробую пул сброса в следующий раз, когда это произойдет, и посмотрю, решит ли это проблему. Я не думаю, что происходит какое-либо изменение сеанса, но это возможно. Ошибка, когда она возникает, обычно видна почти сразу после запуска приложения, поэтому я не думаю, что это все, а что-то еще, что нужно исследовать наверняка. - person shelfoo; 08.04.2010