ojdbc14.jar против ojdbc6.jar - PullRequest
31 голосов
/ 09 июля 2010

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

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

Ответы [ 4 ]

37 голосов
/ 09 июля 2010

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

26 голосов
/ 09 июля 2010

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

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

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

10 голосов
/ 21 января 2011

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

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

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

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

1 голос
/ 20 сентября 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...