2010-07-09 20 views
27

Ich bemerkte den folgenden Unterschied, aber sah es nirgendwo dokumentiert. Ich frage mich, ob andere das Gleiche bemerkt haben oder mich auf einige Dokumentationen verweisen können, die dasselbe beweisen.ojdbc14.jar vs ojdbc6.jar

Env: -

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

Szenario: -

ojdbc14.jar: wenn PL/SQL gibt eine Variable vom Typ DATE und ich versuche, dass in einem java.sql zu setzen .Date Variable dann funktioniert alles gut. Beispiel:

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

ojdbc6.jar: wenn PL/SQL eine Variable vom Typ gibt DATE und ich versuche, das dann in einer java.sql.Date Variable zu setzen erhalte ich eine Ausnahme:

java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date 
+0

Können Sie getDate ('exam_date') nicht auf dem result_set aufrufen, und erhalten Sie ein richtiges Datum und keinen Zeitstempel? – bwawok

+0

Ich habe nach dem Upgrade von ojdbc14 auf ojdbc6 einen ähnlichen Problemtyp. Ich würde wirklich schätzen, wenn jemand in dieses Problem schauen und mir eine Antwort https://stackoverflow.com/questions/46543694/object-deserialization-failure-in-ojdbc14-to-ojdbc6-upgrade –

Antwort

23

eigentlich ojdbc14.jar sagt nicht wirklich etwas über die reale Version des Treibers (siehe JDBC Driver Downloads), mit der Ausnahme, dass es Oracle 11g früher. In einer solchen Situation sollten Sie die genaue Version angeben.

Wie auch immer, ich denke, Sie finden eine Erklärung in What is going on with DATE and TIMESTAMP? Kurz gesagt, änderten sie das Verhalten in 9.2 Treibern und dann wieder in 11.1 Treiber.

Dies könnte erklären, die Unterschiede, die Sie erleben (und ich empfehle die Verwendung der neuesten Version, d. H. Die 11.2 Treiber).

34

Die "14" und "6" in diesen Treibernamen beziehen sich auf die JVM, für die sie geschrieben wurden. Wenn Sie immer noch JDK 1.4 verwenden, würde ich sagen, dass Sie ein ernstes Problem haben und aktualisieren müssen. JDK 1.4 ist längst nicht mehr in der Lage, das Leben zu unterstützen. Es hatte nicht einmal Generika! JDK 6 u21 ist der aktuelle Produktionsstandard von Oracle/Sun. Ich würde empfehlen, zu ihr zu wechseln, wenn Sie es nicht schon getan haben.

+0

zur Verfügung stellen könnte, die ich verwende jdk 1.6 – Omnipresent

+4

JDK 6 hat auch das Ende seiner Lebensdauer erreicht. Der aktuelle Standard ist JDK 7. – duffymo

+0

@duffymo Er sagte, dass 4 Jahre zuvor, zu der Zeit, hatte er Recht (ich sage das zu Beginn der Java8-Ära). – peterh

9

Ich habe das gleiche Problem!

folgend in Orakelstätte gefunden link text

Wie oben erwähnt, Zeitstempel- der 11.1-Treiber standardmäßig konvertieren SQL DATE, wenn aus der Datenbank zu lesen. Das war immer das Richtige und der Wechsel in 9i war ein Fehler. Die 11.1-Treiber haben das korrekte Verhalten wiederhergestellt. Auch wenn Sie V8Compatible in Ihrer Anwendung nicht gesetzt haben, sollten Sie in den meisten Fällen keinen Unterschied im Verhalten sehen. Möglicherweise bemerken Sie einen Unterschied, wenn Sie getObject zum Lesen einer DATE-Spalte verwenden. Das Ergebnis ist ein Timestamp und kein Datum. Da Timestamp eine Unterklasse von Date ist, ist dies im Allgemeinen kein Problem. Wo Sie einen Unterschied feststellen können, ist, wenn Sie sich auf die Konvertierung von DATE nach Date verlassen haben, um die Zeitkomponente zu verkürzen oder wenn Sie toString für den Wert verwenden. Ansonsten sollte die Änderung transparent sein.

Wenn Ihre App aus irgendeinem Grund sehr empfindlich auf diese Änderung reagiert und Sie müssen einfach das 9i-10g-Verhalten haben, gibt es eine Verbindungseigenschaft, die Sie festlegen können. Setzen Sie mapDateToTimestamp auf false und der Treiber kehrt zum Standardverhalten von 9i-10g zurück und ordnet DATE to Date zu.

0

Auch aus ojdbc14 ojdbc6, verschiedene Arten (z.B. OracleResultSet, OracleStatement) bewegte sich von Paket zu oracle.jdbc.driveroracle.jdbc.

Verwandte Themen