В рамках модернизации JRun мы переходим с 1.4 JVM на 1.6 JVM. Теперь я получаю действительно странную ошибку oracle db: «OALL8 находится в несовместимом состоянии». Я установил проблему, чтобы вставить запросы, которые вообще не используют переменные связывания - все встроенные параметры. Если я запускаю запрос без каких-либо переменных связывания, я получаю вышеуказанную ошибку. Как только я заменяю одно из жестко закодированных значений на переменную связывания - все работает без ошибок.
Другой странный момент заключается в том, что после выполнения запроса он фактически передается в базу данных. Я могу подключиться из другого сеанса и увидеть вставленную строку. Я попытался обернуть запрос в транзакцию, и он, кажется, завершился успешно, поскольку поведение не изменилось по сравнению с запросом без явной транзакции.
Вот соответствующие данные:
Java версия: 1.6.0_12-b04
Версия виртуальной машины: 11.2-b01 (сервер HotSpot)
Сервер Oracle: 10.2.0.4
Клиент Oracle: с 11.1.0.7.0 по ojdbc6.jar
Обновление: Я использую cfqueryparam - они называются переменными связывания в мире оракулов. Хотя это и решает насущную проблему, у нас есть довольно большая устаревшая кодовая база, которую мы не можем реально пройти через все, чтобы обновить запросы в рамках обновления с CF7 до CF8.
Несмотря на то, что я определил одну конкретную ситуацию, которая не удалась (и инкапсулировал ее в тесте mxunit), это не означает, что нет других областей, где это может быть проблемой. Я действительно хотел бы иметь решение, которое устраняет ошибку OALL8, а не кодирует ее.
Обновление 2: После проверки с нашим администратором базы данных он установил для параметра CURSOR_SHARING значение SIMILAR. По умолчанию Oracle - ТОЧНО. Происходит следующее: когда ColdFusion передает запрос на выполнение, Oracle превращает все литеральные значения в связывающие переменные, и это, похоже, сбивает с толку ColdFusion. Возвращение параметра к EXACT позволяет буквальным запросам работать нормально.
Обновление 3: Oracle наконец-то выпустила нам внеполосный патч для JDBC. Это было идентифицировано как ошибка JDBC. Последние драйверы должны включать его, когда они наконец обновляются. Если у вас есть поддержка, вы также можете запросить патч через систему TAR.