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
Ответы
Ответ 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
.