ojdbc14.jar与ojdbc6.jar

时间:2010-07-09 03:39:28

标签: java oracle jdbc

我注意到以下差异,但没有看到它记录在任何地方。我想知道其他人是否注意到同样的事情,或者可以指出一些证明相同的文件。

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 个答案:

答案 0 :(得分:37)

这些驱动程序名称中的“14”和“6”指的是它们为其编写的JVM。如果您仍在使用JDK 1.4,我会说您遇到了严重问题,需要升级。 JDK 1.4早已超过其有用的支持寿命。它甚至没有泛型! JDK 6 u21是Oracle / Sun目前的生产标准。如果你还没有,我建议你改用它。

答案 1 :(得分:26)

实际上, ojdbc14.jar 并没有真正说明驱动程序的真实版本(请参阅JDBC Driver Downloads),除了它早于Oracle 11g。在这种情况下,您应该提供确切的版本。

无论如何,我想你会在What is going on with DATE and TIMESTAMP?中找到一些解释。简而言之,他们改变了9.2驱动程序中的行为,然后又改变了11.1驱动程序中的行为。

这可以解释您遇到的差异(我建议使用最新版本,即11.2驱动程序)。

答案 2 :(得分:10)

我有同样的问题!

在oracle网站上找到以下内容 link text

如上所述,默认情况下,11.1驱动程序在从数据库读取时将SQL DATE转换为Timestamp。这总是正确的做法,9i的变化是一个错误。 11.1驱动程序已恢复正常行为。即使您没有在应用程序中设置V8Compatible,在大多数情况下也不应该看到任何行为上的差异。如果使用getObject读取DATE列,您可能会注意到不同之处。结果将是时间戳而不是日期。由于Timestamp是Date的子类,因此这通常不是问题。您可能会注意到的区别在于,您是否依赖于从DATE到Date的转换来截断时间组件,或者您是否对值进行了toString。否则,改变应该是透明的。

如果由于某种原因,您的应用对此更改非常敏感,并且您只需要具有9i-10g行为,则可以设置连接属性。将mapDateToTimestamp设置为false,驱动程序将恢复为默认的9i-10g行为,并将DATE映射到Date。

答案 3 :(得分:1)

此外,从ojdbc14到ojdbc6,有几种类型(例如OracleResultSetOracleStatement)已从包oracle.jdbc.driver移至oracle.jdbc