Подтвердить что ты не робот

Ojdbc14.jar против ojdbc6.jar

Я заметил следующую разницу, но нигде не видел документально. Мне интересно, заметили ли другие то же самое или могут указать на некоторые документы, которые доказывают то же самое.

Env: -

Oracle 11g, JDK 1.6, iBatis, PL/SQL

Сценарий: -

ojdbc14.jar: если pl/sql возвращает переменную типа DATE, и я пытаюсь поместить ее в переменную java.sql.Date, тогда все работает нормально. Пример:

Date annualDate = (Date) map.get("exam_date");

ojdbc6.jar: если pl/sql возвращает переменную типа DATE, и я пытаюсь поместить ее в переменную java.sql.Date, то получаю исключение:

java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
4b9b3361

Ответ 1

Собственно, ojdbc14.jar ничего не говорит о реальной версии драйвера (см. Загрузка драйверов JDBC), за исключением того, что он предшествует Oracle 11g. В такой ситуации вы должны предоставить точную версию.

В любом случае, я думаю, вы найдете какое-то объяснение в Что происходит с DATE и TIMESTAMP? Короче говоря, они изменили поведение в 9.2, а затем снова в 11.1 драйверах.

Это может объяснить различия, которые вы испытываете (и я предлагаю использовать самую последнюю версию, то есть драйверы 11.2).

Ответ 2

"14" и "6" в именах драйверов относятся к JVM, для которых они были написаны. Если вы все еще используете JDK 1.4, я бы сказал, что у вас есть серьезная проблема и вам нужно обновить. JDK 1.4 уже давно полезен для поддержки. У него даже не было дженериков! JDK 6 u21 - это текущий производственный стандарт от Oracle/Sun. Я бы рекомендовал переключиться на него, если вы еще этого не сделали.

Ответ 3

У меня такая же проблема!

Найдено в оракуле текст ссылки

Как упоминалось выше, драйверы 11.1 по умолчанию конвертируют SQL DATE в Timestamp при чтении из базы данных. Это всегда было правильным делом, и изменение в 9i было ошибкой. Драйверы 11.1 вернулись к правильному поведению. Даже если вы не установили V8Compatible в своем приложении, вы не должны видеть различий в поведении в большинстве случаев. Вы можете заметить разницу, если вы используете getObject для чтения столбца DATE. Результатом будет Timestamp, а не Date. Поскольку Timestamp является подклассом Date, это обычно не проблема. Если вы заметили, что разница заключается в том, что вы полагались на преобразование из DATE в Date, чтобы усечь компонент времени, или если вы делаете toString по значению. В противном случае изменение должно быть прозрачным.

Если по какой-то причине ваше приложение очень чувствительно к этому изменению, и вы просто должны иметь поведение 9i-10g, есть свойство соединения, которое вы можете установить. Установите mapDateToTimestamp в false, и драйвер вернется к поведению 9i-10g по умолчанию и карте DATE в Date.

Ответ 4

Кроме того, из ojdbc14 в ojdbc6 несколько типов (например, OracleResultSet, OracleStatement) переместились из пакета oracle.jdbc.driver в oracle.jdbc.